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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Coldheart
Прорезались зубы
Сообщения: 244
Зарегистрирован: Пт сен 10, 2010 20:39:32
Откуда: Украина Луганская обл.

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

Сообщение Coldheart »

akl писал(а):Да, не катит. Попробуйте в соответствии с DS Изображение
mega168_insrt_set.GIF
Это я уже смотрел.
Ну допустим что на STS не ругается.
почему же тогда проверка

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

          ldi r16,(1<<1)
	sts DDRB,r16
Не работает!?
Т.е. компилятор не ругается а реальный контроллер ножку к земле не прибивает.
Или в данном случае это не применимо?

Я просто разные варианты уже проработал, не хотят биты устанавливатся в регистры что-то.
Если у кого пример кода есть, поделитесь пожалуйсто :solder:
Реклама
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

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

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

Сообщение Kavka »

Ну вы блин даёте :)
В одном месте посмотрели и думаете, что всё? Неа! :)
Открываем m168def.inc и внимательно смотрим. А смотрим вот куда.

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

.equ	PRR	= 0x64	; MEMORY MAPPED
.equ	CLKPR	= 0x61	; MEMORY MAPPED
.equ	WDTCSR	= 0x60	; MEMORY MAPPED
.equ	SREG	= 0x3f
.equ	SPL	= 0x3d
.equ	SPH	= 0x3e
Сопоставляем волшебное число 0x20 из приведённой ранее цитаты из спецификации с приведённой выдержкой и погружаемся в Дзен. :))
А чтобы погружение было таким как надо - используйте макросы. Например из заметок по применению AVR001. :)
Спойлер

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

;*****************************************************************
;*	file: macros.inc
;*
;*	Description:
;*	Source file for application note AVR001 - Conditional Assembly
;*	and Portability Macros.
;*
;*	Defines a number of macros that makes it easier to access
;*	IO registers and extended IO registers (or SRAM locations up
;*  to adress $FF if applicable).
;*	The macros can be used to produce code that assembles to
;*	any target AVR, without considering if the accessed IO
;*	registers are located in low, standard or extended IO space
;*
;* $Revision: 2.2 $	
;* $Author: jllassen $
;* $Date: Wednesday, January 26, 2005 10:55:18 UTC $
;*****************************************************************

;*********************************************************
;*	BIT access anywhere in IO or lower $FF of data space
;*	SETB - SET Bit in IO of data space
;*	CLRB - CLeaR Bit in IO of data space
;*********************************************************

.MACRO SETB 		;Arguments: Address, Bit, Register
	.if @1>7
		.message "Only values 0-7 allowed for Bit parameter"
	.endif
	.if @0>0x3F
		lds  @2, @0
		sbr  @2, (1<<@1)
		sts  @0, @2
	.elif @0>0x1F
		in   @2, @0
		sbr  @2, (1<<@1)
		out  @0, @2
	.else
		sbi  @0, @1
	.endif
.ENDMACRO

.MACRO CLRB 		;Arguments: Address, Bit, Register
	.if @1>7
		.message "Only values 0-7 allowed for Bit parameter"
	.endif
	.if @0>0x3F
		lds  @2, @0
		cbr  @2, (1<<@1)
		sts  @0, @2
	.elif @0>0x1F
		in   @2, @0
		cbr  @2, (1<<@1)
		out  @0, @2
	.else
		cbi  @0, @1
	.endif
.ENDMACRO

;*********************************************************
;*	Bit test anywhere in IO or in lower $FF of data space
;*  SKBS : SKip if Bit Set
;*  SKBC : SKip if Bit Cleared
;*********************************************************
.MACRO SKBS  		;Arguments: Address, Bit, Register
	.if @1>7
		.message "Only values 0-7 allowed for Bit parameter"
	.endif
	.if @0>0x3F
		lds  @2, @0
		sbrs @2, @1
	.elif @0>0x1F
		in   @2, @0
		sbrs @2, @1
	.else
		sbis @0, @1
	.endif
.ENDMACRO

.MACRO SKBC  		;Arguments: Address, Bit, Register
	.if @1>7
		.message "Only values 0-7 allowed for Bit parameter"
	.endif
	.if @0>0x3F
		lds	 @2, @0
		sbrc @2, @1
	.elif @0>0x1F
		in	 @2, @0
		sbrc @2, @1
	.else
		sbic @0, @1
	.endif
.ENDMACRO

;*********************************************************
;*	Byte access anywhere in IO or lower $FF of data space
;* 	STORE - Store register in IO or data space
;* 	LOAD  - Load register from IO or data space
;*********************************************************

.MACRO STORE 		;Arguments: Address, Register
	.if	@0>0x3F
		sts	@0, @1
	.else
		out	@0, @1
	.endif
.ENDMACRO

.MACRO LOAD 		;Arguments: Register, Address
	.if	@1>0x3F
		lds	@0, @1
	.else
		in	@0, @1
	.endif
.ENDMACRO
Для новичков настоятельно рекомендую вникнуть в макросы, так как некоторым требуется "врЕменный" регистр.

Удачи!
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
Coldheart
Прорезались зубы
Сообщения: 244
Зарегистрирован: Пт сен 10, 2010 20:39:32
Откуда: Украина Луганская обл.

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

Сообщение Coldheart »

Погружение в Дзен обязательно будет - НО чуть позже! :)
Сейчас же в порядке первой срочности надо запустить таймер а асинхронном режиме.
Значит накарлякал я вот такое!
Спойлер

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

.include "m168def.inc"

.dseg
.cseg
	.ORG 0x000 ; Reset Handler
    rjmp Reset	  
	.ORG 0x001 ; IRQ0 Handler
	RETI  
	.ORG 0x002 ; IRQ1 Handler
	RETI 
	.ORG 0x003 ; PCINT0 Handler
	RETI
	.ORG 0x004 ; PCINT1 Handler
	RETI
	.ORG 0x005 ; PCINT2 Handler
	RETI
	.ORG 0x006 ; Watchdog Timer Handler
	RETI 
	.ORG 0x007 ; Timer2 Compare A Handler
	RETI 
	.ORG 0x008 ; Timer2 Compare B Handler
	RETI 
	.ORG 0x009 ; Timer2 Overflow Handler
	rjmp Klac
	.ORG 0x00A ; Timer1 Capture Handler
	RETI 
	.ORG 0x00B ; Timer1 Compare A Handler
	RETI
	.ORG 0x00C ; Timer1 Compare B Handler
	RETI 
	.ORG 0x00D ; Timer1 Overflow Handler
	RETI
	.ORG 0x00E ; Timer0 Compare A Handler
	RETI 
	.ORG 0x00F ; Timer0 Compare B Handler
	RETI
	.ORG 0x010 ; Timer0 Overflow Handler
	RETI
	.ORG 0x011 ; SPI Transfer Complete Handler
	RETI
	.ORG 0x012 ; USART, RX Complete Handler
	RETI
	.ORG 0x013 ; USART, UDR Empty Handler
	RETI
	.ORG 0x014 ; USART, TX Complete Handler
	RETI
	.ORG 0x015 ; ADC Conversion Complete Handler
	RETI
	.ORG 0x016 ; EEPROM Ready Handler
	RETI
	.ORG 0x017 ; Analog Comparator Handler
	RETI 
	.ORG 0x018 ; 2-wire Serial Interface Handler
	RETI
	.ORG 0x019 ; Store Program Memory Ready Handler
	RETI
	.ORG   INT_VECTORS_SIZE	; Конец таблицы прерываний
	
Reset:

	
	ldi r16,low(RamEnd)
	out SPL,r16

	ldi r16,high(RamEnd)
	out SPH,r16

	ldi r16,0b00001111
	out DDRB,r16

	ldi r16,0b11111111
	out DDRD,r16

	cli ; запрещаем прерывания

	ldi r16,(1<<OCIE2A)|(1<<OCIE2B)|(1<<TOIE2); Запрещаем прерывания TC2, обнуляя OCIE2x и TOIE2 
	sts TIMSK2,r16

	ldi r16,(1<<AS2); Переводим ТС2 в асинхронный режим
	sts ASSR,r16

	rcall Delay1 

	clr r16
	sts TCNT2,r16; Обнуляем ТСNТ2
	
	ldi r16,(1<<CS22)|(1<<CS20); Устанавливаем предделитель = 128
	sts TCCR2B,r16

re:	
	lds r16,ASSR
	andi r16,0b00011111
	brne re ; ждем пока обнулятся биты : TCN2UB, OCR2AUB, OCR2BUB, TCR2AUB и TCR2BUB.
	
	clr r16
	ldi r16,(1<<OCF2A)|(1<<OCF2B)|(1<<TOV2) ; Обнуляем флаги прерываний Timer/Counter2
	sts TIFR2,r16

	ldi r16,(1<<TOIE2);Разрешаем прерывание по переполнению таймера 2
	sts TIMSK2,r16

	sei	


Indic:					 ;Цикл индикации	

	mov R22,R23
	rcall Decoder
	out PortD,R17
	sbi PortB,3
	rcall Delay       
    cbi PortB,3
	 
	
	mov R22,R24
	rcall Decoder
	cbr R17,0b10000000         
	out PortD,R17      
	sbi PortB,2
	rcall Delay
	cbi PortB,2

	mov R22,r25
	rcall Decoder        
	out PortD,R17      
	sbi PortB,1
	rcall Delay 
	cbi PortB,1

	mov R22,r26
	rcall Decoder       
	out PortD,R17    
	sbi PortB,0
	rcall Delay
	cbi PortB,0
	
	rjmp Indic 			

Klac:					; Переходим сюда каждые 128 переподнений Второго таймера
rcall CycleINC
reti

CycleINC:				;!!!ЦИКЛ УВЕЛИЧЕНИЯ!!!	
	inc r23
	cpi r23,7
	breq M
	ret
M:
	clr r23	
	inc r24
	cpi r24,7
	breq F
	ret
F:
	clr r24	
	inc r25
	cpi r25,3
	breq W
	ret
W:
	clr r25	
	inc r26
	cpi r26,2
	breq T
	ret
T:
	clr r26
	reti


Decoder:				

	ldi ZL,Low(DcMatrix*2)   	;инициализация массива
	ldi ZH,High(DcMatrix*2)
	ldi R18,0 					;прибавление переменной
	add ZL,R22           		;к 0-му адресу массива
	adc ZH,R18

	lpm                     	;загрузка значения
    mov R17,r0  
	ret


DcMatrix:
;массив - таблица истинности декодера
        ; hgfedcba   hgfedcba
	.db 0b11000000,0b11111001	;0,1
	.db 0b10100100,0b10110000	;2,3
	.db 0b10011001,0b10010010	;4,5
	.db 0b10000010,0b11111000	;6,7
	.db 0b10000000,0b10010000	;8,9


	Delay:
	ldi R20,10
	ldi R21,4
d1:       
	dec R20
	brne d1
	dec R21
	brne d1
	ret

Delay1:
	ldi R20,200
	ldi R21,200
d2:       
	dec R20
	brne d2
	dec R21
	brne d2
	ret
	
.eseg
Пока вопрос только один!
Как у меня в R23 попадает число 7 из TIFR2 :shock: ?
Ну и таймер соответственно никак не хочет запускаться :(
Хотя ножки TOSC1 и TOSC2 в Протеусе оживают после добавления инициализации.
На индикацию пока внимания не обращаем - но она сама по себе тикает, а вот с переполнением ТС2 никак (
В чем тут может быть дело? Сомневаюсь насчет инициализации таймера. Правильна ли она?
Вложения
Mega168timer.rar
(21.79 КБ) 135 скачиваний
Реклама
Эиком - электронные компоненты и радиодетали
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Coldheart писал(а):Как у меня в R23 попадает число 7 из TIFR2
В коде командами

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

   ldi r16,(1<<OCF2A)|(1<<OCF2B)|(1<<TOV2) ; Обнуляем флаги прерываний Timer/Counter2
   sts TIFR2,r16
идет обращение именно к R23, а не к TIFR2
Т.к. адрес TIFR2 находится в области доступа IN/OUT, нужно и обращаться к нему соответственно

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

;   clr r16
   ldi r16,(1<<OCF2A)|(1<<OCF2B)|(1<<TOV2) ; Обнуляем флаги прерываний Timer/Counter2
   OUT TIFR2,r16
;   sts TIFR2,r16
Таблица прерываний для m168 выглядит так
СпойлерИзображение
interrupt_m168.GIF
поэтому будут проблемы с переходом на обслуживание прерывания. :)
Реклама
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

Coldheart писал(а):Подскажите как установить, сбросить бит в регистры по адресу выше 0х70 ?
Контроллер Мега168
написать макрос и забыть.......

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

.macro  outi
	ldi	r16,@1
   .if(@0 > 0x3F)
   sts @0,r16
   .else
   out @0,r16
   .endif
.endm
пишем например outi DDRC,0x1F, а макрос сам разберется, что использовать out или sts
Реклама
Аватара пользователя
gauss
Держит паяльник хвостом
Сообщения: 920
Зарегистрирован: Сб янв 16, 2010 15:34:57
Откуда: Sevsk/Moscow

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

Сообщение gauss »

Вопрос по прерыванию. Запускается по достижению таймером опр. значения.
Допустим, обработчик прерывания запустился. Продолжает ли таймер считать дальше, или счет останавливается до выхода из обработчика?
:idea:
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

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

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

Сообщение Kavka »

gauss, представьте.
Едет машина. И тут мужик с "феном" ГИБДДшник с радаром и, опа, радар зафиксировал скорость - 150км/ч. Остановиться ли машина в момент фиксации радаром скорости? Нет. Событие произошло - радар зафиксировал скорость. А машина как ехала, так и едет. :)
Так и с таймером - событие достижения таймером опр. значения генерирует прерывание, а таймер (счётчик) продолжает работать сам по себе.
Вот тут, прямо в начале, есть пример для AVR-ок.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

Ох чувствую пример из жизни :)))
Аватара пользователя
gauss
Держит паяльник хвостом
Сообщения: 920
Зарегистрирован: Сб янв 16, 2010 15:34:57
Откуда: Sevsk/Moscow

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

Сообщение gauss »

Вопрос по макросу.
Пишем какой-либо макрос.
В коде программы вызываем, его, допустим, 10 раз. Получается, при записи в МК компилятор тупо запишет фрагмент кода 10 раз, тем самым существенно увеличив память?
:idea:
SmarTrunk
Друг Кота
Сообщения: 6014
Зарегистрирован: Чт ноя 26, 2009 11:16:50
Откуда: Москва

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

Сообщение SmarTrunk »

Да, размер программного кода увеличится, но уменьшится время выполнения, т.к. обойдется без команд CALL (RCALL) и RETI, поэтому будет быстрее. Оба варианта могут быть хороши, в зависимости от ситуации. Можно же попробовать, и выяснить - влезает ли код во ФЛЕШ (можно и старший МК взять, с бОльшей памятью).
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

Обычно макросы используют с параметрами. Причем в качестве параметра можно передавать часть имени метки, переменной и т.д. что не по силам для обычных процедур. Вообще макросы по большей части предназначены для сокращения однотипных текстов в исходнике а не как замена подпрограмм. Макросом можно так же заменить однотипные последовательности в программе, которые есть необходимость менять все сразу.
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

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

Сообщение shads »

Alexeyslav писал(а):Причем в качестве параметра можно передавать часть имени метки, переменной и т.д. что не по силам для обычных процедур.
А можно об этом подробнее.....
Примерчиком например.....
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

shads, здесь уже это было, специально для Вас нашел. Там обсуждение разворачивается в несколько постов ниже. Я указал на первый.
Ставим плюсы: )
Аватара пользователя
gauss
Держит паяльник хвостом
Сообщения: 920
Зарегистрирован: Сб янв 16, 2010 15:34:57
Откуда: Sevsk/Moscow

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

Сообщение gauss »

Ещё вопрос, по времени выполнению кода:
Сколько (примерно) миллисекунд будет выполняться такой код,

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

eeimp:
ldi delay,eetime
ldi delay2,eetime
LoopEE:
dec delay
nop
brne LoopEE
dec delay2
brne LoopEE
ret
если константа eetime=255, и МК тактируется от 8МГц кварца?
У меня получилось примерно 24 миллисекунды :)
:idea:
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

gauss писал(а):Сколько (примерно) миллисекунд будет выполняться такой код...
... все программные задержки удобно делать с помощью макроса, а не гадать "сколько будет" задержка

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

.equ	XL_CLOCK = 8000000; частота кварца
.......
.macro	_delay_us	
.if ((@0*XL_CLOCK/1000000)/4)>0x10000
.error "Overflow r25:r24"
.else
	ldi		r24,low((@0*XL_CLOCK/1000000)/4)
	ldi		r25,high((@0*XL_CLOCK/1000000)/4)
	sbiw 	r25:r24,1
	brne	PC-1
.endif
.endm
теперь в тексте программы достаточно написать

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

_delay_us 2000
, и задержка будет именно та , что задана (расчет сделает сам макрос)
Аватара пользователя
gauss
Держит паяльник хвостом
Сообщения: 920
Зарегистрирован: Сб янв 16, 2010 15:34:57
Откуда: Sevsk/Moscow

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

Сообщение gauss »

Разве в ассемблере есть условный оператор? Или это не асм?
:idea:
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

это директива препроцессора, она поддерживается и в ассемблере.
посмотрите мое предыдущее сообщение в этой теме, в нем ссылка на материал по макросам.
Ставим плюсы: )
Аватара пользователя
gauss
Держит паяльник хвостом
Сообщения: 920
Зарегистрирован: Сб янв 16, 2010 15:34:57
Откуда: Sevsk/Moscow

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

Сообщение gauss »

Такая строка кода:

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

ldi r16,@0-(@0/255)*255
После деления на 255 умножаться будет дробь, или целое число, если @0 не кратно 255?
:idea:
Ответить

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