Страница 250 из 400

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

Добавлено: Сб фев 14, 2015 16:27:20
neoneon
ChipKiller писал(а):reti нужен в конце любого прерывания - стек и улетает из-за его отсутствия
Спасибо, буду разбираться :)

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

Добавлено: Сб фев 14, 2015 16:30:52
neoneon
А можно каким-то образом вручную обнулить значение таймера TCNT0? Не регистр же :?

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

Добавлено: Сб фев 14, 2015 17:01:06
Seriyvolk
neoneon писал(а): Спасибо, буду разбираться
Просто перед ждампом сделай РОР (два раза вроде, т.к. адрес двухбайтный) для выдёргивания адреса возврата из стека.

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

Добавлено: Сб фев 14, 2015 17:46:13
neoneon
Seriyvolk писал(а):
neoneon писал(а): Спасибо, буду разбираться
Просто перед ждампом сделай РОР (два раза вроде, т.к. адрес двухбайтный) для выдёргивания адреса возврата из стека.
Ставил, после третьего нажатия на кнопку в протеусе почему-то пропадает напряжение почти на всех ножках и 0 реакции. И сообщения: Push program stack: SP is not initialized

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

Добавлено: Сб фев 14, 2015 18:13:02
neoneon
В общем, я сделал по-человечески, т.е.создал переменную (типа флага), на какое прерывание нужно переходить, reti после каждого прерывания. Но такая неприятная штука: показывает на переполнение стека по адресу 3c. Постоянно на этот адрес, даже если там программа закончилась...
В протеусе довольно странная зависимость получилась - если число, с которым сравнивается значение циклов, меньше 0x0f, то более-менее работает, хоть иногда и косяки в виде пропадания напряжения. Чем меньше число, тем стабильнее. (0f - секунд 7 горит, зависимость примерно линейная). Но если записать число для 3х минут - 0xCE0, то пропадает напряжение через 20 секунд, еще секунд через 10 ошибки Writing to memory location (число) outside of memory size 0xA0 :? Ни черта не понимаю, может, косяк самого протеуса? Хотя в дебаггере тоже переполнение :?

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

Добавлено: Сб фев 14, 2015 18:58:10
ChipKiller
я сделал по-человечески, т.е.создал переменную (типа флага), на какое прерывание нужно переходить, reti после каждого прерывания
... по-человечески на прерывание не переходят - вход в прерывание происходит аппаратно .... косяк не у протеуса - советую в начале выучить матчасть.

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

Добавлено: Сб фев 14, 2015 19:06:41
neoneon
ChipKiller писал(а):
по-человечески на прерывание не переходят - вход в прерывание происходит аппаратно.
Я имел ввиду, в какой из видов сна переходит при соответствующем прерывании :) я знаю, что аппаратно, спасибо :)

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

Добавлено: Сб фев 14, 2015 19:36:27
Andrew Martin
Для начала таблицу прерываний нормально сделай, лучше всего сдери с даташита.

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


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

.org $000
rjmp nach ; (reset)

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

.org $002
reti

.org $003
rjmp timer ; Timer\counter overflow

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

Добавлено: Сб фев 14, 2015 19:44:19
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

Если не видел - почитай справку.

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

Добавлено: Вс фев 15, 2015 06:21:14
neoneon
Я исправил, конечно, но проблема та же осталась :?
Скопировал текст программы в другой проект - ошибки исчезли О_о Но в протеусе так же пропадает напряжение через 20 сек.

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

Добавлено: Вс фев 15, 2015 08:36:29
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

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

Добавлено: Вс фев 15, 2015 09:30:21
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. Почему так?

Понял, что я сильно замудрил :) у вас намного проще=> меньше вероятности ошибок

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

Добавлено: Вс фев 15, 2015 13:53:03
akl
1. Вы, в дальнейшем, переходите в POWER DOWN и чтобы прерывание по низкому уровню! сработало нужно какое-то время (не менее 6 тактов) для возникновения генерации RC-генератора.
2. Думаю, что тактирование осуществляется от 9,6МГц
3. Сброс флагов требования прерываний осуществляется записью 1.
4. Эти манипуляции сделаны только для проверки в студии.

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

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

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

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

З.З.Ы. Спасибо. Уже сам все победил. Осталось только по таймеру выровнять.
Если у кого-то будут интересные предложения, обязательно выслушаю. А пока я сделал свой извращенный алгоритм и он работает в железе, не занимая оперативки. Все на циклах и числа в 200 бит как такового не существует... :)))

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

Добавлено: Сб мар 14, 2015 12:38:17
Engineer_Keen
LSL, LSR - сдвиг влево и вправо, выдвинутый бит остается в С, с обратной стороны задвигается 0.
ROL , ROR - тоже самое, но задвигаемый бит берется как раз из С, так можно двигать влево-вправо числа любой битности.

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

Добавлено: Сб мар 14, 2015 16:40:47
СКАЗОЧНИК
Понял. Знаю такие команды.
Однако на данный момент, сделал по своему. и неоптимизированный вариант эффекта не занимает оперативной и флеш памяти. Используются только регистры. Сам эффект при компиляции 116 Байт. И 56 Байт начальная конфигурация МК. Я доволен.

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

Добавлено: Пн мар 16, 2015 17:19:12
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:

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

Добавлено: Вт мар 17, 2015 07:19:06
ARV
для звука будильника типа "пи" сойдет и Fast PWM с "неточной фазой" :)))

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

Добавлено: Вт мар 17, 2015 14:33:35
Flash.#13
Неа, Fast PWM плохо звучит и плохо регулируется. Почти день мучил этот будильник, в результате увидел что даже с транзистором в режиме эмиттерного повторителя он слишьком тихий, было принято решение выковырять пищалку с ее обвязкой с "дешевого китайского будильника", и использовать МК как ее включатель. :facepalm:

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

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

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