Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
ЮТ
Вымогатель припоя
Сообщения: 623
Зарегистрирован: Чт июн 11, 2009 07:25:24
Откуда: СПб

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ЮТ »

Питанием решилось. Строка ничего не дала.
Skyer
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Пт фев 18, 2011 20:37:34

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Skyer »

Здравствуйте. Возникла проблема при работе с DS18B20. В железе датчик не инициализируется (датчик рабочий, проверял схему и с новым - не работает). В протеусе все пашет, сверился по документации, интервалы времени правильные. Подскажите в чем может бы загвоздка? Код и схему в протеусе прилагаю
Вложения
DS18B20.zip
Проект в студии и схема в протеусе
(70.09 КБ) 191 скачивание
Аватара пользователя
VirZh
Встал на лапы
Сообщения: 86
Зарегистрирован: Вс фев 27, 2011 01:01:11
Откуда: Республика Крым

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение 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 их понимает, а вот ассемблер - нет. (Отсутствует подсветка и говорит, что неизвестная команда). Какие контроллеры работают с этими инструкциями?
Опыт и мудрость приходят с годами... К некоторым годы приходят одни...
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ChipKiller »

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 их понимает, а вот ассемблер - нет. (Отсутствует подсветка и говорит, что неизвестная команда). Какие контроллеры работают с этими инструкциями?
... ИМХО если Atmel не вносит их в AVR Studio, наверное на то есть причины ... Например тест команды LAC Z,R17 на atmega8 дал результат dec YH dec ZL, а не то, что описано в руководстве ....
Аватара пользователя
Necroteeth
Потрогал лапой паяльник
Сообщения: 362
Зарегистрирован: Вс окт 10, 2010 17:43:48
Откуда: Воронеж

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Necroteeth »

уважаемые коты!
программа является моим собственным вариантом бегущего огонька из обучалки: 4 программы индикации светодиодов переключаются между собой кнопкой на INT0.
один таймер отсчитывает время между переключениями светодиодов 200мс, а другой таймер включается по внешнему прерыванию и отсчитывает 250мс (программный антидребезг), после чего обнуляется и отключается.

проблема в том, что программа переключается периодически через одну. неужели задержки в 250мс мало или я все-таки где-то в тексте программы облажался?
Вложения
runfire_with_choose.asm
(6.57 КБ) 259 скачиваний
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Gudd-Head »

Necroteeth писал(а):проблема в том, что программа переключается периодически через одну. неужели задержки в 250мс мало или я все-таки где-то в тексте программы облажался?

Прерываение по уровню или фронту/спаду (или по обоим)?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Necroteeth
Потрогал лапой паяльник
Сообщения: 362
Зарегистрирован: Вс окт 10, 2010 17:43:48
Откуда: Воронеж

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Necroteeth »

Gudd-Head писал(а):
Necroteeth писал(а):проблема в том, что программа переключается периодически через одну. неужели задержки в 250мс мало или я все-таки где-то в тексте программы облажался?

Прерываение по уровню или фронту/спаду (или по обоим)?

по спаду
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Gudd-Head »

Necroteeth писал(а):по спаду

Перед самым выходом из прерывания флаг прерывания сбрасываете?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Necroteeth
Потрогал лапой паяльник
Сообщения: 362
Зарегистрирован: Вс окт 10, 2010 17:43:48
Откуда: Воронеж

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Necroteeth »

Gudd-Head писал(а):
Necroteeth писал(а):по спаду

Перед самым выходом из прерывания флаг прерывания сбрасываете?

я не совсем понял... вы имели в виду GIFR что ли?
как у меня сделано: происходит прерывание INT0, при входе в его обработчик локально запрещается INT0, глобально разрешается все и запускается таймер Timer0 путем установки в TCCR0 значения прескалера.
зацикливаемся, пока не выставится регистр TimeIsOver в 1. это происходит в прерывании таймера 0, из которого мы возвращаемся в обработчик прерывания INT0 через reti.
после этого на единицу увеличивается переменная-счетчик Counter, показывающая текущую программу индикации, затем останавливается Timer0 и через reti возвращаемся в основной цикл.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Gudd-Head »

Necroteeth писал(а):я не совсем понял... вы имели в виду GIFR что ли?

Да, его. Перед выходом из обработки прерывания по INT0 вы сбрасываете INTF0 (записью в него лог. "1")???
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение GP1 »

Necroteeth писал(а):я не совсем понял... вы имели в виду GIFR что ли?
как у меня сделано: происходит прерывание INT0, при входе в его обработчик локально запрещается INT0, глобально разрешается все и запускается таймер Timer0 путем установки в TCCR0 значения прескалера.
зацикливаемся, пока не выставится регистр TimeIsOver в 1. это происходит в прерывании таймера 0, из которого мы возвращаемся в обработчик прерывания INT0 через reti.
после этого на единицу увеличивается переменная-счетчик Counter, показывающая текущую программу индикации, затем останавливается Timer0 и через reti возвращаемся в основной цикл.

Вот это глум :shock: :shock: :shock:
сам то-то понял что хотел сделать?
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
Necroteeth
Потрогал лапой паяльник
Сообщения: 362
Зарегистрирован: Вс окт 10, 2010 17:43:48
Откуда: Воронеж

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Necroteeth »

Gudd-Head писал(а):
Necroteeth писал(а):я не совсем понял... вы имели в виду GIFR что ли?

Да, его. Перед выходом из обработки прерывания по INT0 вы сбрасываете INTF0 (записью в него лог. "1")???

вот это обработчик прерывания INT0:

Код: Выделить всё

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

сопутствующий обработчик прерывания таймера0:

Код: Выделить всё

Delay:         ldi TimeIsOver,1         ;выставляем флаг того, что таймер антидребезга досчитал до конца и возвращаемся в обработчик прерывания INT0
            reti               


при симуляции я вообще не заметил никаких телодвижений со стороны регистра GIFR. выставлял вручную на пине INT0 в единицу - регистр не шелохнулся, и даже когда единицу сбросил (т.е. просимулировал отрицательный фронт сигнала) - регистр все равно никак не изменился, хотя программный указатель скакнул на метку обработчика прерывания. не могли бы вы тогда объяснить суть установки единицы в бит INTF0? что при этом происходить будет и надо ли потом эту единицу оттуда убивать?

GP1 писал(а):Вот это глум
сам то-то понял что хотел сделать?

я не глумился ни над кем. выше я выкладывал полный листинг программы с комментариями. а это всего лишь текстовое дополнение к нему было
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение GP1 »

Necroteeth писал(а):я не глумился ни над кем. выше я выкладывал полный листинг программы с комментариями. а это всего лишь текстовое дополнение к нему было


я не о том, к чему такие извраты с программой?
кто вас вообще научил делать временные задержки в прерывании?
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Gudd-Head »

Necroteeth писал(а):при симуляции я вообще не заметил никаких телодвижений со стороны регистра GIFR.

Верить симуляции — дело десятое.
Necroteeth писал(а):выставлял вручную на пине INT0 в единицу - регистр не шелохнулся, и даже когда единицу сбросил (т.е. просимулировал отрицательный фронт сигнала) - регистр все равно никак не изменился, хотя программный указатель скакнул на метку обработчика прерывания.

А как по-вашему, что произошло? Я выскажу свою версию: ядро зафиксировало спад на INT0 и выставился флаг. Т.к. глобально и локально прерывание разрешено, произошёл переход по соответствующему вектору с аппаратным снятием флага прерывания, которого вы не увидели.
Necroteeth писал(а):не могли бы вы тогда объяснить суть установки единицы в бит INTF0? что при этом происходить будет

Суть: вы нажали кнопку, вошли в прерывание, флаг сбросился. Прерывания глобально запретились. Но из-за дребезга у вас произошёл ещё один спад и выставился флаг, но прерывания не произошло, т.к. оно запрещено глобально. Вы выходите из обработчика прерывания, глобально разрешаете прерывания и... Видите установленный флаг. И естессно, ещё раз обрабатываете то же самое прерывание, но теперь уже из-за дребезга.
Necroteeth писал(а):и надо ли потом эту единицу оттуда убивать?

Перечитайте даташит и то, что я уже писал.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Necroteeth
Потрогал лапой паяльник
Сообщения: 362
Зарегистрирован: Вс окт 10, 2010 17:43:48
Откуда: Воронеж

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Necroteeth »

GP1 писал(а):я не о том, к чему такие извраты с программой?
кто вас вообще научил делать временные задержки в прерывании?

никто меня не учил. морщу попу сам, методом проб и ошибок.
я не утверждал, что делал это правильно. просто считал, что так удобнее отсчитать нужное время, которое в интернетах определяют как 200-250мс.
Gudd-Head, спасибо за консультацию. пожалуй, и правда попробую поупражняться в техническом английском. надеюсь, это поможет
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение GP1 »

Necroteeth писал(а):... которое в интернетах определяют как 200-250мс.
...

даже самая х..я китайская кнопка успокаивается за 100-120 мс, в 99,9% достаточно 50-60 мс для подавления дребезга.
а временные задержки в прерывании не делай никогда, ты просто крадешь производительное время у процессора, за это время он столько полезного сможет сделать, ну, да я думаю, ты и сам до этого дойдешь, когда замутишь что-нибудь по-серьезней мигалки.
удачи.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Gudd-Head »

GP1 писал(а):даже самая х..я китайская кнопка успокаивается за 100-120 мс, в 99,9% достаточно 50-60 мс для подавления дребезга.

Подтверждаю. На работе как-то игрался с тактовой кнопкой и цифровым осциллом, м.б. даже картинки остались.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Necroteeth
Потрогал лапой паяльник
Сообщения: 362
Зарегистрирован: Вс окт 10, 2010 17:43:48
Откуда: Воронеж

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Necroteeth »

хорошо. а тогда такой вопрос - как грамотные люди осуществляют эту задержку на ассемблере?
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение GP1 »

существуют различные способы, как правило конкретный метод определяется задачей, скажем определить факт нажатия - это одно, а различить короткое/длинное нажатие это совсем другое.
чаще всего кнопки опрашивают по прерываню таймера, но попадаются и по внешним прерываниям, но реже.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Gudd-Head »

Necroteeth писал(а):хорошо. а тогда такой вопрос - как грамотные люди осуществляют эту задержку на ассемблере?

Также, как и не на асемблере. Только не в прерывании.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Ответить

Вернуться в «AVR»