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

 
 
> 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
 
Start new topic
Ответов
ILYAUL
сообщение Nov 29 2009, 10:35
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(Veg@ @ Nov 29 2009, 01:43) *
Сигнал RESET проходит и в ответ приходит 0xE0 - вроде бы как и надо, хотя при подключениии второго устройства приходит тоже самое, что, по идее, противоречит appnote'у.


Я так понял у Вас два DS18 , но тогда

Чтение ROM [33h] (Read) используется, чтобы прочитать ROM память устройства, если на шине оно только одно. После посылки этой команды Главное устройство должен генерировать 64 слота времени считывания. iButton пошлет содержимое его ROM памяти младшим битом вперед, начиная с кода семейства, сопровождаемого серийным номером и байтом циклического контроля избыточности.
Если на шине несколько iButtons устройств, то для чтения ROM памяти необходимо воспользоваться командой Поиск ROM [F0h] (Search), чтобы определить содержание ROM памяти устройств прежде, чем к ним можно будет обратиться.


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
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
- - 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 Текстовая версия Сейчас: 19th July 2025 - 13:29
Рейтинг@Mail.ru


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