реклама на сайте
подробности

 
 
> UART->1-Wire, проблема с реализацией
Veg@
сообщение Nov 28 2009, 22:43
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 90
Регистрация: 16-09-09
Пользователь №: 52 416



Соединяю ATMega8 с датчиком DS18B20, используя UART. Изучив данный материал (appnote, форум) написал под WinAVR несколько процедур для работы:
Код
#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;
}

Сигнал 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 Ом.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Veg@   UART->1-Wire   Nov 28 2009, 22:43
- - Rst7   В портянке кода нет желания разбираться, но вот ре...   Nov 29 2009, 08:03
- - Laptop   Вроде все правильно. Времянки в бите порой сильно...   Nov 29 2009, 09:07
- - Veg@   ЦитатаВроде все правильно. Времянки в бите порой с...   Nov 29 2009, 09:59
- - ILYAUL   Цитата(Veg@ @ Nov 29 2009, 01:43) Сигнал ...   Nov 29 2009, 10:35
- - Veg@   ЦитатаЯ так понял у Вас два DS18 Нет ЦитатаСоединя...   Nov 29 2009, 11:54
- - Veg@   Цитата(Rst7 @ Nov 29 2009, 11:03) В портя...   Nov 29 2009, 16:37
|- - xemul   Цитата(Veg@ @ Nov 29 2009, 19:37) С резис...   Nov 29 2009, 20:03
- - Veg@   Еще вопрос: почему в appnote приведена схема подкл...   Nov 29 2009, 19:35
|- - ILYAUL   Цитата(Veg@ @ Nov 29 2009, 22:35) чем про...   Nov 29 2009, 20:20
- - Veg@   ЦитатаА где Вы нашли такое включение, резистора ме...   Nov 29 2009, 21:03
|- - xemul   Цитата(Veg@ @ Nov 30 2009, 00:03) тут TxD...   Nov 29 2009, 21:22
- - Veg@   Цитата(xemul @ Nov 30 2009, 00:22) TxD пр...   Nov 29 2009, 21:28
|- - Laptop   Цитата(Veg@ @ Nov 30 2009, 00:28) Наоборо...   Nov 30 2009, 01:43
- - xemul   Цитата(Veg@ @ Nov 30 2009, 00:28) Наоборо...   Nov 30 2009, 05:21
- - Rst7   ЦитатаХор поёт про случай без транзисторов по TxD?...   Nov 30 2009, 06:16
|- - xemul   Цитата(Rst7 @ Nov 30 2009, 09:16) Разве я...   Nov 30 2009, 09:11
- - Rst7   Цитатаимхо, при суммарной ёмкости шины 100-150 pF ...   Nov 30 2009, 09:32


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 17:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.01374 секунд с 7
ELECTRONIX ©2004-2016