|
1-wire Интерфейс, Assembler'ные подпрограмы для начинаюших |
|
|
|
Apr 11 2007, 19:48
|

Участник

Группа: Новичок
Сообщений: 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
|
|
|
|
|
 |
Ответов
|
Apr 15 2007, 11:09
|

Участник

Группа: Новичок
Сообщений: 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
|
|
|
|
|
Apr 15 2007, 11:15
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Apr 15 2007, 11:18
|

Участник

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

|
Цитата(Сергей Борщ @ Apr 15 2007, 11:45)  Да, тут я ошибся.Да, питание надо постоянно подавать между битами. А в чем сложности? Я же это реализовал в предыдущем сообщении. А ну я только сейчас буду разбираться в коде, у мня на вскидку не получается пока понять сразу как работает  Цитата А последнюю команду сдвига вы напрасно перенесли в цикл: у меня сдвиг происходил 8 раз внутри цикла и один раз после цикла (потому что во время первого сдвига еще не был принят бит), а у вас получился сдвиг 16 раз ой, напортачил  Код 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
|
|
|
|
|
Apr 15 2007, 15:25
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Apr 15 2007, 19:01
|

Участник

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

|
Цитата(Сергей Борщ @ Apr 15 2007, 15:55)  А delay9 случайно флаг С не портит?Можно и так, для надежности. Задержки пока еще не реализованные, тоесть сразу ret Цитата Получится лишний импульс, который нам совсем не нужен. Высший пилотаж  , как все продуманно! Тоесть у нас почти(исправить бяку с условием) готовые 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
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|