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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> 1-wire Интерфейс, Assembler'ные подпрограмы для начинаюших
3state-systems
сообщение Apr 15 2007, 11:09
Сообщение #16


Участник
*

Группа: Новичок
Сообщений: 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
Сообщение #17


Гуру
******

Группа: Модераторы
Сообщений: 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
Сообщение #18


Участник
*

Группа: Новичок
Сообщений: 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
3state-systems
сообщение Apr 15 2007, 15:25
Сообщение #19


Участник
*

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



Код
ExchangeBit:                    ;Обмен битом передаваемый\принимаемый бит в C
                                      ;Линия настроена на вывод между обменами
cbi DataPort+2,DataPin   ;PORTx = 0, посадить линию в 0
rcall delay6                    ;Задержка в 6мкс
brcc Write_0                   ;Если передается ноль - оставить ногу посаженной в 0
cbi DataPort+1,DataPin   ;Настроить линию на вход = отпустить линию
  Write_0:
  rcall delay9                   ;задержка до точки чтения
  clc                               ;Очистить флаг C
  sbic DataPort,DataPin    ;Пропустить следущию команду если линия притянута к 0
  sec                   ;Установить флаг C
  rcall delay45                ;Задержка в 45мкс
  sbi DataPort+1,DataPin ;DDRx = 1, Настроить линию на выход - подготовить к паразитному питанию
  sbi DataPort+2,DataPin ;PORTx = 1,подать паразитное питание
  rcall delay10                ;Задержка 10мкс - пауза между битами
ret

Вот вроде так должно быть, как все упростилось
только вот brcc Write_0 почемуто в симуляторе AVRStudio все время прыгает на метку при любом флаге С(SREG)

Цитата
Conditional relative branch. Tests the Carry flag © and branches relatively to PC if C is cleared. This instruction branches relatively to PC in either direction (PC - 63 ≤ destination ≤ PC + 64). The parameter k is the offset from PC and is represented in two's complement form. (Equivalent to instruction BRBC 0,k).

А еще в стандарте написано что длительность слота может быть от 60-120мкс
у нас получается 60мкс потом мы дрыгаем ногой на паразитное питание и доводим слот до 70мкс
может лучше 70мкс
rcall delay10 ;Заполняем слот до 70мкс
sbi DataPort+1,DataPin ;DDRx = 1, Настроить линию на выход - подготовить к паразитному питанию
sbi DataPort+2,DataPin ;PORTx = 1,подать паразитное питание
rcall delay10 ;Задержка 10мкс - пауза между битами
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 15 2007, 15:25
Сообщение #20


Гуру
******

Группа: Модераторы
Сообщений: 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
Сообщение #21


Участник
*

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


Участник
*

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



Так вот что получилось
Сетевой уровень бета подпрограмки
Еще надо реализовать проверку флага Т после сброса на наличие ошибки в линии
Код
SkipROM:               [color=#FF0000];Пропуск ПЗУ[/color]
rcall Restart        ;Сброс всех устройств на шине
ldi ByteBus,0xCC  ;Загрузка кода команды
rcall WriteByte;Запись команды на шину
ret
        
ReadROM:                  [color=#FF0000];Чтение ПЗУ [/color]
rcall Restart            ;Сброс всех устройст на шине
ldi ByteBus,0x33    ;Загрузка кода команды
rcall WriteByte      ;Запись команды на шину
LDI R30,low(idROM)  ;Младший байт - В регистровую пару грузим адрес первой ячейки куда            
LDI R31,high(idROM) ;Старший байт
LDI Counter,8         ;Организуем цикл на принятие 64бит Id кода
ReadLoop:          ;Цикл
  rcall ReadByte     ;Читаем один байт
  st Z+,Bytebus             ;Сохраняем в Памяти, указатель увеличиваем на 1
  dec Counter         ;Уменьшаем счетчик цикла
Brne ReadLoop    ;Цикл пока счетчик не стал равен 0
ret
    
MatchROM:                  [color=#CC0000];Совпадение ПЗУ[/color]
rcall Restart          ;Сброс всех устройст на шине
ldi ByteBus,0x55;Загрузка кода команды
rcall WriteByte     ;Запись команды на шину
LDI R30, low(idROM);Младший байт - В регистровую пару грузим адрес первой ячейки
LDI R31, high(idROM);Старший байт
LDI Counter,8        ;Организуем цикл на запись 64бит Id кода в шину
ReadLoop:         ;Цикл
  ld Z+,Bytebus        ;Загружаем в ригистр из Памяти, указатель увеличиваем на 1
  rcall WriteByte     ;Пишем один байт
  dec Counter             ;Уменьшаем счетчик цикла
Brne ReadLoop    ;Цикл пока счетчик не стал равен 0
ret


Ну и осталась самая мудренная из всех команд
SEARCH ROM (ПОИСК ПЗУ) F0H Получение идентификационных данных о всех стройствах на шине
есть пошаговая инструкция на русском и блок схема работы этой команды
очень сложная команда и не понятно где хранить id микросхем неужели в EEPROM?
от этой реализации команды изменится и алгоритм работы MatchROM

Сергей Борщ огромное спасибо за помощь новичкам!
Разбираюсь с задержками... может таймеры?

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


Гуру
******

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



Цитата(3state-systems @ Apr 17 2007, 16:54) *
Разбираюсь с задержками... может таймеры?
А смысл? Таймер имело бы смысл использовать если процессору есть еще чем заниматься. Тут же тупого цикла вполне достаточно.


--------------------
На любой вопрос даю любой ответ
"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 18 2007, 10:40
Сообщение #24


Участник
*

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



Цитата(Сергей Борщ @ Apr 17 2007, 19:44) *
А смысл? Таймер имело бы смысл использовать если процессору есть еще чем заниматься. Тут же тупого цикла вполне достаточно.

Ну занять процессор всегда надется чем biggrin.gif
У нас задержки по 0,5сек уже есть, например на транспортном уровне есть команда начать преобразование температуры в код так там задержка 1секунда
При таком подходе я даже состояние кнопки не смогу прочитать sad.gif
как быть?

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


Гуру
******

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



Цитата(3state-systems @ Apr 18 2007, 09:40) *
команда начать преобразование температуры в код так там задержка 1секунда
Стоп. О каких задержках речь шла? Я имел ввиду 480, 70, 10, 7 и т.д. мкс.


--------------------
На любой вопрос даю любой ответ
"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 19 2007, 09:02
Сообщение #26


Участник
*

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



Цитата(Сергей Борщ @ Apr 18 2007, 18:42) *
Стоп. О каких задержках речь шла? Я имел ввиду 480, 70, 10, 7 и т.д. мкс.


Ой, на работе запарился, почему то подумал что Сброс 480мс twak.gif
Если "мкс" тогда ладно будет лучше простыми Nop в цикле.
Go to the top of the page
 
+Quote Post
xemul
сообщение Apr 19 2007, 10:21
Сообщение #27



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



По окончании ResetPulse мастер по-любому не должен выдавать 1 на шину - слэйв ведь должен еще и ответить.
При работе с устройствами с паразитным питанием обмен происходит вполне обычно, и только после выдачи мастером конкретному слэйву команды, требующей усиленного питания (Strong Pull-Up, SPU в даташитах), мастер должен его обеспечить на время, достаточное для выполнения слэйвом этой команды. Ну и для универсальности можно предварительно убедиться, требуется ли слэйву этот самый SPU.
Задержки на 480 мкс пустыми циклами... Счастливые людиsmile.gif.
Go to the top of the page
 
+Quote Post
3state-systems
сообщение Apr 19 2007, 16:18
Сообщение #28


Участник
*

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



Цитата(xemul @ Apr 19 2007, 10:51) *
По окончании ResetPulse мастер по-любому не должен выдавать 1 на шину - слэйв ведь должен еще и ответить.
При работе с устройствами с паразитным питанием обмен происходит вполне обычно, и только после выдачи мастером конкретному слэйву команды, требующей усиленного питания (Strong Pull-Up, SPU в даташитах), мастер должен его обеспечить на время, достаточное для выполнения слэйвом этой команды. Ну и для универсальности можно предварительно убедиться, требуется ли слэйву этот самый SPU.
Задержки на 480 мкс пустыми циклами... Счастливые людиsmile.gif.


Согласен, помоему мы так и реализовали нашу подпрограмму.
Импульс сброса подсаживаем линию на 480мкс, отпускаем линию
Каждое slave устройство обнаружив импульс сброса выдерживает паузу 15-60мкс
затем подсаживает линию Длительность присутствия составляет 60-240мкс
Сигналы присутствия от всех устройств сливаются в один общий импульс (Логика монтажная ИЛИ)
Мастер проверят наличие нулевого уровня в середине этого интервала если линия подсажена значит на шине имеется хотябы одно нормально работающие устройство.
А только потом подаем паразитное питание.
Go to the top of the page
 
+Quote Post
xemul
сообщение Apr 19 2007, 17:15
Сообщение #29



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(3state-systems @ Apr 19 2007, 16:18) *
Согласен, помоему мы так и реализовали нашу подпрограмму.
...
А только потом подаем паразитное питание.

Извините, последовательность правильно, недоглядел.
Ну а необходимо ли выдывать SPU после любой операции, решать Вам.

ЗЫЖ паразитное питание уже присутствует. Вы выдаете усиленный паекsmile.gif
ЗЗЫЖ чуть попозже перепишу ванварь с пиков под аврки для gcc. Под задержки будет использоваться TMR0). Сорцы закину в соответствующую тему.
Go to the top of the page
 
+Quote Post
3state-systems
сообщение Apr 19 2007, 17:40
Сообщение #30


Участник
*

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



Цитата(xemul @ Apr 19 2007, 17:45) *
ЗЗЫЖ чуть попозже перепишу ванварь с пиков под аврки для gcc. Под задержки будет использоваться TMR0). Сорцы закину в соответствующую тему.


Так там уже реализована эта библиотека для AVR только под компилятор IAR может проще ее переделать

Автор SasaVitebsk
Цитата
Исследовал работу нескольких DS18B20/DS1820 "сидящих" на одной шине, а также возможность динамического подключения/замены данных датчиков на шине. Не нашёл. Некоторые библиотеки, в том числе выложенные на этом форуме являются нерабочими. Написал библиотеки, проверил и выложил их в виде библиотек в соответствующем разделе форума.

Подключается несколько датчиков DS1820/ds18b20/ds18s20 в любом сочетании. На LCD дисплей выводится их количество и температура каждого. Допустимо подключения датчиков по двух-проводной схеме включения. Используется динамическое выделение памяти под ROM датчиков.

http://electronix.ru/forum/index.php?act=S...10&t=23814#
Go to the top of the page
 
+Quote Post

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

 


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


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