Страница 213 из 400
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб фев 01, 2014 01:19:44
zero648
Оно ни откуда не грузится, это просто код символа из стандартной таблицы ASCII, это препроцессор и так знает. А запись -1+'0' переведется препроцессором в число 47.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб фев 01, 2014 01:24:35
Seriyvolk
Во! О том, что проц и так знает - я как раз и не знал... Теперь всё более-менее стало понятно. Спасибо!
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб фев 01, 2014 12:07:33
Jack_A
Это знает не проц, а компилятор, который формирует непосредственный операнд команды из данной строки исходника. И будет там написано
-1+'0' или же
'/' или же
0x2F -- константа получится одна и та же, и проц никогда не узнает, как именно было в исходнике

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн фев 03, 2014 18:11:16
Seriyvolk
Ну что-же, очередной вопрос

В тини2313 есть 16-разрядный таймер. Можно ли его заставить тикать с предделителем 1024, да так, чтобы при значении 10800 срабатывало прерывание?
Что-то с даташитом я так и не смог разобраться, как именно это сделать. Если у кого-то есть, то очень желателен пример инициализации и запуска таймера в таком режиме.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн фев 03, 2014 18:23:26
akl
Как то так
Код: Выделить всё
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 в вопросах и ответах
Добавлено: Пн фев 03, 2014 18:46:22
Seriyvolk
Что-то не стартует...
В прерываниях прописано:
Код: Выделить всё
.ORG OC1Aaddr ; Timer/Counter1 Compare Match A
RJMP TIMER_INTERRUPT
В коде запускаю таймер так:
А не стартует... Может упустил я чего?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн фев 03, 2014 19:08:02
Kavka
А глобальные прерывания разрешили?
sei
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн фев 03, 2014 20:14:55
Seriyvolk
Да, разрешены конечно. В конце инициализации. Сейчас ещё для надёжности запустил поиск "CLI" по всему проекту - нет в нём такой команды, нигде.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн фев 03, 2014 21:15:46
Kavka
Тогда вы что-то упускаете из виду.
Увы, телепатией не обладаю.
Удачи!
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн фев 03, 2014 21:55:19
Seriyvolk
Да, спасибо, удача очень понадобится. Особенно учитывая, что этот код в симуляторе как положено, прерывание вызывает, а в реальном железе прерывание не происходит. Я в принципе и весь проект выложить могу, но комментов там пока очень мало.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт фев 04, 2014 02:40:38
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 один.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт фев 04, 2014 11:04:41
Seriyvolk
Да, спасибо за поддержку! В симмуляторе, как оказалось, у меня прерывание тоже работает. Ну и с железом разобрался. Ночь большая была. Проблема не совсем лежала на поверхности, а была закопана глубоко в коде.
Дело было в макросе задержки и используемых им регистрах. Макрос использует R16, R17 и R19! А мне всё время казалось, что не R19, а R18. Поэтому R19 был отведён под независимый регистр флагов.
При входе в макрос эти 3 переменные сохранялись в стек, при выходе - извлекались. И вся программа в принципе довольно неплохо работала, до того, как включил прерывания. А в прерывании как раз этот R19 (флаг) и изменялся. В итоге ни задержки, ни независимый флаговый регистр не работали правильно, вызывая такие страшные глюки.
Перенёс флаговый регистр в R23 - и всё сразу заработало как нужно!
В любом случае всем спасибо за помощь и что не бросаете меня!

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт фев 07, 2014 14:20:36
Gudd-Head
Решил я уйти от записей вида 0b01010101 к более читаемым типа (1<<bit). Но чего-то я не догоняю.
Например,
Заместо WDCE и WDE компилятор из инклудового файла возьмёт цифры (числа), соответствующие порядковым номерам этих бит в регистре (WDTCR).
Единицы сдвинутся на соотв. позиции и логически сложатся, а на месте остальных бит будут нули?
А такая контрукция
Эквивалентна ldi r16, 0?
Можно задавать свои номера битам через .EQU? Вынести их в отдельный файл (например, для управления периферией) и подключать через .include?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт фев 07, 2014 14:28:47
Engineer_Keen
Gudd-Head писал(а):Решил я уйти от записей вида 0b01010101 к более читаемым типа (1<<bit).
Будет удобнее, гарантирую
Gudd-Head писал(а):
Заместо WDCE и WDE компилятор из инклудового файла возьмёт цифры (числа), соответствующие порядковым номерам этих бит в регистре (WDTCR).
Единицы сдвинутся на соотв. позиции и логически сложатся, а на месте остальных бит будут нули?
Именно так.
Gudd-Head писал(а):
А такая контрукция
Эквивалентна ldi r16, 0?
Да, чисто для удобства отладки. Надо записал туда 1, не нужно вспоминать номер бита или по новой набирать комбинацию "(1<< )"
Gudd-Head писал(а):
Можно задавать свои номера битам через .EQU? Вынести их в отдельный файл (например, для управления периферией) и подключать через .include?
Ну естественно, я так всегда и делаю

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт фев 07, 2014 14:33:55
Gudd-Head
Ну собсно, я пока писал, сам и разобрался. Не стал уж удалять текст — жалко
Только мне казалось что можно как в Сях когда надо кучу единиц и пару нулей записать через
Или всё-таки как-то можно?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт фев 07, 2014 15:03:42
Seriyvolk
Нет, единицы так не запишутся.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт фев 07, 2014 15:12:48
Gudd-Head
Да я уж прогнал в студии.
А как-то через инверсию или ИСКЛ.ИЛИ можно малой кровью дать понять компилятору, что надо кучу единичек записать с помощью нескольких нулей?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт фев 07, 2014 15:19:53
Seriyvolk
Ну например так
LDI R16,(1<<Bit1)|(1<<Bit2)
COM R16
Записанные номера битов обернутся нулями. Хотя конкретная реализация в любом случае зависит от того, что нужно сделать.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт фев 07, 2014 15:22:06
Gudd-Head
Seriyvolk писал(а):LDI R16,(1<<Bit1)|(1<<Bit2)
COM R16
Не-не-не.
Во-первых, тут пишется единицами и
во вторых, лишняя команда в ПП.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт фев 07, 2014 15:22:17
ploop
Тут от синтаксиса ассемблера зависит.
COM - не годится, это уже исполняемый код, а надо маску средствами компилятора организовать.