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

 
 
> 1-wire+микроконтроллер, Работа с DS2431(1-wire)
ks007
сообщение Jun 9 2011, 10:36
Сообщение #1


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

Группа: Участник
Сообщений: 76
Регистрация: 1-02-11
Из: Томск
Пользователь №: 62 613



Здравствуйте, есть проблема не могу связать DS2431 и микроконтроллер. Моделирую в Протеусе работу микроконтроллера с DS2431. DS2431 отвечает, что оно присутствует, потом хочу записать данные видно, что данные идут а в ответ ничего подскажите как быть. код программы привел и схема.
CODE
#define OW_RESET() DDRD|=(1<<DDD0);\
PORTD&=~(1<<PD0);\
DELAY_US(500)


#define OW_SEND_ONE() DDRD|=(1<<DDD0);\
PORTD&=~(1<<PD0);\
DELAY_US(10);\
DDRD&=~(1<<DDD0);\
PORTD|=(1<<PD0);\
DELAY_US(10)

#define OW_SEND_ZERO() DDRD|=(1<<DDD0);\
PORTD&=~(1<<PD0);\
DELAY_US(100);\
DDRD&=~(1<<DDD0);\
PORTD|=(1<<PD0);\
DELAY_US(10)

typedef unsigned char BYTE;


int main(void)
{
//DDRD|=(1<<DDD1);

BYTE DevDetect;
OW_RESET();
DDRD&=~(1<<DDD0);
PORTD|=(1<<PD0);
DELAY_US(65);
if((PIND&(1<<PIND0))==0)
{
DevDetect=1;
}

else
DevDetect=0;
DELAY_US(415);
//OW_SendByte(0x55);
//OW_SendByte(0xF0);
OW_SendByte(0x0F);

OW_SendByte(0x20);
OW_SendByte(0x00);

OW_SendByte(0x8C);

return DevDetect;
}

void OW_SendByte(BYTE val)
{
for(int i=0; i<8; ++i)
{
if(val&(1<<i))
{
OW_SEND_ONE();
}
else
{
OW_SEND_ZERO();
}
}
}


Сообщение отредактировал IgorKossak - Jun 9 2011, 11:23
Причина редактирования: [codebox] !!!

Эскизы прикрепленных изображений
Прикрепленное изображение
 

Прикрепленные файлы
Прикрепленный файл  23423.bmp ( 87.56 килобайт ) Кол-во скачиваний: 7
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Палыч
сообщение Jun 9 2011, 11:36
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(ks007 @ Jun 9 2011, 14:36) *
...хочу записать данные видно, что данные идут а в ответ ничего подскажите как быть
Вы, вероятно, хотели повторить пример из DS со стр.22. Что же Вы его бросили на пол-пути? Реализовали хотя бы “Write Scratchpad” и “Read Scratchpad”. Да и “Skip ROM” выбросили... Что Вы хотели увидеть "в ответ"? Что бы увидеть ответ см. Figure 11. Read/Write Timing Diagrams "READ-DATA TIME SLOT"

Кстати, времена, приведенные на стр.2 и 3, нужно соблюдать!
Go to the top of the page
 
+Quote Post
ks007
сообщение Jun 9 2011, 12:56
Сообщение #3


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

Группа: Участник
Сообщений: 76
Регистрация: 1-02-11
Из: Томск
Пользователь №: 62 613



Цитата(Палыч @ Jun 9 2011, 15:36) *

Спасибо за ответ.
Тайминги все выдерживаются, которые приведены на стр 2 и 3(проверял на временной диаграмме). А пример который, я делал на стр 21 "Write Scratchpad" (там несколько примеров), в ответ хотел видеть "CRC-16" и "FF Loop", на временной диаграмме я их не увидел.
У самого MAXIM есть примеры записи данных и считывания, пробовал не получается. Также вы подсказали хорошую идею которая на странице 22, попробую.

Сообщение отредактировал IgorKossak - Jun 9 2011, 19:02
Причина редактирования: Избыточное цитирование
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 9 2011, 13:25
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(ks007 @ Jun 9 2011, 16:56) *
Тайминги все выдерживаются, которые приведены на стр 2 и 3(проверял на временной диаграмме).
Позволю себе усомниться: не выдерживается Tslot при передаче единицы...

Цитата(ks007 @ Jun 9 2011, 16:56) *
...на временной диаграмме я их не увидел.
Как же вы их увидете, если:
1. Выбросили ”Skip ROM”
2. Не выдали восемь(!) байт данных
3. Не произвели чтение. При чтении мастер (МК в этом случае - мастер) не "сидит сложа руки". Грубо говоря он формирует "Write-one time slot" (формирует короткий импульс, а затем "отпускает" линию: переводит на чтение с подтяжкой к питанию), а DS2431 "задерживает" низкий уровень на линии, если читается с неё ноль, или - "отпускает", если читается с неё единица. Мастер определяет это по состоянию линии в "Master sampling window".
Go to the top of the page
 
+Quote Post
ks007
сообщение Jun 9 2011, 14:12
Сообщение #5


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

Группа: Участник
Сообщений: 76
Регистрация: 1-02-11
Из: Томск
Пользователь №: 62 613



Цитата(Палыч @ Jun 9 2011, 17:25) *

Восемь байт данных я отослал, понимаю код тяжко читается, но в программе это "OW_SendByte(0x8C);" а c Tslot точно не выдержал я думал, что Trec и все можно дальше кидать данные.
как я понял например: отослал 1 байт надо выждать Tslot и засылать след байт.
попробую все исправить, о результатах напишу.

Сообщение отредактировал IgorKossak - Jun 9 2011, 19:02
Причина редактирования: Избыточное цитирование
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 9 2011, 14:48
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(ks007 @ Jun 9 2011, 18:12) *
Восемь байт данных я отослал, понимаю код тяжко читается, но в программе это "OW_SendByte(0x8C);"
Не-а... Функция OW_SendByte выводит один байт (или восемь бит).

Цитата(ks007 @ Jun 9 2011, 18:12) *
как я понял например: отослал 1 байт надо выждать Tslot и засылать след байт.
У Вас мешанина между байтами и битами...
При выдаче бита устанавливается низкий уровень на время Tw1L (или Tw0L, в зависимости от значения выводимого бита), затем устанавливается высокий уровень и ждём Tslot - Tw1L (или Tslot - Tw0L). Т.е. время между началом передачи двух соседних битов (или время передачи одного бита с любым значением) должно быть равным Tslot.
Go to the top of the page
 
+Quote Post



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

 


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


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