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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
neoneon
Встал на лапы
Сообщения: 115
Зарегистрирован: Ср окт 22, 2014 07:39:26
Откуда: Омск

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

Сообщение neoneon »

ChipKiller писал(а):reti нужен в конце любого прерывания - стек и улетает из-за его отсутствия
Спасибо, буду разбираться :)
Полный чайник.
Реклама
Аватара пользователя
neoneon
Встал на лапы
Сообщения: 115
Зарегистрирован: Ср окт 22, 2014 07:39:26
Откуда: Омск

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

Сообщение neoneon »

А можно каким-то образом вручную обнулить значение таймера TCNT0? Не регистр же :?
Полный чайник.
Реклама
Аватара пользователя
Seriyvolk
Друг Кота
Сообщения: 4964
Зарегистрирован: Сб май 05, 2012 20:19:55
Откуда: Минск

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

Сообщение Seriyvolk »

neoneon писал(а): Спасибо, буду разбираться
Просто перед ждампом сделай РОР (два раза вроде, т.к. адрес двухбайтный) для выдёргивания адреса возврата из стека.
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Аватара пользователя
neoneon
Встал на лапы
Сообщения: 115
Зарегистрирован: Ср окт 22, 2014 07:39:26
Откуда: Омск

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

Сообщение neoneon »

Seriyvolk писал(а):
neoneon писал(а): Спасибо, буду разбираться
Просто перед ждампом сделай РОР (два раза вроде, т.к. адрес двухбайтный) для выдёргивания адреса возврата из стека.
Ставил, после третьего нажатия на кнопку в протеусе почему-то пропадает напряжение почти на всех ножках и 0 реакции. И сообщения: Push program stack: SP is not initialized
Полный чайник.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
neoneon
Встал на лапы
Сообщения: 115
Зарегистрирован: Ср окт 22, 2014 07:39:26
Откуда: Омск

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

Сообщение neoneon »

В общем, я сделал по-человечески, т.е.создал переменную (типа флага), на какое прерывание нужно переходить, reti после каждого прерывания. Но такая неприятная штука: показывает на переполнение стека по адресу 3c. Постоянно на этот адрес, даже если там программа закончилась...
В протеусе довольно странная зависимость получилась - если число, с которым сравнивается значение циклов, меньше 0x0f, то более-менее работает, хоть иногда и косяки в виде пропадания напряжения. Чем меньше число, тем стабильнее. (0f - секунд 7 горит, зависимость примерно линейная). Но если записать число для 3х минут - 0xCE0, то пропадает напряжение через 20 секунд, еще секунд через 10 ошибки Writing to memory location (число) outside of memory size 0xA0 :? Ни черта не понимаю, может, косяк самого протеуса? Хотя в дебаггере тоже переполнение :?
Вложения
temp.asm
(2.72 КБ) 413 скачиваний
333.PNG
(13.87 КБ) 500 скачиваний
Полный чайник.
Реклама
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

я сделал по-человечески, т.е.создал переменную (типа флага), на какое прерывание нужно переходить, reti после каждого прерывания
... по-человечески на прерывание не переходят - вход в прерывание происходит аппаратно .... косяк не у протеуса - советую в начале выучить матчасть.
Реклама
Аватара пользователя
neoneon
Встал на лапы
Сообщения: 115
Зарегистрирован: Ср окт 22, 2014 07:39:26
Откуда: Омск

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

Сообщение neoneon »

ChipKiller писал(а):
по-человечески на прерывание не переходят - вход в прерывание происходит аппаратно.
Я имел ввиду, в какой из видов сна переходит при соответствующем прерывании :) я знаю, что аппаратно, спасибо :)
Полный чайник.
Аватара пользователя
Andrew Martin
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Вт июн 25, 2013 18:45:07

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

Сообщение Andrew Martin »

Для начала таблицу прерываний нормально сделай, лучше всего сдери с даташита.

Что это за адреса такие?????


.cseg ; выбор сегмента - программный код

.org $000
rjmp nach ; (reset)

.org $001
rjmp Knopka ; появление 0 на PB1

.org $002
reti

.org $003
rjmp timer ; Timer\counter overflow
Аватара пользователя
Andrew Martin
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Вт июн 25, 2013 18:45:07

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

Сообщение Andrew Martin »

Кто так сравнивает двухбайтовые слова???

;проверка на достижение 3296
sei
cp srh, zh; сравниваем
brlo bla ; переход, если srh<zl
cp srl,zl ;
brlo bla ; переход если srl<zl


Для многобайтовых операций есть комманды adc, sbc, sbci, cpc.

Сравнить можно так:

cp srl,zl
cpc srh,zh
brlo bla

Если не видел - почитай справку.
Вложения
AVRASM.ZIP
(321.54 КБ) 172 скачивания
Аватара пользователя
neoneon
Встал на лапы
Сообщения: 115
Зарегистрирован: Ср окт 22, 2014 07:39:26
Откуда: Омск

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

Сообщение neoneon »

Я исправил, конечно, но проблема та же осталась :?
Скопировал текст программы в другой проект - ошибки исчезли О_о Но в протеусе так же пропадает напряжение через 20 сек.
Полный чайник.
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Странно. По мне, эта программа вообще не должна работать как задумано. Попробуйте
Спойлер

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

	.INCLUDE "tn13def.inc"

; ****************************
; Дата:  14.02.2015										ПРОВЕРКА ДРУГОЙ СТРУКТУРЫ
; Для AVR: ATtiny13A
; Тактовая частота: 4.8 МГц
; Выполняемые функции: включение светодиода на 3 минуты, двойное энергосбережение
; =========
; объявления
.equ	Fo=4800000

.def	temp=r16;
.def	flag=r19;
; =========
.cseg						; выбор сегмента - программный код
						
.org	$000
rjmp nach					; (reset)

.org	$001					
rjmp	Knopka				; появление 0 на PB1

.org    $002
reti

.org	$003				
Timer:						; Timer\counter overflow
	SBIW	ZH:ZL,1
	BRNE	 BLA

	ldi		temp,0b00000011	; выкл LED
	out		PortB, temp		;

	out		TIMSK0,R0		; запрещ прерыв таймера

	ldi		flag,0
	reti
; =========
Bla:
	cpi		flag,1
	brlo 	PC+3; переход, если  flag=0
	ldi		temp,0b00100000	; разрешение sleep (5 бит), idle (4-3 биты)
	out		MCUCR, temp		; сон для таймера
	RETI

; обработка прерывания
Knopka:
	out		GIMSK,R0		; запрещение прерывания от INT0

	LDI		R22,1<<SE
	OUT		MCUCR,R22		; режим работы SLEEP IDLE

	ldi		temp,0b00000010	; вкл LED
	out		PortB, temp		;				

	ldi		temp,0b00000010 ;
	out		TIMSK0, temp	;разрешение прерыв по переполнению
; очистка счетчика            
	ldi		temp,0b0000001 ; для проверки clk/1!!!!!!!!!
;	ldi		temp,0b0000101 ;		
	out		TCCR0B,temp		; clk/1024 - tccr0b=xxxx x101
; тут счетчик начал считать
	ldi		flag,$01		; флаг=1 -> переход в bla
	reti		
; =========
; =========
; =========
Nach:
	SBI	ACSR,ACD	; выключить аналоговый компаратор
; =========
; инициализация портов и периферии
	ldi		temp,0b11111111 ; 
	out		DDRB,temp		; 
	ldi		temp,0b00000011	; 
	out		PortB, temp		;

	CBI	DDRB,1		; лапу INT0(PB1) на вход с подтяжкой
	
	LDI	ZH,HIGH(3*60*Fo/256/1024)
	LDI	ZL,LOW(3*60*Fo/256/1024)	; загрузка значения 3 минуты
;	ldi		zh,$0C			;для числа 3296: zl=$E0, zh=$0C
;	ldi		zl,$E0			;

	CLR	R0
	OUT	TCNT0,R0

	ldi		temp,0b00110000	; разрешение sleep (5 бит), power down (4-3 биты),
	out		MCUCR, temp		; просыпается от низкого уровня на INT0 (1-0 биты)

	ldi		temp,0b01000000	; разрешение прерывания от INT0
	out		GIMSK, temp		;
	OUT		GIFR,temp
	sei
WAIT:
	SLEEP
; Основное тело программы
; flag=1? да - к таймеру. нет - спать
	CPI		flag,1
	BREQ 	WAIT; переход, если  flag=1

	rjmp Nach
.exit
Аватара пользователя
neoneon
Встал на лапы
Сообщения: 115
Зарегистрирован: Ср окт 22, 2014 07:39:26
Откуда: Омск

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

Сообщение neoneon »

По мне, эта программа вообще не должна работать как задумано.
Почему? :?
Попробуйте
Ошибок нет. Получилась зависимость времени(сек) от коэф. деления: 2(1), 11(8), 90(64), 360(256).
Поставил коэф. 64, изменил множитель в LDI ZH,HIGH(3*120*Fo/256/1024). Всё работает идеально :)) :)) Спасибо огромное, Akl ! Который раз уже выручаете :)) Только пока не разобрался в вашем коде. Вопросы появились:
1. Почему PB1 изменили на вход? Ведь прерывание работает независимо от того, на вход или выход работает ножка
2. ZH,HIGH(3*60*Fo/256/1024). F/1024=столько сделает подсчетов таймер за секунду. Делим еще на 256, получается 18,31... раз переполнится за секунду таймер. Умножаем на 180, получаем количество прерываний за 3 минуты. Но почему тогда светодиод выключился за 1.5 минуты?
3. Для чего установили флаг прерывания INT0 в GIFR в инициализации?
4. Если PB1 на вход, R вкл, то Pin.1=0. Если PB1 на вход, R вкл., затем вручную установить снова на вход, то Pin.1=0. Но! если PB1 на выход, R вкл., вручную установить на вход, то Pin.1=1. Почему так?

Понял, что я сильно замудрил :) у вас намного проще=> меньше вероятности ошибок
Полный чайник.
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

1. Вы, в дальнейшем, переходите в POWER DOWN и чтобы прерывание по низкому уровню! сработало нужно какое-то время (не менее 6 тактов) для возникновения генерации RC-генератора.
2. Думаю, что тактирование осуществляется от 9,6МГц
3. Сброс флагов требования прерываний осуществляется записью 1.
4. Эти манипуляции сделаны только для проверки в студии.
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

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

Привет всем еще раз. )
Возник у меня очередной тупой вопрос.
Есть некое число, которое представлено 25ю байтами в оперативке (может во флеше) МК АТТИНИ2313. Можно ли с ним делать операции сдвига? Как вообще нормально с ним работать?
Цель, сделать бегущий огонь. Описание его здесь:
http://radiokot.ru/forum/viewtopic.php? ... 7#p2304817

Как в итоге узнавать, что в конце числа уже есть единица? Как делать сдвиг 200 битового числа, чтобы последняя единица (единицы) не вываливались?

З.Ы. хочу обратить внимание, что ИМЕННО 200 светодиодов в линию и именно 25 регистров распаяно для их управления. Бежит огонек от одного конца к другому только ОДИН. остается в конце строки. ЗА ним следующий падает на первый и тоже остается уже вторым с конца. За ними третий. и т.д. до заполнения всей строки.

З.З.Ы. Спасибо. Уже сам все победил. Осталось только по таймеру выровнять.
Если у кого-то будут интересные предложения, обязательно выслушаю. А пока я сделал свой извращенный алгоритм и он работает в железе, не занимая оперативки. Все на циклах и числа в 200 бит как такового не существует... :)))
Станислав
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

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

Сообщение Engineer_Keen »

LSL, LSR - сдвиг влево и вправо, выдвинутый бит остается в С, с обратной стороны задвигается 0.
ROL , ROR - тоже самое, но задвигаемый бит берется как раз из С, так можно двигать влево-вправо числа любой битности.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

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

Понял. Знаю такие команды.
Однако на данный момент, сделал по своему. и неоптимизированный вариант эффекта не занимает оперативной и флеш памяти. Используются только регистры. Сам эффект при компиляции 116 Байт. И 56 Байт начальная конфигурация МК. Я доволен.
Станислав
Аватара пользователя
Flash.#13
Держит паяльник хвостом
Сообщения: 965
Зарегистрирован: Сб апр 12, 2014 23:46:03
Откуда: Киев

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

Сообщение Flash.#13 »

Хелп, полез в ШИМ с "точной фазой", (Phase Correct PWM) и дело не пошло (ATMega8). По описанию ШИМ в данном режиме меняет состояние ножки доходя до регистра сравнения, и затем счетчик реверсируется, и вновь меняет состояние ножки дойдя нули и обратно. В таком режиме вроде можно получить ровные прямоугольные колебания, их надо для пищалки, для звука будильника типа "пи". Обычный режим "быстрый ШИМ" запускается нормально, но с "точной фазой" чего-то не стартует. Нужна помощь, чего не так делаю:

Изображение

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

sbi DDRB, 1                ;ножка OC1A вкл.
ldi R16, 0x00
out OCR1AH, R16
ldi R16, 0xFF
out OCR1AL, R16         ;вписали задержку 00FF в OCR1A
ldi R16, 0b11000001
out TCCR1A, R16         ;настройка
ldi R16, 0b00010001
out TCCR1B, R16         ;настройка и пуск
Вписал WGM13_10 1001 (Phase and Freguensy Correct PWM, с OCR1A), но ножка OC1A не меняет состояние :cry:
Немного файлов по зажиганию: ФУОЗ 2.2 + программа правки таблиц 0.987, монтажка
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18644
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

для звука будильника типа "пи" сойдет и Fast PWM с "неточной фазой" :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Flash.#13
Держит паяльник хвостом
Сообщения: 965
Зарегистрирован: Сб апр 12, 2014 23:46:03
Откуда: Киев

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

Сообщение Flash.#13 »

Неа, Fast PWM плохо звучит и плохо регулируется. Почти день мучил этот будильник, в результате увидел что даже с транзистором в режиме эмиттерного повторителя он слишьком тихий, было принято решение выковырять пищалку с ее обвязкой с "дешевого китайского будильника", и использовать МК как ее включатель. :facepalm:
Немного файлов по зажиганию: ФУОЗ 2.2 + программа правки таблиц 0.987, монтажка
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18644
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

извиняюсь за оффтоп, но может у вас со слухом что-то не то? я делал полифонический "звонок" на тиньке с FastPWM на 15 кГц - звук был отличный! а ШИМ с "корректной фазой" будет в2 раза меньше по частоте, следовательно заведомо хуже по тембру.

однако, для звука "пи" тембр малокритичен и скорее будет определяться типом излучателя, чем симметрией фазы ШИМ...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Ответить

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