Ассемблер (ASM) для AVR в вопросах и ответах
- zero648
- Вымогатель припоя
- Сообщения: 650
- Зарегистрирован: Пн июн 18, 2012 12:01:04
- Откуда: Челябинская область, Копейск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Оно ни откуда не грузится, это просто код символа из стандартной таблицы ASCII, это препроцессор и так знает. А запись -1+'0' переведется препроцессором в число 47.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Во! О том, что проц и так знает - я как раз и не знал... Теперь всё более-менее стало понятно. Спасибо!
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Это знает не проц, а компилятор, который формирует непосредственный операнд команды из данной строки исходника. И будет там написано -1+'0' или же '/' или же 0x2F -- константа получится одна и та же, и проц никогда не узнает, как именно было в исходнике 
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Ну что-же, очередной вопрос 
В тини2313 есть 16-разрядный таймер. Можно ли его заставить тикать с предделителем 1024, да так, чтобы при значении 10800 срабатывало прерывание?
Что-то с даташитом я так и не смог разобраться, как именно это сделать. Если у кого-то есть, то очень желателен пример инициализации и запуска таймера в таком режиме.
В тини2313 есть 16-разрядный таймер. Можно ли его заставить тикать с предделителем 1024, да так, чтобы при значении 10800 срабатывало прерывание?
Что-то с даташитом я так и не смог разобраться, как именно это сделать. Если у кого-то есть, то очень желателен пример инициализации и запуска таймера в таком режиме.
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Как то так
Код: Выделить всё
LDI YH,HIGH(10800)
LDI YL,LOW(10800) ;число сравнения
OUT OCR1AH,YH
OUT OCR1AL,YL
LDI R16,0b00001101
OUT TCCR1B,R16 ;тактовый сигнал Fclk/1024, режим CTC
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Что-то не стартует...
В прерываниях прописано:
В коде запускаю таймер так:
А не стартует... Может упустил я чего?
В прерываниях прописано:
Код: Выделить всё
.ORG OC1Aaddr ; Timer/Counter1 Compare Match A
RJMP TIMER_INTERRUPTВ коде запускаю таймер так:
Код: Выделить всё
LDI R16,1<<OCIE1A
OUT TIMSK,R16 А не стартует... Может упустил я чего?
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
А глобальные прерывания разрешили?
sei
sei
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Да, разрешены конечно. В конце инициализации. Сейчас ещё для надёжности запустил поиск "CLI" по всему проекту - нет в нём такой команды, нигде.
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Тогда вы что-то упускаете из виду.
Увы, телепатией не обладаю.
Удачи!
Увы, телепатией не обладаю.
Удачи!
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Да, спасибо, удача очень понадобится. Особенно учитывая, что этот код в симуляторе как положено, прерывание вызывает, а в реальном железе прерывание не происходит. Я в принципе и весь проект выложить могу, но комментов там пока очень мало.
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Выкладывайте. Будет проще разобраться. Сейчас прогнал для верности в студии. При тактовой 8МГц каждые 1,38с происходит прерывание. Пардон, картинка приведена для числа сравнения 6666 
Код инициализации, но с числом 10800
Спойлер
Код инициализации, но с числом 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
.............
.............
.............WDT на более короткое время не включен? Или работаете с таймером Т0 и чистите предделитель битом PSR10 GTCCR, а он у tiny2313 один.Seriyvolk писал(а):... в реальном железе прерывание не происходит.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Да, спасибо за поддержку! В симмуляторе, как оказалось, у меня прерывание тоже работает. Ну и с железом разобрался. Ночь большая была. Проблема не совсем лежала на поверхности, а была закопана глубоко в коде.
Дело было в макросе задержки и используемых им регистрах. Макрос использует R16, R17 и R19! А мне всё время казалось, что не R19, а R18. Поэтому R19 был отведён под независимый регистр флагов.
При входе в макрос эти 3 переменные сохранялись в стек, при выходе - извлекались. И вся программа в принципе довольно неплохо работала, до того, как включил прерывания. А в прерывании как раз этот R19 (флаг) и изменялся. В итоге ни задержки, ни независимый флаговый регистр не работали правильно, вызывая такие страшные глюки.
Перенёс флаговый регистр в R23 - и всё сразу заработало как нужно!
В любом случае всем спасибо за помощь и что не бросаете меня!
Дело было в макросе задержки и используемых им регистрах. Макрос использует R16, R17 и R19! А мне всё время казалось, что не R19, а R18. Поэтому R19 был отведён под независимый регистр флагов.
При входе в макрос эти 3 переменные сохранялись в стек, при выходе - извлекались. И вся программа в принципе довольно неплохо работала, до того, как включил прерывания. А в прерывании как раз этот R19 (флаг) и изменялся. В итоге ни задержки, ни независимый флаговый регистр не работали правильно, вызывая такие страшные глюки.
Перенёс флаговый регистр в R23 - и всё сразу заработало как нужно!
В любом случае всем спасибо за помощь и что не бросаете меня!
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
- Gudd-Head
- Друг Кота
- Сообщения: 20091
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Решил я уйти от записей вида 0b01010101 к более читаемым типа (1<<bit). Но чего-то я не догоняю.
Например,
Заместо WDCE и WDE компилятор из инклудового файла возьмёт цифры (числа), соответствующие порядковым номерам этих бит в регистре (WDTCR).
Единицы сдвинутся на соотв. позиции и логически сложатся, а на месте остальных бит будут нули?
А такая контрукция
Эквивалентна ldi r16, 0?
Можно задавать свои номера битам через .EQU? Вынести их в отдельный файл (например, для управления периферией) и подключать через .include?
Например,
Код: Выделить всё
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 в вопросах и ответах
Gudd-Head писал(а):Решил я уйти от записей вида 0b01010101 к более читаемым типа (1<<bit).
Будет удобнее, гарантирую
Gudd-Head писал(а):Код: Выделить всё
ori r16, (1<<WDCE)|(1<<WDE)
Заместо WDCE и WDE компилятор из инклудового файла возьмёт цифры (числа), соответствующие порядковым номерам этих бит в регистре (WDTCR).
Единицы сдвинутся на соотв. позиции и логически сложатся, а на месте остальных бит будут нули?
Именно так.
Да, чисто для удобства отладки. Надо записал туда 1, не нужно вспоминать номер бита или по новой набирать комбинацию "(1<< )"
Gudd-Head писал(а):Можно задавать свои номера битам через .EQU? Вынести их в отдельный файл (например, для управления периферией) и подключать через .include?
Ну естественно, я так всегда и делаю
- Gudd-Head
- Друг Кота
- Сообщения: 20091
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Ну собсно, я пока писал, сам и разобрался. Не стал уж удалять текст — жалко
Только мне казалось что можно как в Сях когда надо кучу единиц и пару нулей записать через
Или всё-таки как-то можно?
Только мне казалось что можно как в Сях когда надо кучу единиц и пару нулей записать через
Код: Выделить всё
(0<<WDCE)&(0<<WDE)Или всё-таки как-то можно?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Нет, единицы так не запишутся.
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
- Gudd-Head
- Друг Кота
- Сообщения: 20091
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Да я уж прогнал в студии.
А как-то через инверсию или ИСКЛ.ИЛИ можно малой кровью дать понять компилятору, что надо кучу единичек записать с помощью нескольких нулей?
А как-то через инверсию или ИСКЛ.ИЛИ можно малой кровью дать понять компилятору, что надо кучу единичек записать с помощью нескольких нулей?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Ну например так
LDI R16,(1<<Bit1)|(1<<Bit2)
COM R16
Записанные номера битов обернутся нулями. Хотя конкретная реализация в любом случае зависит от того, что нужно сделать.
LDI R16,(1<<Bit1)|(1<<Bit2)
COM R16
Записанные номера битов обернутся нулями. Хотя конкретная реализация в любом случае зависит от того, что нужно сделать.
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
- Gudd-Head
- Друг Кота
- Сообщения: 20091
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Seriyvolk писал(а):LDI R16,(1<<Bit1)|(1<<Bit2)
COM R16
Не-не-не.
Во-первых, тут пишется единицами и
во вторых, лишняя команда в ПП.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Тут от синтаксиса ассемблера зависит.
COM - не годится, это уже исполняемый код, а надо маску средствами компилятора организовать.
COM - не годится, это уже исполняемый код, а надо маску средствами компилятора организовать.