DS18B20 + ATTiny13A + 74HC595 прошу помочь разобраться
Добавлено: Сб июл 19, 2014 23:36:03
Доброго времени суток кто читает данную тему.
Сидел я и думал как бы выучить мне DS18B20 с 74HC595 и пришла мысль использовать ATTiny13A.
Это все чисто для обучения!
Написал программу, семисегментник работает нормально. Но вот общение с DS18B20 перешло в стадию нецензурной лексики
В общем привожу код С++:
Прошу строго не пинать, но подскажите где ошибка. DS18B20 реагирует на импульс сброса и подает ответ присутствия. А дальше ничего не работает
Есть подозрение что ошибка в отправке битов.
Т.к. до данного участка уже не работает(хотя должен "занулить" линию во время конвертации): Прошу помощи 
На дисплее заветные "255" видно что термометр не реагирует на отправку байтов.
Сидел я и думал как бы выучить мне 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;
}Т.к. до данного участка уже не работает(хотя должен "занулить" линию во время конвертации):
Код: Выделить всё
while( x == 0 )
{
x = ReadPIN(DQ_DATA);
DisplayNumber(number[EMPTY], number[letter_o], number[letter_n]);
_delay_ms(1000);
}
На дисплее заветные "255" видно что термометр не реагирует на отправку байтов.