Перейти к содержанию
    

Так вот вторая версия ОБМЕН БАЙТОМ

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, тут я ошибся.Да, питание надо постоянно подавать между битами. А в чем сложности? Я же это реализовал в предыдущем сообщении.

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

 

А последнюю команду сдвига вы напрасно перенесли в цикл: у меня сдвиг происходил 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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мкс - пауза между битами

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я добвил команду вначале на настройку порта на вывод, у вас написано было что уже настроена на выход, так этож первая команда перед началом обмена, линия еще не настроена.
Да, наверное так будет правильно.
такой порядок следования, может наоборот? сначала настроить на выход а потом подавать единичку.или без разницы
Если мы передавали нолик, то разницы никакой. А если единицу, то получится что мы в начале бита притянули линию к нулю (начали обмен), потом перевели порт в третье состояние (на линии единица от подтяжки), теперь если мы сначала настраиваем линию на вывод у нас она снова притянется к нулю, а уже потом мы ее поставим в 1. Получится лишний импульс, который нам совсем не нужен.
только вот brcc Write_0 почемуто в симуляторе AVRStudio все время прыгает на метку при любом флаге С(SREG)
Нет под рукой AVRStudio, чтобы проверить. В понедельник. А delay9 случайно флаг С не портит?
А еще в стандарте написано что длительность слота может быть от 60-120мкс

у нас получается 60мкс потом мы дрыгаем ногой на паразитное питание и доводим слот до 70мкс

может лучше 70мкс

Можно и так, для надежности.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А delay9 случайно флаг С не портит?Можно и так, для надежности.

Задержки пока еще не реализованные, тоесть сразу ret

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

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

 

Тоесть у нас почти(исправить бяку с условием) готовые 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так вот что получилось

Сетевой уровень бета подпрограмки

Еще надо реализовать проверку флага Т после сброса на наличие ошибки в линии

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Ну занять процессор всегда надется чем :biggrin:

У нас задержки по 0,5сек уже есть, например на транспортном уровне есть команда начать преобразование температуры в код так там задержка 1секунда

При таком подходе я даже состояние кнопки не смогу прочитать :(

как быть?

Изменено пользователем 3state-systems

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

команда начать преобразование температуры в код так там задержка 1секунда
Стоп. О каких задержках речь шла? Я имел ввиду 480, 70, 10, 7 и т.д. мкс.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Стоп. О каких задержках речь шла? Я имел ввиду 480, 70, 10, 7 и т.д. мкс.

 

Ой, на работе запарился, почему то подумал что Сброс 480мс :twak:

Если "мкс" тогда ладно будет лучше простыми Nop в цикле.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По окончании ResetPulse мастер по-любому не должен выдавать 1 на шину - слэйв ведь должен еще и ответить.

При работе с устройствами с паразитным питанием обмен происходит вполне обычно, и только после выдачи мастером конкретному слэйву команды, требующей усиленного питания (Strong Pull-Up, SPU в даташитах), мастер должен его обеспечить на время, достаточное для выполнения слэйвом этой команды. Ну и для универсальности можно предварительно убедиться, требуется ли слэйву этот самый SPU.

Задержки на 480 мкс пустыми циклами... Счастливые люди:).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По окончании ResetPulse мастер по-любому не должен выдавать 1 на шину - слэйв ведь должен еще и ответить.

При работе с устройствами с паразитным питанием обмен происходит вполне обычно, и только после выдачи мастером конкретному слэйву команды, требующей усиленного питания (Strong Pull-Up, SPU в даташитах), мастер должен его обеспечить на время, достаточное для выполнения слэйвом этой команды. Ну и для универсальности можно предварительно убедиться, требуется ли слэйву этот самый SPU.

Задержки на 480 мкс пустыми циклами... Счастливые люди:).

 

Согласен, помоему мы так и реализовали нашу подпрограмму.

Импульс сброса подсаживаем линию на 480мкс, отпускаем линию

Каждое slave устройство обнаружив импульс сброса выдерживает паузу 15-60мкс

затем подсаживает линию Длительность присутствия составляет 60-240мкс

Сигналы присутствия от всех устройств сливаются в один общий импульс (Логика монтажная ИЛИ)

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

А только потом подаем паразитное питание.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Согласен, помоему мы так и реализовали нашу подпрограмму.

...

А только потом подаем паразитное питание.

Извините, последовательность правильно, недоглядел.

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

 

ЗЫЖ паразитное питание уже присутствует. Вы выдаете усиленный паек:)

ЗЗЫЖ чуть попозже перепишу ванварь с пиков под аврки для gcc. Под задержки будет использоваться TMR0). Сорцы закину в соответствующую тему.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ЗЗЫЖ чуть попозже перепишу ванварь с пиков под аврки для gcc. Под задержки будет использоваться TMR0). Сорцы закину в соответствующую тему.

 

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

 

Автор SasaVitebsk

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

 

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

http://electronix.ru/forum/index.php?act=S...10&t=23814#

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...