Если я виноват тыкните носом плиз
В общем делаю устройство читающее и выводящее температуру в Protuse 8,3sp2
если раскоментить строку 1 или 2 в мэйне то протеус начинает давать ошибку, о том, что он тормозит и индикатор не зажигается ни как !!??
короче при получении температуры чтото происходит неверное, а что не могу понять.


на этом скрине видно что появились "серые" сигналы, откуда не ясно.
Код: Выделить всё
#include <mega8.h>
#include <delay.h>
#include <ds18b20.h>
#define BTNPLS PIND.4
#define BTNMIN PIND.5
#define BTN12 PIND.6
#define BTNOnOff PIND.7
#define ten_1 PORTB.1
#define ten_2 PORTB.4
#define MAX_DS1820 2
// Инициализация ds1820 0x1B-PORTA; 0x18-PORTB; 0x15-PORTC
//#asm
// .equ __w1_port=0x18 ;PORTB
// .equ __w1_bit=0
//#endasm
unsigned char rom_codes[MAX_DS1820][9];
unsigned char devices;
typedef unsigned char byte;
typedef unsigned long ulong;
byte led_table[10]={0b00000011,0b10011111,0b00100101,0b00001101,0b10011001,0b01001001,0b01000001,0b00011111,0b00000001,0b00001001};
int show_data; //Отображаемая цифра
ulong dig_data=0;
byte dig_num=0; //Отображаемый разряд
int temp[2];
//функция обмена с SPI:
char spi_transfer(volatile char data)
{ SPDR = data; // Start the transmission
while (!(SPSR & (1<<SPIF))) // Wait the end of the transmission
{};
return SPDR;} // return the received byte
void GetTemp(short int i)
{
temp[i]=ds18b20_temperature(&rom_codes[i][0]);
}
//функция вывода на 7 сегментный индикатор
void show_dig() {
PORTB &= ~(1<<2);
if (dig_num==0)
{
dig_data=show_data; //Если показываем первую цифру обнавляем переменную
dig_num++;
}
spi_transfer(dig_num); //Отправляем байт для отображения разряда
spi_transfer(led_table[dig_data%10]); //Получаем разряд из dig_data и отправляем байт с цифрой
dig_data/=10;
dig_num<<=1; //Смещаем бит для отображения следующего разряда
PORTB |= (1<<2); // включаем
}
void main(void)
{
DDRB=(0<<DDB7) | (0<<DDB6) | (1<<DDB5) | (1<<DDB4) | (1<<DDB3) | (1<<DDB2) | (1<<DDB1) | (0<<DDB0);
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
DDRC=(0<<DDC6) | (1<<DDC5) | (1<<DDC4) | (1<<DDC3) | (1<<DDC2) | (1<<DDC1) | (1<<DDC0);
PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);
DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (1<<DDD3) | (0<<DDD2) | (1<<DDD1) | (0<<DDD0);
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (1<<PORTD0);
// SPI initialization
SPCR=(0<<SPIE) | (1<<SPE) | (1<<DORD) | (1<<MSTR) | (0<<CPOL) | (0<<CPHA) | (1<<SPR1) | (1<<SPR0);
#asm("sei")
//Ищем DS18b20
delay_ms(300);
devices = w1_search(0xf0,rom_codes);
while (1)
{
// //for (i=0; i<devices; i++) {GetTemp(i);}
1 // // GetTemp(1);
2 // temp[0]=ds18b20_temperature(&rom_codes[1][0]);
show_data=111; show_dig();
}
Прикладываю весь проект + протеус файл
Спасибо огромное за вашу помощь и время



