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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
xorkrus
Нашел транзистор. Понюхал.
Сообщения: 151
Зарегистрирован: Сб ноя 19, 2011 20:13:47
Откуда: Тамбов
Контактная информация:

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

Сообщение xorkrus »

Здравия желаю, уважаемые.
Вот тут я нашел почти то, что хотел. Единственное - хотелось бы чтобы состояние порта возвращалось в исходное через 5 секунд после переключения из браузера.
Обратился к автору - он не ответил :(
Пробовал сам - не понимаю. Ассемблер мне не дается от слова совсем :(
Был бы очень признателен уважаемым котам, если бы смогли поправить проект. И ещё больше был бы признателен, если бы рассказали как :)
Вложения
tinyhttp.zip
(12.72 КБ) 125 скачиваний
Демократии нет и не будет!
Государство - это я!
Реклама
Pnjom-Penb
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

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

Сообщение Pnjom-Penb »

xorkrus писал(а):Пробовал сам - не понимаю. Ассемблер мне не дается от слова совсем.
Так напишите на Си, кто заставляет ограничиваться асмом?
Реклама
Аватара пользователя
xorkrus
Нашел транзистор. Понюхал.
Сообщения: 151
Зарегистрирован: Сб ноя 19, 2011 20:13:47
Откуда: Тамбов
Контактная информация:

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

Сообщение xorkrus »

Pnjom-Penb писал(а):Так напишите на Си, кто заставляет ограничиваться асмом?
Atmel. Места в тиньке2313 маловато.
Демократии нет и не будет!
Государство - это я!
Pnjom-Penb
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

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

Сообщение Pnjom-Penb »

Его в ней 2К, независимо от языка программирования.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
xorkrus
Нашел транзистор. Понюхал.
Сообщения: 151
Зарегистрирован: Сб ноя 19, 2011 20:13:47
Откуда: Тамбов
Контактная информация:

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

Сообщение xorkrus »

Pnjom-Penb
Я вас понял. Сложно помочь - так и скажите. Если бы сумел уложиться в 2кб, то не обращался бы за помощью к таким проектам, а сделал бы все сам. Но увы не все являются супер программистами. Снимаю свой вопрос.
Демократии нет и не будет!
Государство - это я!
Реклама
Pnjom-Penb
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

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

Сообщение Pnjom-Penb »

xorkrus писал(а):Сложно помочь - так и скажите.
Именно помочь я и пытаюсь, однако, Вы же ищете не помощи, а того, чтобы кто-то сделал все вместо вас. Этого мне делать некогда. Поместите свое предложение в раздел "Есть работа" - туда заглядывают как раз те, кто может потратить свое время на решение ваших задач вместо вас - и все разрешится к вашему удовольствию.
Реклама
dgrett
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

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

Сообщение dgrett »

Привет всем!. Столкнулся я с непонятной мне вещью. Может кто разъяснит?
Есть обработчик прерывания по переполнению Timer0. Назвал его "Taimer". Он для того, чтобы если за определённое время не придёт некое событие не ждать тупо, а прыгать на метку . А вопрос в том, что при выходе из обработчика по RETI всё нормально, а вот если не дождались события выкидываю из стека адрес возврата и выхожу по RJMP, на метку . Но стек почему-то переполняется, после каждого перехода на метку SPL уменьшается на 2 (выводил в УАРТ SPL). Пришлось добавить ещё 2 POP, тогда всё нормально работает. Получилось 4 POP. Почему так?
Да, камень AT2313, Avr Studio4

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

Taimer:
	in 		r0,SREG
	inc		interrupt
	cpi		interrupt,80
	breq	        rst2
	out 	        SREG,r0
	reti
rst2:
 clr            interrupt
	pop		temp
	pop		temp
	pop		temp
	pop		temp
	rjmp	        taimer_overflow
Я всё-всё узнAю и стану профессором.
Аватара пользователя
Seriyvolk
Друг Кота
Сообщения: 4965
Зарегистрирован: Сб май 05, 2012 20:19:55
Откуда: Минск

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

Сообщение Seriyvolk »

Ну прыгнул ты. А "out SREG,r0" кто будет делать?
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
dgrett
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

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

Сообщение dgrett »

Seriyvolk писал(а):Ну прыгнул ты. А "out SREG,r0" кто будет делать?
Там, куда я прыгнул, SREG мне и нафиг не нужен, там почти начало прогрмаммы. Вопрос в стеке. SREG к стеку никакого отношения не имеет.
Я всё-всё узнAю и стану профессором.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

По мне, это плохая практика. Почему бы не так
Спойлер

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

	.INCLUDE "tn2313def.inc"

.def	interrupt=r18
.def	temp=r16
	.CSEG

	.ORG	$0000
	RJMP	START

	.ORG	$0006
Taimer:
   inc      interrupt
   cpi      interrupt,80
;   breq           rst2
	BRLO	PC+2
	SET		; взвести флаг
	clr		interrupt
   reti
;rst2:
; clr            interrupt
 ;  pop      temp
  ; pop      temp
   ;pop      temp
;   pop      temp
;   rjmp		WAIT
;   rjmp           taimer_overflow


START:
	LDI	R22,LOW(RAMEND)
	OUT	SPL,R22

	LDI	R20,1<<TOIE0
	OUT	TIMSK,R20
	OUT	TIFR,R20

	LDI	R20,1<<SE
	OUT	MCUCR,R20

	LDI	R22,1
	OUT	TCCR0B,R22

	CLT
	SEI

WAIT:
	SLEEP
	BRTC	WAIT
taimer_overflow:
	NOP
	RJMP	START
.EXIT
dgrett
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

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

Сообщение dgrett »

А, понял, там, где ждём события дополнительно проверяем Т и если он взведён то уже оттуда прыгаем на метку? Или опять я не приехал?. Только по адресу $0006 будет RJMP, т.к. планирую завести собаку и она покусается с обработчиком по переполнению.
И всё же, почему мне пришлось ставить 4 POP а не 2? Просто интересно.
Я всё-всё узнAю и стану профессором.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

dgrett писал(а):И всё же, почему мне пришлось ставить 4 POP а не 2? Просто интересно.
Не всё так безоблачно. Студия считает, что при выходе на метку указатель стека изменяется.
RJMP_ISR.GIF
dgrett
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

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

Сообщение dgrett »

akl писал(а):Не всё так безоблачно. Студия считает, что при выходе на метку указатель стека изменяется.
Да я тоже симулял свой код и следил за стеком. Всё ОК и с 2 ПОП ( в interrupt ставил 1, чтоб не гонять одно и то же 80 раз). Так ведь в железяке тинька перезагружалась, я потому и стал копаться. А за науку спасибо.
Я всё-всё узнAю и стану профессором.
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

Вообще-то это решается двумя короткими командами и akl их написал в своём коде
Святовит
Родился
Сообщения: 10
Зарегистрирован: Вс авг 23, 2015 16:12:23

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

Сообщение Святовит »

Доброго времени суток, уважаемые форумчане!
Прошу о помощи в таком вопросе - как настроить прерывания??? :shock:

Контроллер - мега 16а
схема - на макетке распаяны через сопротивление светодиоды на порт А, на выводы INT0, INT1, int2 и ресет - кнопки на землю тактовые

дополнительно - светодиод на одной из лап порта С, как индикатор включения - при инициализации вывожу тудой 1, и он горит, или если чего-то не так - переставляю эти строчки в другую часть кода и смотрю, дошел ли процесс до них

задача - продвинуть хелловорд так, чтобы по нажатию клавиши на INT0 значения на светодиодах порта А "замерзали", по нажатию INT1 - выводили значение счетчика нажатий (регистра 21), ну 3 кнопка на INT 2 вырубала камень до лучших времен.

ПРОБЛЕМА: не работают кнопки. Тоесть цикл А выполняется, светики мигают и больше ничего не происходит(((
ПОМОГИТЕ :cry:

(пишу в атмел студио 4 и программатор аврисп мк2 клон)

/код прилагаю/
//си не предлагать//

.include "D:\all\AVR-projects\m16adef.inc"
.cseg
.org 0
jmp RESET
.org INT0addr ; External Interrupt Request 0
;reti
rjmp ext_int0
.org INT1addr ; External Interrupt Request 1
;reti
rjmp ext_int1
.org OC2addr ; Timer/Counter2 Compare Match
reti
.org OVF2addr ; Timer/Counter2 Overflow
reti
.org ICP1addr ; Timer/Counter1 Capture Event
reti
.org OC1Aaddr ; Timer/Counter1 Compare Match A
reti
.org OC1Baddr ; Timer/Counter1 Compare Match B
reti
.org OVF1addr ; Timer/Counter1 Overflow
reti
.org OVF0addr ; Timer/Counter0 Overflow
reti
.org SPIaddr ; Serial Transfer Complete
reti
.org URXCaddr ; USART, Rx Complete
reti
.org UDREaddr ; USART Data Register Empty
reti
.org UTXCaddr ; USART, Tx Complete
reti
.org ADCCaddr ; ADC Conversion Complete
reti
.org ERDYaddr ; EEPROM Ready
reti
.org ACIaddr ; Analog Comparator
reti
.org TWIaddr ; 2-wire Serial Interface
reti
.org INT2addr ; External Interrupt Request 2
reti
rjmp ext_int2
.org OC0addr ; Timer/Counter0 Compare Match
reti
.org SPMRaddr
reti
RESET:
ldi r16, 0x04
out SPL,r16
ldi r16, 0x5f
out SPH,r16
ldi r16,0xff
out DDRC,r16
ldi r16,0x00
out DDRD,r16
ldi r16,0x00
out DDRB,r16
ldi r16,0xff
out PortD,r16
ldi r16,0xff
out DDRa,r16
in r16,MCUCR
sbr r16,(1<<ISC01)|(0<<ISC00)|(0<<ISC10)|(1<<ISC11)
out MCUCR,r16
in r16, gifr
sbr r16, (0<<INTF0)|(0<<INTF1)|(0<<INTF1)
out gifr, r16
ldi r16, 0x33
OUT GICR, r16
in r16,MCUCR
sbr r16,(1<<sm2)|(1<<sm1)|(1<<sm0)
out MCUCR,r16
ldi r16,0xff
out portc,r16
ldi r17, 0x02
ldi r18, 0xff
ldi r21, 0x00
sei

a:
inc r21
inc r18
out porta, r18
ldi r20, 0x00
ldi r21, 0x00
ldi r22, 0x0f
ba:
dec r20
brne ba
dec r21
brne ba
dec r22
brne ba
rjmp a

EXT_INT0:
r: jmp r
reti

EXT_INT1:
out portc, r21
ra: jmp ra
reti

EXT_INT2:
sleep
in r16,MCUCR
sbr r16,(0<<se)
out MCUCR,r16
reti
Святовит
Родился
Сообщения: 10
Зарегистрирован: Вс авг 23, 2015 16:12:23

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

Сообщение Святовит »

так, один вопрос я решил - первая кнопка на INT0 заработала
просто забыл включить ее

было:

ldi r16, 0x33
OUT GICR, r16

А надо:

"ldi r16, 0xe3
OUT GICR, r16"

но теперь вторая кнопка - INT1, выключает светодиоид на порте С и тоже замораживает состояние светодиодов, но 21 регистр не выводит

и третья по прежнему не работает

Что не так???

И чем культурным можно заменить зацикливание:

EXT_INT0:
r: jmp r
reti

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

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

Сообщение akl »

1. Указатель стека установлен неправильно

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

RESET:
	LDI	R16,HIGH(RAMEND)
	LDI	R17,LOW(RAMEND)
	OUT	SPH,R16
	OUT	SPL,R17

;ldi r16, 0x04 
;out SPL,r16
;ldi r16, 0x5f
;out SPH,r16 
2.Чтобы был переход обслуживание INT2

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

.org INT2addr	; External Interrupt Request 2
;;;;;;;;;;;;;;;;;;reti
rjmp ext_int2
3. Сброс флагов у AVR осуществляется записью 1

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

;	in r16, gifr 
;	sbr r16, (0<<INTF0)|(0<<INTF1)|(0<<INTF1)
;out gifr, r16


	LDI	R22,(1<<INT2|1<<INT1|1<<INT0)
	OUT	GICR,R22
	OUT	GIFR,R22
;ldi r16, 0x33
;OUT	GICR, r16
4.Чтобы не было недоразумений при работе порта С, отключите JTAG

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

 LDI R16,1<<JTD
 OUT MCUCSR,R16
5. Добавил таймер Т1 на выдержку ~1 секунды для счетчика
Спойлер

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

.include "m16adef.inc"
.cseg
.org 0
jmp RESET
.org INT0addr ; External Interrupt Request 0
;reti
rjmp ext_int0
.org INT1addr ; External Interrupt Request 1
;reti
rjmp ext_int1
.org OC2addr ; Timer/Counter2 Compare Match
reti
.org OVF2addr ; Timer/Counter2 Overflow
reti
.org ICP1addr ; Timer/Counter1 Capture Event
reti
.org OC1Aaddr ; Timer/Counter1 Compare Match A
reti
.org OC1Baddr ; Timer/Counter1 Compare Match B
reti
.org OVF1addr ; Timer/Counter1 Overflow
	RJMP	OVER_T1
;reti
.org OVF0addr ; Timer/Counter0 Overflow
reti
.org SPIaddr ; Serial Transfer Complete
reti
.org URXCaddr ; USART, Rx Complete
reti
.org UDREaddr ; USART Data Register Empty
reti
.org UTXCaddr ; USART, Tx Complete
reti
.org ADCCaddr ; ADC Conversion Complete
reti
.org ERDYaddr ; EEPROM Ready
reti
.org ACIaddr ; Analog Comparator
reti
.org TWIaddr ; 2-wire Serial Interface
reti
.org INT2addr ; External Interrupt Request 2
;reti
rjmp ext_int2
.org OC0addr ; Timer/Counter0 Compare Match
reti
.org SPMRaddr
reti

OVER_T1:
	SBIW	XL,1
	BRNE	OVER_T1_OUT
	INC	R18	
	OUT	PORTA,R18
	LDI	XH,HIGH(1*Fo/65536)
	LDI	XL,LOW(1*Fo/65536)
OVER_T1_OUT:
	RETI
;*******************************
RESET:
	ldi r16, 0x04
	out SPH,r16
	ldi r16, 0x5f
	out SPL,r16

	LDI R16,1<<JTD
	OUT MCUCSR,R16	; отключить JTAG

	SBI	ACSR,ACD	; отключить аналоговый компаратор

	ldi r18, 0
	ldi r21, 0x00

ldi r16,0xff
out DDRC,r16
ldi r16,0x00
out DDRD,r16
ldi r16,0x00
out DDRB,r16
ldi r16,0xff
out PortD,r16
ldi r16,0xff
out DDRa,r16
	OUT	PORTA,R18
;in r16,MCUCR
	LDI r16,(1<<SE)|(1<<ISC01)|(0<<ISC00)|(0<<ISC10)|(1<<ISC11)
	out MCUCR,r16
;in r16, gifr
;sbr r16, (0<<INTF0)|(0<<INTF1)|(0<<INTF1)
;out gifr, r16
	LDI r16, 1<<INT2|1<<INT1|1<<INT0
	OUT GICR,r16
	OUT	GIFR,R16
;*******************************
.equ	Fo=1000000
	LDI	XH,BYTE4(1*Fo)
	LDI	XL,BYTE3(1*Fo)


	LDI	R16,1<<TOIE1
	OUT	TIMSK,R16
	OUT	TIFR,R16

	LDI	R16,1
	OUT	TCCR1B,R16
;*******************************
;in r16,MCUCR
;sbr r16,(1<<sm2)|(1<<sm1)|(1<<sm0)
;out MCUCR,r16
;ldi r16,0xff
;out portc,r16
;ldi r17, 0x02
;ldi r18, 0xff
;ldi r21, 0x00
	sei
WAIT:
	SLEEP
	NOP
	RJMP	WAIT
;a:
;inc r21
;inc r18
;out porta, r18
;ldi r20, 0x00
;ldi r21, 0x00
;ldi r22, 0x0f
;ba:
;dec r20
;brne ba
;dec r21
;brne ba
;dec r22
;brne ba
;rjmp a

EXT_INT0:
	LDI	R17,1
	IN	R16,TCCR1B
	EOR	R16,R17
	OUT	TCCR1B,R16	; переключатель остановки/запуска таймера Т1

	LDI	XH,HIGH(1*Fo/65536)
	LDI	XL,LOW(1*Fo/65536)

;r: jmp r
	reti

EXT_INT1:
	INC	R21
	out portc, r21
	LDI	R16,1
	OUT	TCCR1B,R16
;ra: jmp ra
	reti

EXT_INT2:
;sleep
	LDI	R16,1<<SE
	OUT	MCUCR,R16	; только низкий уровень на INT0,INT1
;	in r16,MCUCR
;	CBR r16,(0<<se)
;	out MCUCR,r16
	reti
.EXIT
Святовит
Родился
Сообщения: 10
Зарегистрирован: Вс авг 23, 2015 16:12:23

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

Сообщение Святовит »

Спасибо за подсказки, я все учёл, но не все понял.
Я переписал этот код и теперь дела поправились, но не полностью - поэтому все по пунктам:
1.
А в чем разница - ведь значение адреса памяти статическое значение, и его надо просто вывести?
Я просто посмотрел адрес и так и написал, конечно, это не так культурно, но ведь программа вроде и так и так работает одинаково???
2.
блин, забыл)))
3.
ладно буду теперь внимательнее читать даташит...
4.
хорошо, получается сигналы на портах могут вызвать сбои в работе из-за доп. интерфейсов включенных? а если в будущем нужно будет сразу несколько функций на одно ноге использовать???

5.......
я так боялся таймера... и теперь он работает!!! :))
_____________
а шо цэ такэ??
счетчик? а зачем он??
.equ   Fo=1000000
LDI XH,BYTE4(1*Fo)
LDI   XL,BYTE3(1*Fo
____________
LDI   XH,HIGH(1*Fo/65536)
LDI   XL,LOW(1*Fo/65536)

и я так и не понял как работает SLEEP

и кнопка на INT2 ничего не делает, а надо чтоб контроллер "впадал в спячку", и после нажатия чего-то другого опять оживал, и продолжал работать оттуда где закончил

на кнопках вполне ощутим дребезг, как его уничтожить? :?

и вот еще - а чего обработчик прерывания по переполнению таймера у вас находится перед инициализацией???

П.С. Походу что-то не так с выводом INT2, переписал код - та кнопка не работает в любых случаях
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

1. Указатель стека устанавливается в допустимой области RAM контроллера. Вы же установили SP=0x5F04 вместо SP=0x045F
5. Да, это грубый таймер 1 секунды привязанный к тактовой контроллера. Грубый, потому что не учитывает состояние TCNTx. Допустим, время дребезга контакта кнопок ~10мс. Заносим в OCR1B значение (TCNT1+10*Fo/1000) Включаем прерывание OC1B, чистим флаг OCF1B. Таймер отсчитывает заданное время, вызывается прерывание OC1B, в котором чистится флаг INTx. Примерно тоже самое делается при отпускании кнопки, которое так же может вызывать дребезг.
Работу команды SLEEP можно увидеть, подав питание на контроллер через миллиамперметр.
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Сообщение СКАЗОЧНИК »

Вопрос.
Есть у меня датчик температуры DS18B20, он выдает температуру как есть и отрицательную температуру в дополнительном коде, т.е. в старшем бите байта появляется единица.
Итого у меня есть некая переменная temp1, в которую отправляется температура с датчика в вышеуказанном виде, т.е. старший бит - знак температуры, а остальные 7 бит - сама температура в прямом либо дополнительном коде (от знака зависит).

Есть у меня переменная другая - ZUUM, в ней содержится число для сравнения из диапазона +125 до -55.

А вот код, который не пашет, т.к. я делаю что-то не так.

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

	;---------------------------------------- Обработка выхода --------------
						cp  ZUUM, temp1
						brlt ENN
							 cbi KEYPORT,KEYPIN
							 rjmp EN
						ENN: sbi KEYPORT,KEYPIN	
		;------------------------------------------------------------------------	
Как правильно сделать сравнение переменных, чтобы при понижении температуры как в положительной так и в отрицательной срабатывала нагрузка?
У меня в положительной срабатывает, когда падает ниже, например 23 градусов. Но если будет установлен придел до -2, то фигню всякую гонит...
Станислав
Ответить

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