Ассемблер (ASM) для AVR в вопросах и ответах
- Реклама
- Сообщения: 31
- Зарегистрирован: Пт фев 18, 2011 20:37:34
Здравствуйте. Возникла проблема при работе с DS18B20. В железе датчик не инициализируется (датчик рабочий, проверял схему и с новым - не работает). В протеусе все пашет, сверился по документации, интервалы времени правильные. Подскажите в чем может бы загвоздка? Код и схему в протеусе прилагаю
- Вложения
-
- DS18B20.zip
- Проект в студии и схема в протеусе
- (70.09 КБ) 193 скачивания
Уважаемые коты!
Что скажете по поводу применения 4 новых команд, описанных в http://www.atmel.com/dyn/resources/prod ... oc0856.pdf , а именно: XCH Z,Rd; LAS Z,Rd; LAC Z,Rd и LAT Z,Rd. Судя по описанию - команды очень даже полезные. Дизассемблер студии 4.18 SP3 их понимает, а вот ассемблер - нет. (Отсутствует подсветка и говорит, что неизвестная команда). Какие контроллеры работают с этими инструкциями?
Что скажете по поводу применения 4 новых команд, описанных в http://www.atmel.com/dyn/resources/prod ... oc0856.pdf , а именно: XCH Z,Rd; LAS Z,Rd; LAC Z,Rd и LAT Z,Rd. Судя по описанию - команды очень даже полезные. Дизассемблер студии 4.18 SP3 их понимает, а вот ассемблер - нет. (Отсутствует подсветка и говорит, что неизвестная команда). Какие контроллеры работают с этими инструкциями?
Опыт и мудрость приходят с годами... К некоторым годы приходят одни...
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
... ИМХО если Atmel не вносит их в AVR Studio, наверное на то есть причины ... Например тест команды LAC Z,R17 на atmega8 дал результат dec YH dec ZL, а не то, что описано в руководстве ....VirZh писал(а):Что скажете по поводу применения 4 новых команд, описанных в http://www.atmel.com/dyn/resources/prod ... oc0856.pdf , а именно: XCH Z,Rd; LAS Z,Rd; LAC Z,Rd и LAT Z,Rd. Судя по описанию - команды очень даже полезные. Дизассемблер студии 4.18 SP3 их понимает, а вот ассемблер - нет. (Отсутствует подсветка и говорит, что неизвестная команда). Какие контроллеры работают с этими инструкциями?
уважаемые коты!
программа является моим собственным вариантом бегущего огонька из обучалки: 4 программы индикации светодиодов переключаются между собой кнопкой на INT0.
один таймер отсчитывает время между переключениями светодиодов 200мс, а другой таймер включается по внешнему прерыванию и отсчитывает 250мс (программный антидребезг), после чего обнуляется и отключается.
проблема в том, что программа переключается периодически через одну. неужели задержки в 250мс мало или я все-таки где-то в тексте программы облажался?
программа является моим собственным вариантом бегущего огонька из обучалки: 4 программы индикации светодиодов переключаются между собой кнопкой на INT0.
один таймер отсчитывает время между переключениями светодиодов 200мс, а другой таймер включается по внешнему прерыванию и отсчитывает 250мс (программный антидребезг), после чего обнуляется и отключается.
проблема в том, что программа переключается периодически через одну. неужели задержки в 250мс мало или я все-таки где-то в тексте программы облажался?
- Вложения
-
- runfire_with_choose.asm
- (6.57 КБ) 261 скачивание
- Реклама
Прерываение по уровню или фронту/спаду (или по обоим)?Necroteeth писал(а):проблема в том, что программа переключается периодически через одну. неужели задержки в 250мс мало или я все-таки где-то в тексте программы облажался?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
по спадуGudd-Head писал(а):Прерываение по уровню или фронту/спаду (или по обоим)?Necroteeth писал(а):проблема в том, что программа переключается периодически через одну. неужели задержки в 250мс мало или я все-таки где-то в тексте программы облажался?
Перед самым выходом из прерывания флаг прерывания сбрасываете?Necroteeth писал(а):по спаду
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
я не совсем понял... вы имели в виду GIFR что ли?Gudd-Head писал(а):Перед самым выходом из прерывания флаг прерывания сбрасываете?Necroteeth писал(а):по спаду
как у меня сделано: происходит прерывание INT0, при входе в его обработчик локально запрещается INT0, глобально разрешается все и запускается таймер Timer0 путем установки в TCCR0 значения прескалера.
зацикливаемся, пока не выставится регистр TimeIsOver в 1. это происходит в прерывании таймера 0, из которого мы возвращаемся в обработчик прерывания INT0 через reti.
после этого на единицу увеличивается переменная-счетчик Counter, показывающая текущую программу индикации, затем останавливается Timer0 и через reti возвращаемся в основной цикл.
Да, его. Перед выходом из обработки прерывания по INT0 вы сбрасываете INTF0 (записью в него лог. "1")???Necroteeth писал(а):я не совсем понял... вы имели в виду GIFR что ли?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Вот это глумNecroteeth писал(а): я не совсем понял... вы имели в виду GIFR что ли?
как у меня сделано: происходит прерывание INT0, при входе в его обработчик локально запрещается INT0, глобально разрешается все и запускается таймер Timer0 путем установки в TCCR0 значения прескалера.
зацикливаемся, пока не выставится регистр TimeIsOver в 1. это происходит в прерывании таймера 0, из которого мы возвращаемся в обработчик прерывания INT0 через reti.
после этого на единицу увеличивается переменная-счетчик Counter, показывающая текущую программу индикации, затем останавливается Timer0 и через reti возвращаемся в основной цикл.
сам то-то понял что хотел сделать?
вот это обработчик прерывания INT0:Gudd-Head писал(а):Да, его. Перед выходом из обработки прерывания по INT0 вы сбрасываете INTF0 (записью в него лог. "1")???Necroteeth писал(а):я не совсем понял... вы имели в виду GIFR что ли?
Код: Выделить всё
Choose: ldi Shift,0
ldi Temp,0b00000000 ;запрещаем INT0
Out GICR,Temp
sei
ldi TimeIsOver,0
ldi TEMP,0b00001101 ;запуск таймера антидребезга
out TCCR0,TEMP
Loop: cpi TimeIsOver,1 ;ждем срабатывания таймера
brne Loop
inc Counter
ldi TEMP,0 ;остановка таймера антидребезга
out TCCR0,TEMP
retiКод: Выделить всё
Delay: ldi TimeIsOver,1 ;выставляем флаг того, что таймер антидребезга досчитал до конца и возвращаемся в обработчик прерывания INT0
reti я не глумился ни над кем. выше я выкладывал полный листинг программы с комментариями. а это всего лишь текстовое дополнение к нему былоGP1 писал(а):Вот это глум
сам то-то понял что хотел сделать?
я не о том, к чему такие извраты с программой?Necroteeth писал(а): я не глумился ни над кем. выше я выкладывал полный листинг программы с комментариями. а это всего лишь текстовое дополнение к нему было
кто вас вообще научил делать временные задержки в прерывании?
Верить симуляции — дело десятое.Necroteeth писал(а):при симуляции я вообще не заметил никаких телодвижений со стороны регистра GIFR.
А как по-вашему, что произошло? Я выскажу свою версию: ядро зафиксировало спад на INT0 и выставился флаг. Т.к. глобально и локально прерывание разрешено, произошёл переход по соответствующему вектору с аппаратным снятием флага прерывания, которого вы не увидели.Necroteeth писал(а):выставлял вручную на пине INT0 в единицу - регистр не шелохнулся, и даже когда единицу сбросил (т.е. просимулировал отрицательный фронт сигнала) - регистр все равно никак не изменился, хотя программный указатель скакнул на метку обработчика прерывания.
Суть: вы нажали кнопку, вошли в прерывание, флаг сбросился. Прерывания глобально запретились. Но из-за дребезга у вас произошёл ещё один спад и выставился флаг, но прерывания не произошло, т.к. оно запрещено глобально. Вы выходите из обработчика прерывания, глобально разрешаете прерывания и... Видите установленный флаг. И естессно, ещё раз обрабатываете то же самое прерывание, но теперь уже из-за дребезга.Necroteeth писал(а):не могли бы вы тогда объяснить суть установки единицы в бит INTF0? что при этом происходить будет
Перечитайте даташит и то, что я уже писал.Necroteeth писал(а):и надо ли потом эту единицу оттуда убивать?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
никто меня не учил. морщу попу сам, методом проб и ошибок.GP1 писал(а): я не о том, к чему такие извраты с программой?
кто вас вообще научил делать временные задержки в прерывании?
я не утверждал, что делал это правильно. просто считал, что так удобнее отсчитать нужное время, которое в интернетах определяют как 200-250мс.
Gudd-Head, спасибо за консультацию. пожалуй, и правда попробую поупражняться в техническом английском. надеюсь, это поможет
даже самая х..я китайская кнопка успокаивается за 100-120 мс, в 99,9% достаточно 50-60 мс для подавления дребезга.Necroteeth писал(а):... которое в интернетах определяют как 200-250мс.
...
а временные задержки в прерывании не делай никогда, ты просто крадешь производительное время у процессора, за это время он столько полезного сможет сделать, ну, да я думаю, ты и сам до этого дойдешь, когда замутишь что-нибудь по-серьезней мигалки.
удачи.
Подтверждаю. На работе как-то игрался с тактовой кнопкой и цифровым осциллом, м.б. даже картинки остались.GP1 писал(а):даже самая х..я китайская кнопка успокаивается за 100-120 мс, в 99,9% достаточно 50-60 мс для подавления дребезга.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
хорошо. а тогда такой вопрос - как грамотные люди осуществляют эту задержку на ассемблере?
существуют различные способы, как правило конкретный метод определяется задачей, скажем определить факт нажатия - это одно, а различить короткое/длинное нажатие это совсем другое.
чаще всего кнопки опрашивают по прерываню таймера, но попадаются и по внешним прерываниям, но реже.
чаще всего кнопки опрашивают по прерываню таймера, но попадаются и по внешним прерываниям, но реже.
Также, как и не на асемблере. Только не в прерывании.Necroteeth писал(а):хорошо. а тогда такой вопрос - как грамотные люди осуществляют эту задержку на ассемблере?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]



