Возникла проблемка со связкой DS18S20 и AtTity2313 в терморегуляторе.
Датчик висит на нулевом бите порта D.
Контроллер находит 1 датчик, но при получении температуры с него определяет температуру 127 (на изменение температуры не реагирует).
Пробовал менять датчик, результат тот же.
Скидываю частоту с 4х до 1мГц, датчик не заводится, температура - 25.
Однако в предыдущей конструкции все замечательно работало. Где собака порылась?
Код
Код: Выделить всё
/*****************************************************
Chip type : ATtiny2313
AVR Core Clock frequency: 4,000000 MHz
Memory model : Tiny
External RAM size : 0
Data Stack size : 32
*****************************************************/
#asm
.equ __w1_port=0x12 // PORTD
.equ __w1_bit=0 // нулевой бит
#endasm
#include <tiny2313.h>
#include <ds1820.h>
flash char buf[13] = {
0b01011111, //0
0b00010010, //1
0b00101111, //2
0b00111011, //3
0b01110010, //4
0b01111001, //5
0b01111101, //6
0b00010011, //7
0b01111111, //8
0b01111011, //9
0b00100000, //-
0b01101100, //t
0b01001101 //C
};
unsigned char rom_codes[1][9], t = 0, t0 = 0, t1 = 0, cd = 0, devices = 0;
void main(void)
{
// Declare your local variables here
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
PORTA=0x00;
DDRA=0xff;
PORTB=0x00;
DDRB=0xff;
PORTD=0x00;
DDRD =0xff;
// Timer/Counter 0 initialization
// Clock value: Timer 0 Stopped
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
// Timer/Counter 1 initialization
// Clock value: Timer1 Stopped
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
GIMSK=0x00;
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// Universal Serial Interface initialization
// Mode: Disabled
// Clock source: Register & Counter=no clk.
// USI Counter Overflow Interrupt: Off
USICR=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
devices = w1_search(0xf0, rom_codes);
#asm("sei");
while (1)
{
// не запрещаю прерывания, тк таймеры и ИНТы отключены
t = ds1820_temperature_10(&rom_codes[0][0])/10;
t0 = t / 10;
t1 = t % 10;
switch (cd){
case 0:{PORTD.4 = 1; PORTD.5 = 1; PORTD.6 = 1; PORTB = buf[t0]; PORTD.6 = 0; break;};
case 1:{PORTD.4 = 1; PORTD.5 = 1; PORTD.6 = 1; PORTB = buf[t1]; PORTD.5 = 0; break;};
}
cd++;
if (cd == 2) cd = 0;
};
}
