Она не хочет читать температуру с ds1820. Вот код программы:
Код: Выделить всё
/*****************************************************
Chip type : ATmega16
Program type : Application
Clock frequency : 8,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega16.h>
#include <delay.h>
#asm
.equ __w1_port=0x18 ;PORTB
.equ __w1_bit=0
#endasm
#include <1wire.h>
#include <ds1820.h>
flash char buf[24] = { // массив с цифрами
//ABCDEFGH
0b00000011, //0
0b10011111, //1
0b00100101, //2
0b00001101, //3
0b10011001, //4
0b01001001, //5
0b01000001, //6
0b00011111, //7
0b00000001, //8
0b00001001, //9
0b00111001, //°
0b11111101, //-
0b11111111, //
0b00000010, //0.
0b10011110, //1.
0b00100100, //2.
0b00001100, //3.
0b10011000, //4.
0b01001000, //5.
0b01000000, //6.
0b00011110, //7.
0b00000000, //8.
0b00001000, //9.
0b00111000 //°.
};
int digit_out[8], cur_dig;
int temp, t, devices;
int d1=0, d2=0, d3=0, d4=0, d5=0, d6=0, d7=0, d8=0;
void tem(void)
{
if(devices>0){
temp=ds1820_temperature_10(0);
temp=temp/10;
if(temp>1000){
teьз=temp-4096;
d1=11;
}else{
d1=12;
}
d2=temp/10;
d3=temp%10;
d4=23;
}
}
void hc164_wr(unsigned char dig1, unsigned char dig2){ //подпрограмма вывода данных в регистр
unsigned char a;
for(a=0; a<8; a++){ //цикл для вывода 8 бит данных из массива
PORTD.1=buf[dig1] & 1<<a; //выводим в линию DATA1 текущий бит
PORTD.0=buf[dig2] & 1<<a; //выводим в линию DATA2 текущий бит
PORTD.2=0; //опускаем линию CLK в лог.0
PORTD.2=1; //поднимаем линию CLK в лог.1
}
}
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
t++;
digit_out[0]=d1;
digit_out[1]=d2;
digit_out[2]=d3;
digit_out[3]=d4;
digit_out[4]=d5;
digit_out[5]=d6;
digit_out[6]=d7;
digit_out[7]=d8;
switch (cur_dig){
case 0: PORTC=0; hc164_wr(digit_out[cur_dig], digit_out[cur_dig+4]); PORTC=0b00010001; break;
case 1: PORTC=0; hc164_wr(digit_out[cur_dig], digit_out[cur_dig+4]); PORTC=0b00100010; break;
case 2: PORTC=0; hc164_wr(digit_out[cur_dig], digit_out[cur_dig+4]); PORTC=0b01000100; break;
case 3: PORTC=0; hc164_wr(digit_out[cur_dig], digit_out[cur_dig+4]); PORTC=0b10001000; break;
}
cur_dig++;
if(cur_dig>3){cur_dig=0;}
}
void main(void)
{
PORTA=0x00; DDRA=0x00;
PORTB=0x00; DDRB=0x00;
PORTC=0x00; DDRC=0xFF;
PORTD=0x00; DDRD=0x07;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0x00;
TCCR1B=0x0B;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0xFA;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
MCUCSR=0x00;
TIMSK=0x10;
ACSR=0x80;
SFIOR=0x00;
devices=w1_init();
#asm("sei")
while (1)
{
if(t>=500){tem(); t=0;} // Читаем температуру раз в секунду
};
}
Все время светится 85 или что-то непонятное, в протеусе все работает нормально. Без 74HC164, тоже работало нормально. Если вызов функции чтения температуры из цикла перенести в таймер, то чтение происходит нормально, но индикация пропадает