Страница 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
В коде запускаю таймер так:

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

           LDI R16,1<<OCIE1A
		OUT TIMSK,R16 
А не стартует... Может упустил я чего?

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). Но чего-то я не догоняю.
Например,

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

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

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

ldi r16, (0<<WDE)
Эквивалентна ldi r16, 0?
Можно задавать свои номера битам через .EQU? Вынести их в отдельный файл (например, для управления периферией) и подключать через .include?

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

Добавлено: Пт фев 07, 2014 14:28:47
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:

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

Добавлено: Пт фев 07, 2014 14:33:55
Gudd-Head
Ну собсно, я пока писал, сам и разобрался. Не стал уж удалять текст — жалко :)
Только мне казалось что можно как в Сях когда надо кучу единиц и пару нулей записать через

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

(0<<WDCE)&(0<<WDE)
Или всё-таки как-то можно?

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
:shock:
Не-не-не.
Во-первых, тут пишется единицами и
во вторых, лишняя команда в ПП.

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

Добавлено: Пт фев 07, 2014 15:22:17
ploop
Тут от синтаксиса ассемблера зависит.
COM - не годится, это уже исполняемый код, а надо маску средствами компилятора организовать.