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

 
 
> 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   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   Цитата(Сергей Борщ @ Apr 15 2007, 15:55) ...   Apr 15 2007, 19:01
- - 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 Текстовая версия Сейчас: 31st July 2025 - 09:30
Рейтинг@Mail.ru


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