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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

Сообщение zero648 »

Оно ни откуда не грузится, это просто код символа из стандартной таблицы ASCII, это препроцессор и так знает. А запись -1+'0' переведется препроцессором в число 47.
Аватара пользователя
Seriyvolk
Друг Кота
Сообщения: 4961
Зарегистрирован: Сб май 05, 2012 20:19:55
Откуда: Минск

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

Сообщение Seriyvolk »

Во! О том, что проц и так знает - я как раз и не знал... Теперь всё более-менее стало понятно. Спасибо!
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

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

Сообщение Jack_A »

Это знает не проц, а компилятор, который формирует непосредственный операнд команды из данной строки исходника. И будет там написано -1+'0' или же '/' или же 0x2F -- константа получится одна и та же, и проц никогда не узнает, как именно было в исходнике :)
Аватара пользователя
Seriyvolk
Друг Кота
Сообщения: 4961
Зарегистрирован: Сб май 05, 2012 20:19:55
Откуда: Минск

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

Сообщение Seriyvolk »

Ну что-же, очередной вопрос :)
В тини2313 есть 16-разрядный таймер. Можно ли его заставить тикать с предделителем 1024, да так, чтобы при значении 10800 срабатывало прерывание?
Что-то с даташитом я так и не смог разобраться, как именно это сделать. Если у кого-то есть, то очень желателен пример инициализации и запуска таймера в таком режиме.
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Как то так

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

   LDI   YH,HIGH(10800)
   LDI   YL,LOW(10800)   ;число сравнения

   OUT   OCR1AH,YH
   OUT   OCR1AL,YL

   LDI   R16,0b00001101
   OUT   TCCR1B,R16   ;тактовый сигнал Fclk/1024, режим CTC
Аватара пользователя
Seriyvolk
Друг Кота
Сообщения: 4961
Зарегистрирован: Сб май 05, 2012 20:19:55
Откуда: Минск

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

Сообщение Seriyvolk »

Что-то не стартует...
В прерываниях прописано:

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

.ORG   OC1Aaddr      ; Timer/Counter1 Compare Match A
RJMP TIMER_INTERRUPT

В коде запускаю таймер так:

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

           LDI R16,1<<OCIE1A
      OUT TIMSK,R16

А не стартует... Может упустил я чего?
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

А глобальные прерывания разрешили?
sei
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
Seriyvolk
Друг Кота
Сообщения: 4961
Зарегистрирован: Сб май 05, 2012 20:19:55
Откуда: Минск

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

Сообщение Seriyvolk »

Да, разрешены конечно. В конце инициализации. Сейчас ещё для надёжности запустил поиск "CLI" по всему проекту - нет в нём такой команды, нигде.
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

Тогда вы что-то упускаете из виду.
Увы, телепатией не обладаю. :)

Удачи!
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
Seriyvolk
Друг Кота
Сообщения: 4961
Зарегистрирован: Сб май 05, 2012 20:19:55
Откуда: Минск

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

Сообщение Seriyvolk »

Да, спасибо, удача очень понадобится. Особенно учитывая, что этот код в симуляторе как положено, прерывание вызывает, а в реальном железе прерывание не происходит. Я в принципе и весь проект выложить могу, но комментов там пока очень мало.
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Выкладывайте. Будет проще разобраться. Сейчас прогнал для верности в студии. При тактовой 8МГц каждые 1,38с происходит прерывание. Пардон, картинка приведена для числа сравнения 6666
СпойлерИзображение

test_oc.GIF

Код инициализации, но с числом 10800
Спойлер

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

GO:
   LDI   R16,RAMEND
   OUT   SPL,R16      ; инициализация стека

   CLR   ZH

   CLT
   
   LDI   YH,HIGH(10800)
   LDI   YL,LOW(10800)   ;число сравнений компаратора
   OUT   OCR1AH,YH
   OUT   OCR1AL,YL

   LDI R16,1<<OCIE1A
   OUT   TIMSK,R16   ;разрешить прерывание компаратора Timer1_compA
   OUT   TIFR,R16
   
   LDI   R16,0b00001101
;   LDI   R16,9
   OUT   TCCR1B,R16   ;тактовый сигнал Fo/1024
   
   SEI          ; разрешение глобальных прерываний
WAIT:
   BRTC   WAIT
   CLI
   CLT   
        .............
        .............
        .............

Seriyvolk писал(а):... в реальном железе прерывание не происходит.
WDT на более короткое время не включен? Или работаете с таймером Т0 и чистите предделитель битом PSR10 GTCCR, а он у tiny2313 один.
Аватара пользователя
Seriyvolk
Друг Кота
Сообщения: 4961
Зарегистрирован: Сб май 05, 2012 20:19:55
Откуда: Минск

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

Сообщение Seriyvolk »

Да, спасибо за поддержку! В симмуляторе, как оказалось, у меня прерывание тоже работает. Ну и с железом разобрался. Ночь большая была. Проблема не совсем лежала на поверхности, а была закопана глубоко в коде.
Дело было в макросе задержки и используемых им регистрах. Макрос использует R16, R17 и R19! А мне всё время казалось, что не R19, а R18. Поэтому R19 был отведён под независимый регистр флагов.
При входе в макрос эти 3 переменные сохранялись в стек, при выходе - извлекались. И вся программа в принципе довольно неплохо работала, до того, как включил прерывания. А в прерывании как раз этот R19 (флаг) и изменялся. В итоге ни задержки, ни независимый флаговый регистр не работали правильно, вызывая такие страшные глюки.
Перенёс флаговый регистр в R23 - и всё сразу заработало как нужно!
В любом случае всем спасибо за помощь и что не бросаете меня! :))
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20091
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

Решил я уйти от записей вида 0b01010101 к более читаемым типа (1<<bit). Но чего-то я не догоняю.
Например,

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

ori r16, (1<<WDCE)|(1<<WDE)

Заместо WDCE и WDE компилятор из инклудового файла возьмёт цифры (числа), соответствующие порядковым номерам этих бит в регистре (WDTCR).
Единицы сдвинутся на соотв. позиции и логически сложатся, а на месте остальных бит будут нули?
А такая контрукция

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

ldi r16, (0<<WDE)

Эквивалентна ldi r16, 0?
Можно задавать свои номера битам через .EQU? Вынести их в отдельный файл (например, для управления периферией) и подключать через .include?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3868
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

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

Сообщение Engineer_Keen »

Gudd-Head писал(а):Решил я уйти от записей вида 0b01010101 к более читаемым типа (1<<bit).

Будет удобнее, гарантирую :)
Gudd-Head писал(а):

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

ori r16, (1<<WDCE)|(1<<WDE)

Заместо WDCE и WDE компилятор из инклудового файла возьмёт цифры (числа), соответствующие порядковым номерам этих бит в регистре (WDTCR).
Единицы сдвинутся на соотв. позиции и логически сложатся, а на месте остальных бит будут нули?

Именно так.
Gudd-Head писал(а):А такая контрукция

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

ldi r16, (0<<WDE)

Эквивалентна ldi r16, 0?

Да, чисто для удобства отладки. Надо записал туда 1, не нужно вспоминать номер бита или по новой набирать комбинацию "(1<< )"
Gudd-Head писал(а):Можно задавать свои номера битам через .EQU? Вынести их в отдельный файл (например, для управления периферией) и подключать через .include?

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

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

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

Ну собсно, я пока писал, сам и разобрался. Не стал уж удалять текст — жалко :)
Только мне казалось что можно как в Сях когда надо кучу единиц и пару нулей записать через

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

(0<<WDCE)&(0<<WDE)

Или всё-таки как-то можно?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Seriyvolk
Друг Кота
Сообщения: 4961
Зарегистрирован: Сб май 05, 2012 20:19:55
Откуда: Минск

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

Сообщение Seriyvolk »

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

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

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

Да я уж прогнал в студии.
А как-то через инверсию или ИСКЛ.ИЛИ можно малой кровью дать понять компилятору, что надо кучу единичек записать с помощью нескольких нулей?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Seriyvolk
Друг Кота
Сообщения: 4961
Зарегистрирован: Сб май 05, 2012 20:19:55
Откуда: Минск

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

Сообщение Seriyvolk »

Ну например так
LDI R16,(1<<Bit1)|(1<<Bit2)
COM R16
Записанные номера битов обернутся нулями. Хотя конкретная реализация в любом случае зависит от того, что нужно сделать.
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20091
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

Seriyvolk писал(а):LDI R16,(1<<Bit1)|(1<<Bit2)
COM R16

:shock:
Не-не-не.
Во-первых, тут пишется единицами и
во вторых, лишняя команда в ПП.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Тут от синтаксиса ассемблера зависит.
COM - не годится, это уже исполняемый код, а надо маску средствами компилятора организовать.
Ответить

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