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

 
 
> 1-wire Интерфейс, Assembler'ные подпрограмы для начинаюших
3state-systems
сообщение Apr 11 2007, 19:48
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 18
Регистрация: 11-04-07
Из: Россия, Бурятия, Улан-Удэ
Пользователь №: 26 954



Здравствуйте,
Изучаю микроконтроллеры для себя, решил изучить интерфейс 1-wire
наткнулся на странную ситуацию: вроде и все давно ясно и куча библиотек готовых есть под разные микроконтроллеры на С разных мастей и под Assembler.
И в форумах не одна тема создана, а полной картины по 1-wire[AVR Assembler] как небыло так и нет.

Предлагаю поделится опытом, советом, готовым примером, покритиковать, поддержать и просто высказать свое мнение
Цель: Создание простых, универсальных и ясных подпрограмм для работы с 1-wire
Резюмируя эту тему можна создать неплохую статью для начинающих в рамках проекта AVR для начинающих Electronix.ru

А еще, чтобы не писать лишнего и не терять суть, предполагаю что вся необходимая документация касаемого стандарта интерфейса всем известна, а обсуждать только конкретные решения проблем.

Ну так начнем!
Возьмем в качестве отправной точки (Я начинающий!)
Код
AVR318: Ведущий однопроводной интерфейс 1-Wire компании Dallas (21 страница, пересмотр А, обновление от 09/04)
В рекомендациях показывается, как реализовать 1-проводной ведущий интерфейс с помощью микроконтроллера AVR. Рассмотрено два подхода: полностью программный и с помощью встроенного модуля У(С)АПП

Нас интересует только полностью программный подход
Из него следует:
Что для программной реализации протокола удобно разделить все команды на четыре уровня
УРОВНИ (и команды)
1)Передача и прием отдельных битов
a)Сброс всех устройств на шине [Restart]
B)Запись бита "1" в устройство [WriteBit1]
с)Запись бита "0" в устройство [WriteBit0]
d)Чтение бита из устройства [ReadBit]

2)Передача и прием отдельных байтов
a)Послать байт в устройство [SentByte]
B)Принять байт из устройства [ReseiveByte]

3)Сетевой уровень
a)Чтение ПЗУ [ReadROM]
B)Совпадение ПЗУ [MatchROM]
c)Пропуск ПЗУ [SkipROM]
d)Поиск ПЗУ [SearchRom]

4)Команды для работы с конкретными устройствами например датчик температуры ds1820 series
м некоторые прикладные подпрограммки
a)Вычисление CRC8 (табличная реализация и прямое вычисление)
B)Диагностика ошибок
с)Чтение режима питания микросхем паразитное или отдельное





Так как стандарт основывается на точном соблюдении всех задержек, всего 2 группы
6-64мкс и 470-1000мкс.
Вопрос как универсально сформировать задержки для различных частот задающих кварцов?

Так по теме словесное описанное описание команд первого уровня
Код
Restart:
;Сброс всех устройств
;Подсаживаем линию, задержка на 700мкс
;Задержка в 65мкс, проверка сигнала
;ок =уровень сигнала равен 0 передача управления дальше на3
;error уровень Равен 1 =обрыв линии
;3 формируем задержку в 500мкс проверяем уровень сигнала
;ок =уровень сигнала равен 1
;error уровень равен 0 =линия закорочена
;в переменную помешаем код ошибки и выходи 0=ок
    reti
    Readbit:
;Чтение чтение одного бита из устройства
;Формируем синхроимпульс, подсаживаем линию =задержка 1мкс отпускаем линию снова                               задержка 13мкс
;считываем уровень сигнала помешаем кудато
;заполняем слот задержкой в 60-120мкс (60мкс)
     reti
    writebit0:
;Запись в слот нулевого значения
;подсадить линию    
;задержка в 80мкс
;отпустиь линию
;
    reti
    writebit1:
;Запись в слот единичного значения
;подсадить линию    
;задержка в 4,5мкс
;отпустиь линию
;задержка в 75мкс
    reti


Сообщение отредактировал 3state-systems - Apr 11 2007, 19:48
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
3state-systems
сообщение Apr 15 2007, 11:09
Сообщение #2


Участник
*

Группа: Новичок
Сообщений: 18
Регистрация: 11-04-07
Из: Россия, Бурятия, Улан-Удэ
Пользователь №: 26 954



Так вот вторая версия ОБМЕН БАЙТОМ
Код
ReadByte:            ;Чтение байта  
LDI ByteBus,0xFF  ;Запись всех еденичек, потому что при чтении и при записи 1, одинаковые слоты
WriteByte:            ;Запись байта     
ldi Counter,8      
Loop:
ror ByteBus        ;Очередной передаваемый бит выдвинуть в C, сдвиг регистра вправо
RCALL ExchangeBit;Принятый из С в ByteBus
dec Counter;Уменьшаем счетчик цикла
ror ByteBus        ;Задвинуть последний принятый бит
brne Loop             ;Цикл пока счетчик не стал равен 0
ret

Надо использовать не rol - сдвиг регистра влево, а ROR -сдвиг регистра вправо
помоему обмен битами на шине идет от младшего к старшему"

теперь надо переделать обмен битами на флаг С
А я не понял получается надо всегда подавать единичку на выход иначе например у термометра с паразитным питанием, кончится заряд и он отключится, чет я совсем запутался может ну его нафиг паразитное питание?

Сообщение отредактировал 3state-systems - Apr 15 2007, 11:13
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 15 2007, 11:15
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(3state-systems @ Apr 15 2007, 10:09) *
Надо использовать не rol - сдвиг регистра влево, а ROR -сдвиг регистра вправо помоему обмен битами на шине идет от младшего к старшему"
Да, тут я ошибся. А последнюю команду сдвига вы напрасно перенесли в цикл: у меня сдвиг происходил 8 раз внутри цикла и один раз после цикла (потому что во время первого сдвига еще не был принят бит), а у вас получился сдвиг 16 раз
Цитата(3state-systems @ Apr 15 2007, 10:09) *
А я не понял получается надо всегда подавать единичку на выход иначе например у термометра с паразитным питанием, кончится заряд и он отключится, чет я совсем запутался может ну его нафиг паразитное питание?
Да, питание надо постоянно подавать между битами. А в чем сложности? Я же это реализовал в предыдущем сообщении.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
3state-systems
сообщение Apr 15 2007, 11:18
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 18
Регистрация: 11-04-07
Из: Россия, Бурятия, Улан-Удэ
Пользователь №: 26 954



Цитата(Сергей Борщ @ Apr 15 2007, 11:45) *
Да, тут я ошибся.Да, питание надо постоянно подавать между битами. А в чем сложности? Я же это реализовал в предыдущем сообщении.

А ну я только сейчас буду разбираться в коде, у мня на вскидку не получается пока понять сразу как работает blush.gif

Цитата
А последнюю команду сдвига вы напрасно перенесли в цикл: у меня сдвиг происходил 8 раз внутри цикла и один раз после цикла (потому что во время первого сдвига еще не был принят бит), а у вас получился сдвиг 16 раз

ой, напортачил smile.gif

Код
Restart:                       ;Сброс всех устройств
sbi DataPort+1,DataPin;DDRx = 1, Настроить линию на выход
cbi DataPort+2,DataPin;PORTx = 0, посадить линию в 0

я добвил команду вначале на настройку порта на вывод, у вас написано было что уже настроена на выход, так этож первая команда перед началом обмена, линия еще не настроена.

А еще вопрос
Код
sbi DataPort+2,DataPin;PORTx = 1, подготовить к паразитному питанию
sbi DataPort+1,DataPin;DDRx = 1, Настроить линию на выход - подать паразитное питание

такой порядок следования, может наоборот? сначала настроить на выход а потом подавать единичку.
или без разницы

Сообщение отредактировал 3state-systems - Apr 15 2007, 12:10
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 15 2007, 15:25
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(3state-systems @ Apr 15 2007, 10:18) *
я добвил команду вначале на настройку порта на вывод, у вас написано было что уже настроена на выход, так этож первая команда перед началом обмена, линия еще не настроена.
Да, наверное так будет правильно.
Цитата(3state-systems @ Apr 15 2007, 10:18) *
такой порядок следования, может наоборот? сначала настроить на выход а потом подавать единичку.или без разницы
Если мы передавали нолик, то разницы никакой. А если единицу, то получится что мы в начале бита притянули линию к нулю (начали обмен), потом перевели порт в третье состояние (на линии единица от подтяжки), теперь если мы сначала настраиваем линию на вывод у нас она снова притянется к нулю, а уже потом мы ее поставим в 1. Получится лишний импульс, который нам совсем не нужен.
Цитата(3state-systems @ Apr 15 2007, 14:25) *
только вот brcc Write_0 почемуто в симуляторе AVRStudio все время прыгает на метку при любом флаге С(SREG)
Нет под рукой AVRStudio, чтобы проверить. В понедельник. А delay9 случайно флаг С не портит?
Цитата(3state-systems @ Apr 15 2007, 14:25) *
А еще в стандарте написано что длительность слота может быть от 60-120мкс
у нас получается 60мкс потом мы дрыгаем ногой на паразитное питание и доводим слот до 70мкс
может лучше 70мкс
Можно и так, для надежности.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
3state-systems
сообщение Apr 15 2007, 19:01
Сообщение #6


Участник
*

Группа: Новичок
Сообщений: 18
Регистрация: 11-04-07
Из: Россия, Бурятия, Улан-Удэ
Пользователь №: 26 954



Цитата(Сергей Борщ @ Apr 15 2007, 15:55) *
А delay9 случайно флаг С не портит?Можно и так, для надежности.

Задержки пока еще не реализованные, тоесть сразу ret
Цитата
Получится лишний импульс, который нам совсем не нужен.

Высший пилотаж a14.gif , как все продуманно!

Тоесть у нас почти(исправить бяку с условием) готовые 100пудовые программы для обмена битами и байтами по шине 1-wire!
Следущий уровень сетевой

READ ROM (ЧТЕНИЕ ПЗУ) 33H Идентификация
SKIP ROM (ПРОПУСК ПЗУ) CCH Пропуск адресации
MATCH ROM (СОВПАДЕНИЕ ПЗУ) 55H Адресация подчиненного устройства
SEARCH ROM (ПОИСК ПЗУ) F0H Получение идентификационных данных о всех стройствах на шине
OVERDRIVE SKIP ROM 3CH Ускоренная версия SKIP ROM
OVERDRIVE MATCH ROM 69H Ускоренная версия MATCH ROM

Разбираюсь как работают эти команды...

Сообщение отредактировал 3state-systems - Apr 15 2007, 19:07
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 3state-systems   1-wire Интерфейс   Apr 11 2007, 19:48
- - Kuzmi4   2 3state-systems - с 1-Wire интерфейсом не сталкив...   Apr 12 2007, 10:24
- - Сергей Борщ   Цитата(3state-systems @ Apr 11 2007, 18...   Apr 12 2007, 12:46
- - 3state-systems   Так сейчас закодил первый уровень вот что получил...   Apr 12 2007, 20:57
|- - Сергей Борщ   Цитата(3state-systems @ Apr 12 2007, 19...   Apr 12 2007, 22:45
- - 3state-systems   ЦитатаКстати, я ориентируюсь на ассемблер IAR, а в...   Apr 13 2007, 09:47
|- - Сергей Борщ   Цитата(3state-systems @ Apr 13 2007, 08...   Apr 13 2007, 12:36
- - 3state-systems   Цитата(3state-systems @ Apr 13 2007, 08:47) * Да к...   Apr 13 2007, 15:26
|- - Сергей Борщ   Цитата(3state-systems @ Apr 13 2007, 14...   Apr 13 2007, 16:50
- - 3state-systems   Часа два разбирался с вашей универсальной подпрогр...   Apr 13 2007, 17:18
- - 3state-systems   Так добрались до байт черновой вариант такой .def ...   Apr 13 2007, 20:35
|- - Сергей Борщ   Для начала отступление: я вас обманул. Вот тут:Цит...   Apr 14 2007, 10:37
- - 3state-systems   а где сдесь модераторы?, можно эту тему перенести ...   Apr 13 2007, 22:19
|- - zltigo   Цитата(3state-systems @ Apr 13 2007, 21...   Apr 14 2007, 11:11
- - 3state-systems   Цитатано обратите внимание, что по brcs Writebit1 ...   Apr 14 2007, 11:29
- - 3state-systems   КодExchangeBit: ;Обмен битом передавае...   Apr 15 2007, 15:25
- - 3state-systems   Так вот что получилось Сетевой уровень бета подпро...   Apr 17 2007, 17:54
|- - Сергей Борщ   Цитата(3state-systems @ Apr 17 2007, 16...   Apr 17 2007, 19:14
|- - 3state-systems   Цитата(Сергей Борщ @ Apr 17 2007, 19:44) ...   Apr 18 2007, 10:40
|- - Сергей Борщ   Цитата(3state-systems @ Apr 18 2007, 09...   Apr 18 2007, 18:12
|- - 3state-systems   Цитата(Сергей Борщ @ Apr 18 2007, 18:42) ...   Apr 19 2007, 09:02
- - xemul   По окончании ResetPulse мастер по-любому не должен...   Apr 19 2007, 10:21
|- - 3state-systems   Цитата(xemul @ Apr 19 2007, 10:51) По око...   Apr 19 2007, 16:18
|- - xemul   Цитата(3state-systems @ Apr 19 2007, 16...   Apr 19 2007, 17:15
|- - 3state-systems   Цитата(xemul @ Apr 19 2007, 17:45) ЗЗЫЖ ч...   Apr 19 2007, 17:40
|- - xemul   Цитата(3state-systems @ Apr 19 2007, 17...   Apr 19 2007, 18:18
- - 3state-systems   Так вот что у нас получилось Половина пути уже про...   Apr 24 2007, 21:01
- - Svin62   Граждане! А кто-нить пробовал, вместо таблетки...   Dec 14 2008, 20:27


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

 


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


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