Код
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <util/delay.h>
#include "DS18B20.h"
void DS18B20_Reset(void);
void DS18B20_Write0(void);
void DS18B20_Write1(void);
void DS18B20_WriteByte(char cByte);
static unsigned char DS18B20_ReadByte(void);
void USART_vInit(void);
void USART_vSetUBBR(char cUBBRVal,char bDelay);
void USART_vSendByte(char u8Data);
static unsigned char OWByte(unsigned char b);
static unsigned char OWReset(void);
int main(void) {
USART_vInit();
DS18B20_Reset();
DS18B20_WriteByte(0x33);
unsigned char c1,c2,c3,c4,c5,c6,c7,c8;
c1=DS18B20_ReadByte();
c2=DS18B20_ReadByte();
c3=DS18B20_ReadByte();
c4=DS18B20_ReadByte();
c5=DS18B20_ReadByte();
c6=DS18B20_ReadByte();
c7=DS18B20_ReadByte();
c8=DS18B20_ReadByte();
USART_vSetUBBR(25,1);
USART_vSendByte(c1);
USART_vSendByte(c2);
USART_vSendByte(c3);
USART_vSendByte(c4);
USART_vSendByte(c5);
USART_vSendByte(c6);
USART_vSendByte(c7);
USART_vSendByte(c8);
USART_vSetUBBR(1,1);
while (1);
return 0;
}
void DS18B20_Reset(void) {
USART_vSetUBBR(25,0);
USART_vSendByte(0xF0);
_delay_ms(1);
while (!(UCSRA&(1<<TXC)));
while (!(UCSRA&(1<<RXC)));
USART_vSetUBBR(1,1);
}
void DS18B20_Write0(void) {
USART_vSendByte(0x00);
}
void DS18B20_Write1(void) {
USART_vSendByte(0xFF);
}
void DS18B20_WriteByte(char cByte) {
for (char i=0;i<8;i++) {
if (cByte%2) DS18B20_Write1();
else DS18B20_Write0();
cByte=cByte/2;
}
_delay_ms(1);
}
static unsigned char DS18B20_ReadByte(void) {
unsigned char cByte=0;
for (char i=0;i<8;i++) {
UDR=0xFF;
UCSRA=(1<<TXC);
while(!(UCSRA&(1<<TXC)));
cByte>>=1;
if (UDR>0xFE) cByte|=128;
}
return cByte&255;
}
void USART_vInit(void) {
USART_vSetUBBR(1,0);
UCSRC = (1<<URSEL)|(0<<USBS)|(3<<UCSZ0);
UCSRB = (1<<RXEN)|(1<<TXEN);
}
void USART_vSetUBBR(char cUBBRVal,char bDelay) {
if (bDelay) {
_delay_ms(1);
while (!(UCSRA&(1<<TXC)));
}
UBRRH = 0;
UBRRL = cUBBRVal; // 1-115200, 25-9600
}
void USART_vSendByte(char u8Data) {
while (!(UCSRA&(1<<UDRE)));
UDR = u8Data;
}
#include <avr/signal.h>
#include <util/delay.h>
#include "DS18B20.h"
void DS18B20_Reset(void);
void DS18B20_Write0(void);
void DS18B20_Write1(void);
void DS18B20_WriteByte(char cByte);
static unsigned char DS18B20_ReadByte(void);
void USART_vInit(void);
void USART_vSetUBBR(char cUBBRVal,char bDelay);
void USART_vSendByte(char u8Data);
static unsigned char OWByte(unsigned char b);
static unsigned char OWReset(void);
int main(void) {
USART_vInit();
DS18B20_Reset();
DS18B20_WriteByte(0x33);
unsigned char c1,c2,c3,c4,c5,c6,c7,c8;
c1=DS18B20_ReadByte();
c2=DS18B20_ReadByte();
c3=DS18B20_ReadByte();
c4=DS18B20_ReadByte();
c5=DS18B20_ReadByte();
c6=DS18B20_ReadByte();
c7=DS18B20_ReadByte();
c8=DS18B20_ReadByte();
USART_vSetUBBR(25,1);
USART_vSendByte(c1);
USART_vSendByte(c2);
USART_vSendByte(c3);
USART_vSendByte(c4);
USART_vSendByte(c5);
USART_vSendByte(c6);
USART_vSendByte(c7);
USART_vSendByte(c8);
USART_vSetUBBR(1,1);
while (1);
return 0;
}
void DS18B20_Reset(void) {
USART_vSetUBBR(25,0);
USART_vSendByte(0xF0);
_delay_ms(1);
while (!(UCSRA&(1<<TXC)));
while (!(UCSRA&(1<<RXC)));
USART_vSetUBBR(1,1);
}
void DS18B20_Write0(void) {
USART_vSendByte(0x00);
}
void DS18B20_Write1(void) {
USART_vSendByte(0xFF);
}
void DS18B20_WriteByte(char cByte) {
for (char i=0;i<8;i++) {
if (cByte%2) DS18B20_Write1();
else DS18B20_Write0();
cByte=cByte/2;
}
_delay_ms(1);
}
static unsigned char DS18B20_ReadByte(void) {
unsigned char cByte=0;
for (char i=0;i<8;i++) {
UDR=0xFF;
UCSRA=(1<<TXC);
while(!(UCSRA&(1<<TXC)));
cByte>>=1;
if (UDR>0xFE) cByte|=128;
}
return cByte&255;
}
void USART_vInit(void) {
USART_vSetUBBR(1,0);
UCSRC = (1<<URSEL)|(0<<USBS)|(3<<UCSZ0);
UCSRB = (1<<RXEN)|(1<<TXEN);
}
void USART_vSetUBBR(char cUBBRVal,char bDelay) {
if (bDelay) {
_delay_ms(1);
while (!(UCSRA&(1<<TXC)));
}
UBRRH = 0;
UBRRL = cUBBRVal; // 1-115200, 25-9600
}
void USART_vSendByte(char u8Data) {
while (!(UCSRA&(1<<UDRE)));
UDR = u8Data;
}
Сигнал RESET проходит и в ответ приходит 0xE0 - вроде бы как и надо, хотя при подключениии второго устройства приходит тоже самое, что, по идее, противоречит appnote'у.
Проверил датчик на работу с командой 0x33 (чтение адреса устройства), в ответ получил неверный адрес:
__реальный: FC 28 00 00 00 00 00 11 (получен с помощью программной реализации 1-Wire - работает нормально)
__полученный: A2 F0 03 00 00 00 00 44
В чем может быть причина? Выполняется ли неверно чтение данных или до этого команда 0x33 неверно воспринимается датчиком? Спасибо.
Кварц: 4 МГц, резистор(между TXD и RXD (RXD-подключен напрямую к DQ)): 180 Ом.