3state-systems 0 15 апреля, 2007 Опубликовано 15 апреля, 2007 (изменено) · Жалоба Так вот вторая версия ОБМЕН БАЙТОМ 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 -сдвиг регистра вправо помоему обмен битами на шине идет от младшего к старшему" теперь надо переделать обмен битами на флаг С А я не понял получается надо всегда подавать единичку на выход иначе например у термометра с паразитным питанием, кончится заряд и он отключится, чет я совсем запутался может ну его нафиг паразитное питание? Изменено 15 апреля, 2007 пользователем 3state-systems Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 15 апреля, 2007 Опубликовано 15 апреля, 2007 · Жалоба Надо использовать не rol - сдвиг регистра влево, а ROR -сдвиг регистра вправо помоему обмен битами на шине идет от младшего к старшему"Да, тут я ошибся. А последнюю команду сдвига вы напрасно перенесли в цикл: у меня сдвиг происходил 8 раз внутри цикла и один раз после цикла (потому что во время первого сдвига еще не был принят бит), а у вас получился сдвиг 16 разА я не понял получается надо всегда подавать единичку на выход иначе например у термометра с паразитным питанием, кончится заряд и он отключится, чет я совсем запутался может ну его нафиг паразитное питание?Да, питание надо постоянно подавать между битами. А в чем сложности? Я же это реализовал в предыдущем сообщении. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
3state-systems 0 15 апреля, 2007 Опубликовано 15 апреля, 2007 (изменено) · Жалоба Да, тут я ошибся.Да, питание надо постоянно подавать между битами. А в чем сложности? Я же это реализовал в предыдущем сообщении. А ну я только сейчас буду разбираться в коде, у мня на вскидку не получается пока понять сразу как работает А последнюю команду сдвига вы напрасно перенесли в цикл: у меня сдвиг происходил 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, Настроить линию на выход - подать паразитное питание такой порядок следования, может наоборот? сначала настроить на выход а потом подавать единичку. или без разницы Изменено 15 апреля, 2007 пользователем 3state-systems Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
3state-systems 0 15 апреля, 2007 Опубликовано 15 апреля, 2007 · Жалоба 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мкс - пауза между битами Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 15 апреля, 2007 Опубликовано 15 апреля, 2007 · Жалоба я добвил команду вначале на настройку порта на вывод, у вас написано было что уже настроена на выход, так этож первая команда перед началом обмена, линия еще не настроена.Да, наверное так будет правильно. такой порядок следования, может наоборот? сначала настроить на выход а потом подавать единичку.или без разницыЕсли мы передавали нолик, то разницы никакой. А если единицу, то получится что мы в начале бита притянули линию к нулю (начали обмен), потом перевели порт в третье состояние (на линии единица от подтяжки), теперь если мы сначала настраиваем линию на вывод у нас она снова притянется к нулю, а уже потом мы ее поставим в 1. Получится лишний импульс, который нам совсем не нужен.только вот brcc Write_0 почемуто в симуляторе AVRStudio все время прыгает на метку при любом флаге С(SREG)Нет под рукой AVRStudio, чтобы проверить. В понедельник. А delay9 случайно флаг С не портит?А еще в стандарте написано что длительность слота может быть от 60-120мкс у нас получается 60мкс потом мы дрыгаем ногой на паразитное питание и доводим слот до 70мкс может лучше 70мкс Можно и так, для надежности. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
3state-systems 0 15 апреля, 2007 Опубликовано 15 апреля, 2007 (изменено) · Жалоба А 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 Разбираюсь как работают эти команды... Изменено 15 апреля, 2007 пользователем 3state-systems Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
3state-systems 0 17 апреля, 2007 Опубликовано 17 апреля, 2007 (изменено) · Жалоба Так вот что получилось Сетевой уровень бета подпрограмки Еще надо реализовать проверку флага Т после сброса на наличие ошибки в линии 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 Сергей Борщ огромное спасибо за помощь новичкам! Разбираюсь с задержками... может таймеры? Изменено 17 апреля, 2007 пользователем 3state-systems Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 17 апреля, 2007 Опубликовано 17 апреля, 2007 · Жалоба Разбираюсь с задержками... может таймеры?А смысл? Таймер имело бы смысл использовать если процессору есть еще чем заниматься. Тут же тупого цикла вполне достаточно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
3state-systems 0 18 апреля, 2007 Опубликовано 18 апреля, 2007 (изменено) · Жалоба А смысл? Таймер имело бы смысл использовать если процессору есть еще чем заниматься. Тут же тупого цикла вполне достаточно. Ну занять процессор всегда надется чем У нас задержки по 0,5сек уже есть, например на транспортном уровне есть команда начать преобразование температуры в код так там задержка 1секунда При таком подходе я даже состояние кнопки не смогу прочитать :( как быть? Изменено 18 апреля, 2007 пользователем 3state-systems Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 18 апреля, 2007 Опубликовано 18 апреля, 2007 · Жалоба команда начать преобразование температуры в код так там задержка 1секундаСтоп. О каких задержках речь шла? Я имел ввиду 480, 70, 10, 7 и т.д. мкс. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
3state-systems 0 19 апреля, 2007 Опубликовано 19 апреля, 2007 · Жалоба Стоп. О каких задержках речь шла? Я имел ввиду 480, 70, 10, 7 и т.д. мкс. Ой, на работе запарился, почему то подумал что Сброс 480мс :twak: Если "мкс" тогда ладно будет лучше простыми Nop в цикле. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xemul 0 19 апреля, 2007 Опубликовано 19 апреля, 2007 · Жалоба По окончании ResetPulse мастер по-любому не должен выдавать 1 на шину - слэйв ведь должен еще и ответить. При работе с устройствами с паразитным питанием обмен происходит вполне обычно, и только после выдачи мастером конкретному слэйву команды, требующей усиленного питания (Strong Pull-Up, SPU в даташитах), мастер должен его обеспечить на время, достаточное для выполнения слэйвом этой команды. Ну и для универсальности можно предварительно убедиться, требуется ли слэйву этот самый SPU. Задержки на 480 мкс пустыми циклами... Счастливые люди:). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
3state-systems 0 19 апреля, 2007 Опубликовано 19 апреля, 2007 · Жалоба По окончании ResetPulse мастер по-любому не должен выдавать 1 на шину - слэйв ведь должен еще и ответить. При работе с устройствами с паразитным питанием обмен происходит вполне обычно, и только после выдачи мастером конкретному слэйву команды, требующей усиленного питания (Strong Pull-Up, SPU в даташитах), мастер должен его обеспечить на время, достаточное для выполнения слэйвом этой команды. Ну и для универсальности можно предварительно убедиться, требуется ли слэйву этот самый SPU. Задержки на 480 мкс пустыми циклами... Счастливые люди:). Согласен, помоему мы так и реализовали нашу подпрограмму. Импульс сброса подсаживаем линию на 480мкс, отпускаем линию Каждое slave устройство обнаружив импульс сброса выдерживает паузу 15-60мкс затем подсаживает линию Длительность присутствия составляет 60-240мкс Сигналы присутствия от всех устройств сливаются в один общий импульс (Логика монтажная ИЛИ) Мастер проверят наличие нулевого уровня в середине этого интервала если линия подсажена значит на шине имеется хотябы одно нормально работающие устройство. А только потом подаем паразитное питание. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xemul 0 19 апреля, 2007 Опубликовано 19 апреля, 2007 · Жалоба Согласен, помоему мы так и реализовали нашу подпрограмму. ... А только потом подаем паразитное питание. Извините, последовательность правильно, недоглядел. Ну а необходимо ли выдывать SPU после любой операции, решать Вам. ЗЫЖ паразитное питание уже присутствует. Вы выдаете усиленный паек:) ЗЗЫЖ чуть попозже перепишу ванварь с пиков под аврки для gcc. Под задержки будет использоваться TMR0). Сорцы закину в соответствующую тему. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
3state-systems 0 19 апреля, 2007 Опубликовано 19 апреля, 2007 · Жалоба ЗЗЫЖ чуть попозже перепишу ванварь с пиков под аврки для gcc. Под задержки будет использоваться TMR0). Сорцы закину в соответствующую тему. Так там уже реализована эта библиотека для AVR только под компилятор IAR может проще ее переделать Автор SasaVitebsk Исследовал работу нескольких DS18B20/DS1820 "сидящих" на одной шине, а также возможность динамического подключения/замены данных датчиков на шине. Не нашёл. Некоторые библиотеки, в том числе выложенные на этом форуме являются нерабочими. Написал библиотеки, проверил и выложил их в виде библиотек в соответствующем разделе форума. Подключается несколько датчиков DS1820/ds18b20/ds18s20 в любом сочетании. На LCD дисплей выводится их количество и температура каждого. Допустимо подключения датчиков по двух-проводной схеме включения. Используется динамическое выделение памяти под ROM датчиков. http://electronix.ru/forum/index.php?act=S...10&t=23814# Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться