Объясните пожалуйста, я новичек и если что извиняйте за тупой вопрос.
У меня датчик техразрядный индикатор(использую 2 из разрадов). Написал прогу в CodeVisionAVR, все работает. Но прикол в том что иногда(часто но никакой закономерности) заместо значений выводится "88".
#include <mega8.h>
#include <delay.h>
#include <stdio.h>
// 1 Wire Bus interface functions
#include <1wire.h>
// DS1820 Temperature Sensor functions
#include <ds18b20.h>
//#asm //сообщаем куда подключён экран
// .equ __lcd_port=0x18
//#endasm
//#include <lcd.h>
#define A PORTB.6
#define B PORTB.2
#define C PORTB.0
#define D PORTD.6
#define E PORTD.5
#define F PORTB.7
#define G PORTB.1
#define H PORTD.7
#define D1 PORTB.5
#define D2 PORTB.4
#define D3 PORTB.3
#define D4 PORTC.1
#define MAX_DS18b20 8
unsigned char ds18b20_devices;
unsigned char ds18b20_rom_codes[MAX_DS18b20][9];
float temper;
int temper_int,temper_fl,min=0,temp[2],i;
flash int digits[11][8] = {{0,0,1,1,1,1,1,1}, //0
{0,0,0,0,0,1,1,0}, //1
{0,1,0,1,1,0,1,1}, //2
{0,1,0,0,1,1,1,1}, //3
{0,1,1,0,0,1,1,0}, //4
{0,1,1,0,1,1,0,1}, //5
{0,1,1,1,1,1,0,1}, //6
{0,0,0,0,0,1,1,1}, //7
{0,1,1,1,1,1,1,1}, //8
{0,1,1,0,1,1,1,1}, //9
{0,0,0,0,0,0,0,0}}; //пусто
interrupt [TIM1_OVF] void timer2_ovf_isr(void)
{
switch(i)
{
case 0:D3=1;
D1=0;
break;
case 1:D1=1;
D2=0;
break;
case 2:D2=1;
D3=0;
break;
};
if(i>0)
{
A=digits[temp[i-1]][7];
B=digits[temp[i-1]][6];
C=digits[temp[i-1]][5];
D=digits[temp[i-1]][4];
E=digits[temp[i-1]][3];
F=digits[temp[i-1]][2];
G=digits[temp[i-1]][1];
}
else
{
A=digits[10][7];
B=digits[10][6];
C=digits[10][5];
D=digits[10][4];
E=digits[10][3];
F=digits[10][2];
G=digits[10][1];
}
i++;
if(i==3) i=0;
TCNT1H=0xEC;
TCNT1L=0x77;
}
void temperature(void) // функция по работе с термо-датчиком
{
temper=ds18b20_temperature(&ds18b20_rom_codes[0][0]);
temper_int=temper; // отбор целой части от температуры
if(temper<0) // при отрицательной температуре
{
temper_fl=(temper-temper_int-0.0625)*10; // дробная часть
temper_int=-((temper_int*10)+temper_fl); // температура*10
min=1; // минус
}
else // при положительной
{
temper_fl=(temper-temper_int)*10; // дробная часть
temper_int=(temper_int*10)+temper_fl;// температура*10
min=0; // плюс
}
}
void main(void)
{
PORTB=0x00;
DDRB=0xFF;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0xFF;
TCCR0=0x02;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x02;
TCNT1H=0xEC;
TCNT1L=0x77;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
TIMSK=0x04;
UCSRB=0x00;
ACSR=0x80;
SFIOR=0x00;
SREG|=(1<<7);
ADCSRA=0x00;
SPCR=0x00;
TWCR=0x00;
w1_init();
ds18b20_devices=w1_search(0xf0,ds18b20_rom_codes);
ds18b20_init(0,-35,35,DS18B20_12BIT_RES);
while (1)
{
temperature();
temp[0]=temper_int/100;
temp[1]=(temper_int-temp[0]*100)/10;
}
}
Вот проект CodeVisionAVR и Proteus
proga.rar