Доброго времени суток кто читает данную тему. Сидел я и думал как бы выучить мне DS18B20 с 74HC595 и пришла мысль использовать ATTiny13A. Это все чисто для обучения! Написал программу, семисегментник работает нормально. Но вот общение с DS18B20 перешло в стадию нецензурной лексики В общем привожу код С++: | Код | #define F_CPU 1200000UL
#include <util/delay.h> #include <avr/io.h>
#define CLOCK (1 << PINB2) #define DATA (1 << PINB0) #define LATCH (1 << PINB1) #define DQ_DATA (1 << PINB4)
#define SwitchIn(x) (DDRB &= ~(x)) #define SwitchOut(x) (DDRB |= x)
#define SetPORTLow(x) (PORTB &= ~(x)) #define SetPORTHigh(x) (PORTB |= x)
#define ReadPIN(x) (PINB & x)
#define EMPTY 10 #define DASH 11 #define letter_n 12 #define letter_o 0 #define letter_k 13 #define letter_e 14 #define letter_r 15
unsigned char number[16] = { 126, 48, 109, 121, 51, 91, 95, 112, 255, 123, 0, 1, 21, 87, 79, 5 };
void DisplayNumber(signed char c, signed char b, signed char a); void InitSeg( ); void FirstInitTH( ); void InitTH( ); void WriteByte( unsigned char data ); unsigned char ReadByte( ); unsigned char ConvertTemp(unsigned char first, unsigned char second);
int main(void) { InitSeg( ); FirstInitTH( ); while(1) { InitTH( ); WriteByte( 0xCC ); WriteByte( 0x44 ); SwitchIn(DQ_DATA); SetPORTHigh(DQ_DATA); unsigned char x = ReadPIN(DQ_DATA); while( x == 0 ) { x = ReadPIN(DQ_DATA); DisplayNumber(number[EMPTY], number[letter_o], number[letter_n]); _delay_ms(1000); }
InitTH( ); WriteByte( 0xCC ); WriteByte( 0xBE ); unsigned char data[3] = { 0, 0, 0 }; data[0] = ReadByte( ); data[1] = ReadByte( ); _delay_ms(200); data[2] = ConvertTemp(data[0], data[1]); //data[2] = 132; unsigned char a, b, c; a = data[2] / 100; b = (data[2] % 100) / 10; c = data[2] % 10; if ( a == 0 ) a = EMPTY; if ( a == EMPTY && b == 0 ) b = EMPTY; DisplayNumber(number[a],number[b],number[c]); _delay_ms(5000); } }
void InitSeg( ) { SwitchOut(CLOCK | DATA | LATCH); SetPORTLow(CLOCK | DATA | LATCH); DisplayNumber(number[EMPTY], number[letter_o], number[letter_n]); _delay_ms(1500); }
void DisplayNumber(signed char c, signed char b, signed char a) { SetPORTLow(CLOCK | DATA | LATCH); unsigned char i, j, k; for (i = 0; i < 8; i++) { if ((a & (1 << i)) != 0) SetPORTHigh(DATA); else SetPORTLow(DATA); SetPORTHigh(CLOCK); SetPORTLow(CLOCK); }
for (j = 0; j < 8; j++) { if ((b & (1 << j)) != 0) SetPORTHigh(DATA); else SetPORTLow(DATA); SetPORTHigh(CLOCK); SetPORTLow(CLOCK); }
for (k = 0; k < 8; k++) { if ((c & (1 << k)) != 0) SetPORTHigh(DATA); else SetPORTLow(DATA); SetPORTHigh(CLOCK); SetPORTLow(CLOCK); }
SetPORTHigh(LATCH); SetPORTLow(LATCH); SetPORTLow(CLOCK | DATA | LATCH); }
void FirstInitTH( ) { SwitchOut(DQ_DATA); SetPORTLow(DQ_DATA); _delay_us(500); SwitchIn(DQ_DATA); SetPORTHigh(DQ_DATA); _delay_us(65); if ( ReadPIN(DQ_DATA) !=0 ) DisplayNumber(number[letter_e], number[letter_r], number[letter_r]); else DisplayNumber(number[EMPTY], number[letter_o], number[letter_k]); _delay_ms(1500); }
void InitTH( ) { SwitchOut(DQ_DATA); SetPORTLow(DQ_DATA); _delay_us(500); SwitchIn(DQ_DATA); SetPORTHigh(DQ_DATA); _delay_us(500); }
void WriteByte( unsigned char data ) { unsigned char i; SwitchOut(DQ_DATA); for ( i = 0; i < 8; i++) { SetPORTLow(DQ_DATA); _delay_us(2); if ( (data & (1 << i)) != 0 ) SetPORTHigh(DQ_DATA); else SetPORTLow(DQ_DATA); _delay_us(60); SetPORTHigh(DQ_DATA); _delay_us(2); } }
unsigned char ReadByte( ) { unsigned char data = 0, i; for ( i = 0; i < 8; i++) { SwitchOut(DQ_DATA); SetPORTLow(DQ_DATA); _delay_us(2); SwitchIn(DQ_DATA); SetPORTHigh(DQ_DATA); _delay_us(5); if ( (ReadPIN(DQ_DATA)) != 0 ) data |= ( 1 << i ); else data &= ~( 1 << i );
_delay_us(60); } return data; }
unsigned char ConvertTemp(unsigned char first, unsigned char second) { unsigned char result = 0, i, j; for ( i = 4; i < 8; i++) { if ( (first & (1 << i)) != 0) result |= ( 1<<(i-4) ); else result &= ~( 1<<(i-4) ); } for ( j = 0; j < 4; j++) { if ( (second & (1 << j)) != 0 ) result |= ( 1<<(j+4) ); else result &= ~( 1<<(j+4) ); } return result; }
|
Прошу строго не пинать, но подскажите где ошибка. DS18B20 реагирует на импульс сброса и подает ответ присутствия. А дальше ничего не работает :( Есть подозрение что ошибка в отправке битов. Т.к. до данного участка уже не работает(хотя должен "занулить" линию во время конвертации): | Код | while( x == 0 ) { x = ReadPIN(DQ_DATA); DisplayNumber(number[EMPTY], number[letter_o], number[letter_n]); _delay_ms(1000); }
|
Прошу помощи
|