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

3state-systems

Участник
  • Постов

    18
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о 3state-systems

  • Звание
    Участник
    Участник
  • День рождения 25.11.1984

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array
  1. Так вот что у нас получилось Половина пути уже пройдена :) Тестируйте, ищите ошибки, высказывайте свои замечания и дополнения 1_wireLib0.5Alpha.txt
  2. Так там уже реализована эта библиотека для AVR только под компилятор IAR может проще ее переделать Автор SasaVitebsk http://electronix.ru/forum/index.php?act=S...10&t=23814#
  3. Согласен, помоему мы так и реализовали нашу подпрограмму. Импульс сброса подсаживаем линию на 480мкс, отпускаем линию Каждое slave устройство обнаружив импульс сброса выдерживает паузу 15-60мкс затем подсаживает линию Длительность присутствия составляет 60-240мкс Сигналы присутствия от всех устройств сливаются в один общий импульс (Логика монтажная ИЛИ) Мастер проверят наличие нулевого уровня в середине этого интервала если линия подсажена значит на шине имеется хотябы одно нормально работающие устройство. А только потом подаем паразитное питание.
  4. Ой, на работе запарился, почему то подумал что Сброс 480мс :twak: Если "мкс" тогда ладно будет лучше простыми Nop в цикле.
  5. Ну занять процессор всегда надется чем У нас задержки по 0,5сек уже есть, например на транспортном уровне есть команда начать преобразование температуры в код так там задержка 1секунда При таком подходе я даже состояние кнопки не смогу прочитать :( как быть?
  6. Так вот что получилось Сетевой уровень бета подпрограмки Еще надо реализовать проверку флага Т после сброса на наличие ошибки в линии 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 Сергей Борщ огромное спасибо за помощь новичкам! Разбираюсь с задержками... может таймеры?
  7. Задержки пока еще не реализованные, тоесть сразу 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 Разбираюсь как работают эти команды...
  8. 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) А еще в стандарте написано что длительность слота может быть от 60-120мкс у нас получается 60мкс потом мы дрыгаем ногой на паразитное питание и доводим слот до 70мкс может лучше 70мкс rcall delay10 ;Заполняем слот до 70мкс sbi DataPort+1,DataPin ;DDRx = 1, Настроить линию на выход - подготовить к паразитному питанию sbi DataPort+2,DataPin ;PORTx = 1,подать паразитное питание rcall delay10 ;Задержка 10мкс - пауза между битами
  9. А ну я только сейчас буду разбираться в коде, у мня на вскидку не получается пока понять сразу как работает ой, напортачил :) 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, Настроить линию на выход - подать паразитное питание такой порядок следования, может наоборот? сначала настроить на выход а потом подавать единичку. или без разницы
  10. Так вот вторая версия ОБМЕН БАЙТОМ 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 -сдвиг регистра вправо помоему обмен битами на шине идет от младшего к старшему" теперь надо переделать обмен битами на флаг С А я не понял получается надо всегда подавать единичку на выход иначе например у термометра с паразитным питанием, кончится заряд и он отключится, чет я совсем запутался может ну его нафиг паразитное питание?
  11. Вай, так и есть, подводный камень :) Я то думал что у мня цикл уходит в бесконечность ldi temp, 8 loop: dec temp nop brne loop Разбираюсь дальше.....
  12. :bb-offtopic: а где сдесь модераторы?, можно эту тему перенести обратно в ветку AVR, то в этой чета хоть и начинающим, но както широкого плана вопросы, например передача энергии без проводов и влияние чернобыля на курапаток :) там в ветке AVR спецов валом Сергей Борщ Большой респект за помошь :1111493779:
  13. Так добрались до байт черновой вариант такой .def Temp =R16 ;Temp он и в африке Temp .def ByteBus =R20 ;Байт для передачи\приема 1-wire bus WriteByte: ;Запись байта в ведомое устройство lsr Bytebus ;Сдвинуть байт вправо ->С (Флаг переноса регистра Sreg) brcs Writebit1 ;Перейти если флаг переноса установлен(текущий бит равен 1) rcall Wriebit0 ;Перейти если флаг переноса сброшен (текущий бит равен 0) ;Нужен цикл повторить 8 раз ret Чтот у мня цикл взбунтовался не работает :smile3046: Чтение байта чтото подобное
  14. Часа два разбирался с вашей универсальной подпрограммой обмена битами, вроде разобрался но для новичка конечно это жесть :) Так значит имеем 100пудовые подпрограммы для первого уровня .equ DataPort =PIND;Порту к которому подключена шина .equ DataPin =5 ;Пин к которому подключена шина 1-wire bus ;DataPort=PIN(x); ;DataPort+1=DDR(x) ;DataPort+2=PORT(x) Restart: ;Сброс всех устройств cbi DataPort+2,DataPin;PORTx = 0, подготовить к работе sbi DataPort+1,DataPin;DDRx = 1, Настроить линию на выход - посадить линию в 0 rcall delay480 ;задержка в 480мкс cbi DataPort+1,DataPin;Настроить линию на вход = отпустить линию rcall delay70 ;задержка в 70мкс clt ;Очистить флаг Т регистра Sreg 0 = Все нормально sbic DataPort, DataPin ;Пропустить следущию команду если бит равен "0" set ;Записать "1" в регитр Sreg флаг Т=1 - нет устройств на шине rcall delay410 ;задержка в 410мкс ret ;[хотя RCALL и следом за ним RET можно заменить на один RJMP delay410] WriteBit0: ;Запись Бита "0" clt rjmp ExchangeBit WriteBit1: ;Запись Бита "1" ReadBit: ;Чтение Бита set ExchangeBit: ;Передаваемый бит в T sbi DataPort+1,DataPin ;DDRx = 1, Настроить линию на выход - посадить линию в 0 rcall delay6 ;задержка в 6мкс BRTC Write_0 ;Если передается ноль - оставить ногу посаженной в 0 cbi DataPort + 1, DataPin;Настроить линию на вход = отпустить линию Write_0: rcall delay9 ;задержка до точки чтения clt ;Очистить флаг Т sbic DataPort,DataPin ;Пропустить следущию команду если линия притянута к 0 set rcall delay45 ;задержка в 45мкс cbi DataPort+1,DataPin ;Настроить линию на вход = отпустить линию rcall delay10 ;задержка 10мкс - пауза между битами и возвратиз подпрограммы. В флаге T - считанный бит ret Restart -Сброс всех устройств WriteBit0 - Запись Бита "0" WriteBit1 - Запись Бита "1" ReadBit - Чтение Бита
  15. AvrAsm2 :) Сначала хотел возмутится в даташите на мегу в Register Summary все в обратном порядке потом глянул на адреса Гениально придумано! Вот тока зачем добавлять 3? ;) 0x1B (0x3B) PORTA 0x1A (0x3A) DDRA 0x19 (0x39) PINA .equ DataPort =PIND;Порту к которому подключена шина .equ DataPin =5 ;Пин к которому подключена шина 1-wire bus ;DataPort=PIN(x); ;DataPort+1=DDR(x) ;DataPort+2=PORT(x)
×
×
  • Создать...