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

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

Добавлено: Чт апр 26, 2018 20:56:29
Feruz
Так вот была же, надежда. Из-за фразы из апноута
the picoPower BOD can be turned off in Extended Standby, Standby, Power Save and Power Down modes

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

Добавлено: Пт апр 27, 2018 05:06:18
dgrett
Я так понял, что BOD может быть ВЫКЛЮЧЕН

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

Добавлено: Пт апр 27, 2018 07:01:50
ARV
[uquote="Feruz",url="/forum/viewtopic.php?p=3363770#p3363770"]Так вот была же, надежда. Из-за фразы из апноута
the picoPower BOD can be turned off in Extended Standby, Standby, Power Save and Power Down modes
[/uquote]
дайте полную цитату или даже ссылку на апноут. отсутствие начала фразы не позволяет понять её смысл однозначно.

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

Добавлено: Пт апр 27, 2018 09:29:06
akl
В качестве пятничной развлекухи загрузил программу ниже. Тактирование 128кГц, напряжение питания 3,6V. Ток потребления 14,1 mkA.
Включил BOD 2,7V ток потребления вырос до 34,0 mkA. Импульсы как были, так и остались.
Вывод, хотя программа успевает переключиться из режима POWER DOWN в IDLE в отведенные 3 такта между установкой BODS и переходом в SLEEP БОД остается включенным.
Переход в SLEEP POWER DOWN выполняется с отключением БОД и током потребления 0,0...0,1mkA.
Спойлер

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

	.INCLUDE "tn13Adef.inc"

.equ	Fo=9600000

.CSEG
.ORG 0x0000
START0:
	SER	R22
	OUT	DDRB,R22
START:
	SBI	ACSR,ACD

	LDI	R20,1<<PRADC
	OUT	PRR,R20

	LDI	R16,128
	OUT	OCR0A,R16
	OUT	OCR0B,R16

	LDI	R16,1<<COM0A1|0<<COM0A0|1<<COM0B1|1<<COM0B0|1<<WGM01|1<<WGM00
; режим FAST 
	OUT	TCCR0A,R16

	LDI	R16,1<<CS00
	OUT	TCCR0B,R16			; Fo/1 режим 

	LDI	R20,1<<SE|1<<SM1	;POWER DOWN
	LDI	R21,1<<SE			; IDLE

	LDI	R22,1<<BPDS|1<<BPDSE
	LDI	R23,1<<BPDS

	OUT	MCUCR,R20	;
	OUT	BODCR,R22
	OUT	MCUCR,R21
	OUT	BODCR,R23
;********************
WAIT:
	SLEEP
	RJMP	WAIT
.EXIT

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

Добавлено: Пт апр 27, 2018 15:00:09
Feruz
Что и требовалось подтвердить, как говорится) akl, спасибо за поддержку эксперимента!
А вот тот самый аппноут:

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

Добавлено: Вт май 01, 2018 08:02:24
BOB51
Производитель МК выпускает множество разновидностей даже для одного наименования.
Каждая разновидность может иметь незначительные отличия в неоговоренных стандартно-обязательными требованиями параметров.
Надеяться на повторимость программ, подогнанных на те нюансы не есть хорошо - ибо повторимость будет весьма.... проблемна.
:(

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

Добавлено: Ср май 02, 2018 09:09:45
dumbass
Всем добрый день!
МК: tiny2313
Не получается написать программу. Принцип работы как у таймера/счетчика Т0 в режиме коррекции по фазе. Т.е. мне нужно держать число в диапазоне от 0х00 до 0хFF. Если (.def R17 = count) в счетчике значение 0х00 - инкрементируем до 0хFF. Если в счетчике значение 0хFF декрементируем до 0х00. Значения 0х00 и 0хFF за, как бы "период", встречаются у нас по одному разу.
Я пытался ветвить программу используя команды cpse, cpi и команды для установленного/сброшенного флагов Z и С. Но чего то не хватает...
Как ветвить программу, если значение, допустим 0х8D? Как МК узнает в какую сторону двигаться?
Спасибо!

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

Добавлено: Ср май 02, 2018 09:18:55
BOB51
Собственно совпадение отлавливается любой из команд неразрушающего сравнения.
Далее переход в начало обработчика того, за что то совпадение отвечает.
Если подпрограммы обработки в случае совпадения разный можно или дополнительный
флажок использовать или "косвенный переход" вида ICALL/IJMP
с предварительно выставленным в Z целевым адресом.
Да и иных методов много - смотрим по наиболее удобному варианту.
8)
Примерно так
Z=адрес целевой прожки
rmask=нашей контрольной маске
rcnt текущий счетчик
...
cpse Rcnt,Rmask
rjmp no_mask
icall или ijmp
no_mask:.....
:dont_know:

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

Добавлено: Ср май 02, 2018 10:47:22
Alexeyslav
Ну оно и понятно почему у вас ничего не получается. Вы же даже задачу сформулировать толком не можете. Большая часть задачи осталась у вас в голове, а тут телепатов нет.
Как МК узнает в какую сторону двигаться?
В какую скажете, туда и будет двигаться.

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

Добавлено: Ср май 02, 2018 11:05:04
Ярослав555
Переменная-флаг, ветвление по флагу - если фолс тот инкремент, если тру - декремент. Флаг меняем в крайних точках - 0 и 255. Удачной генерации пилы

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

Добавлено: Ср май 02, 2018 13:34:30
dumbass
Alexeyslav писал(а):Вы же даже задачу сформулировать толком не можете.
Задачу
dumbass писал(а): мне нужно держать число в диапазоне от 0х00 до 0хFF.
считал функционально законченной, поэтому и не стал выдавать всех тайн :)
Общая задача такова: есть мк тини2313 с 2-мя св-диодами, подключенных к выводам PD5 и PB2. В МК настроен т/сч Т0 в режиме корректировке по фазе.
Спойлер

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

.include "tn2313def.inc"

.def	temp	=R16
.def	count	=R17
;.def	loop	=R18
;.def	loop2	=R19

.cseg
.org	0x00

		rjmp	init
;ТАБЛИЦА ВЕКТОРОВ ПРЕРЫВАНИЙ
.org	INT0addr		reti			;(0х01) Внешнее прерывание 0
.org	INT1addr		reti			;(0х02) Внешнее прерывание 1
.org	ICP1addr		reti			;(0х03) Захват таймера/счетчика Т1
.org	OC1Aaddr		reti			;(0х04) Совпадение А таймера/счетчика Т1
.org	OVF1addr		reti			;(0х05) Переполнение таймера/счетчика Т1
.org	OVF0addr       	rjmp	T0_OVF	;(0х06) Переполнение таймера/счетчика Т0
.org	URXCaddr		reti			;(0х07) USART, прием завершен
.org	UDREaddr		reti			;(0х08) Регистр данных USART пуст
.org	UTXCaddr		reti			;(0х09) USART, передача завершена
.org	ACIaddr		reti	        	;(0х0A) Прерывание по компаратору
.org	PCIaddr		reti	        	;(0х0B) Прерывание по изменению на любом контакте
.org	OC1Baddr		reti			;(0х0C) Совпадение В таймера/счетчика Т1
.org	OC0Aaddr		rjmp	A0_cndn	;(0х0D) Совпадение А таймера/счетчика Т0
.org	OC0Baddr		rjmp	B0_cndn	;(0х0E) Совпадение В таймера/счетчика Т0
.org	USI_STARTaddr	reti			;(0х0F) USI Стартовая готовность
.org	USI_OVFaddr	reti			;(0х10) USI Переполнение
.org	ERDYaddr		reti			;(0х11) EEPROM Готовность
.org	WDTaddr		reti			;(0х12) Переполнение сторожевого таймера

.org	INT_VECTORS_SIZE
;ИНИЦИАЛИЗАЦИЯ СТЕКА И ПОРТОВ
init:	ldi		temp,RAMEND
		out		SPL,temp

		ldi		temp,0b00000100			;PB2 на выход с 1
		out		DDRB,temp				;В на вход с подтяжкой
		out		PORTB,temp
		
		ldi		temp,0b00100000			;PD5 на выход с 1
		out		DDRD,temp
		out		PORTD,temp				;D на вход с подтяжкой
;НАСТРОЙКА ТАЙМЕРА/СЧЕТЧИКА Т0
		ldi		temp,(1<<OCIE0B | 0<<TOIE0  | 1<<OCIE0A)
		out		TIMSK,temp

		ldi		temp,(1<<COM0A1 | 0<<COM0A0 | 1<<COM0B1 | 1<<COM0B0 | 1<<WGM00)
		out		TCCR0A,temp				;Выводы изм. сост. инверсным способом
		
		ldi		temp,(0<<CS02 | 0<<CS01 | 1<<CS00)	;1/256 (в работе делитель такой, в отладке 1/1)
		out		TCCR0B,temp
		
		sei

		ldi		count,0x01				;Задаем начальное значение
;ОСНОВНОЙ ЦИКЛ
MAIN:	out		OCR0A,count
		out		OCR0B,count
		rjmp	MAIN

;ПРЕРЫВАНИЕ ПО СОВПАДЕНИЮ В КАНАЛЕ А
A0_cndn:  reti             ; ЧТО ЗДЕСЬ НАПИСАТЬ?

;inc_: 	inc		count
;		reti
;dec_:	dec		count
;		reti

;ПРЕРЫВАНИЕ ПО СОВПАДЕНИЮ В КАНАЛЕ В
B0_cndn:reti

;ПРЕРЫВАНИЕ ПО ПЕРЕПОЛНЕНИЮ TCNT0
T0_OVF:	reti
Инкрементировать "count" хочу в прерывании канала А. Прерывания в канале В и по переполнению пока пусть будут.

мои идеи:
Спойлер

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

cpi count,0xFF
brne   inc_cnt
breq   dec_cnt

inc_cnt: inc, count
            reti
dec_cnt: dec,count
             reti
но все будет работать ровно до момента, когда в count будет число 0xFF, затем вычтеться единица. И значение снова будет inc, т.е. моя переменная/счетчик count подвиснет в значениях 0xFF-0xFЕ-0xFF-0xFЕ-0xFF и т.д.
BOB51 писал(а):Если подпрограммы обработки в случае совпадения разный можно или дополнительный
флажок использовать или "косвенный переход" вида ICALL/IJMP
Ярослав555 писал(а):Переменная-флаг
не знаю как воспользоваться данными рекомендациями, т.к. не могу представить как оно будет выглядеть "в живую".
Спасибо!

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

Добавлено: Ср май 02, 2018 13:46:32
Alexeyslav
Тогда понятно. переменная-флаг может принимать значения 1 или 0, если 1 идем вверх, если ноль - вниз. Доходим до упора меняем значение переменной на противоположное 1<>0, или жестко устанавливаем в зависимости от того до какого упора дошли.
Можно использовать переменную целый байт, а можно и отдельный бит регистра, где можно хранить и другие переменные-флаги.

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

Добавлено: Ср май 02, 2018 15:40:14
dumbass
В качестве переменной-флага решил исп. пользовательский флаг Т
Спойлер

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

Перед входом в осн. цикл делаем вот так:
ldi	count,0x00
set	
		
Когда случается совпадение счетного рег. и рег. сравнения (т.е. происх. прерыв. в канале А), делаем такое:
;ПРЕРЫВАНИЕ ПО СОВПАДЕНИЮ В КАНАЛЕ А
A0_cndn:	brts	inc_cnt
brtc	dec_cnt

inc_cnt:	inc	count
cpi	count,0xFF
breq	PC+3
		set
		rjmp	MAIN
		clt
		rjmp	MAIN

dec_cnt:	dec	count
		cpi	count,0x00
		breq	PC+3
		clt
		rjmp	MAIN
		set
		rjmp	MAIN
Пока как то так...
1 хорошо/плохо?
как лучше?
2 код выравниваю пробелами, но когда отправляю сообщение, выравнивание пропадает( что можно сделать?
Спасибо!

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

Добавлено: Ср май 02, 2018 16:01:57
BOB51
Вообще-то Т использовать можно по-любому...
Однако для флагов все же лучше отдельный регистрв "старшей" половине регистрового файла(очепятался... :oops: ).
У Т более интересные возможности/назначение.
8)

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

Добавлено: Ср май 02, 2018 17:32:35
trofim2
В качестве флагов очень удобно использовать регистр GPIOR, там где он есть и расположен в первой половине адресов ввода-вывода, или даже другой не используемый в данной программе. Команды cbi и sbi не изменяют регистр состояния SREG.

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

Добавлено: Ср май 02, 2018 20:34:00
dumbass
BOB51 писал(а):регистрв "старшей" половине РСФ.
А что такое "РСФ"?
BOB51 писал(а):У Т более интересные возможности/назначение.
Для таких действий этот бит правильнее всего использовать?
СпойлерХранение копируемого бита. Этот бит регистра используется в качестве источника
или приемника командами копирования битов BLD (Bit LoaD) и BST (Bit STore).
Заданный бит любого РОН может быть скопирован в этот бит командой BST или
установлен в соответствии с содержимым данного бита командой BLD
trofim2 писал(а):В качестве флагов очень удобно использовать регистр GPIOR
Про такой не слыхал до ныне, спасибо!
А вот та же программа, что и выше, только теперь наш флаг хранится в GPIOR.
Спойлер

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

	
Перед входом в осн цикл прописываем так:	
                ldi		low_,0x00
		ldi		high_,0xFF
		ldi		count,0x00
		sbi		GPIOR0,2		;Рег. и бит в котором храним исп. флаг
В обработке прерывания по каналу А так:		
A0_cndn:	sbis	GPIOR0,2
		sbic	GPIOR0,2
		rjmp	inc_cnt
		rjmp	dec_cnt

inc_cnt:     inc	count
		cpse	count,high_
		reti
		cbi	GPIOR0,2
		reti

dec_cnt:    dec	count
		cpse	count,low_
		reti
		sbi	GPIOR0,2
		reti
Объем этого кусочка кода эквивалентен предыдущему варианту
На практике все работает)
https://cloud.mail.ru/public/Abag/WST2rQ2m8

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

Добавлено: Ср май 02, 2018 22:24:22
Alexeyslav
Флаг T можно использовать только в случае если он больше нигде не используется. Так забудете что его задействовали, используете удобные команды BLD/BST где-то и будете долго удивляться очень забавному поведению программы на ровном месте. Или второй аналогичный счетчик захочете орагнизовать... а бит-то ОДИН!
Кстати ещё одна интересная ситуация - подумайте, как вы можете изменить состояние этого бита в обработчике прерывания.... при том что на входе вы сохраняете регистр состояния, а на выходе восстанавливаете и всё что менялось в обработчике идёт под хвост.

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

Добавлено: Чт май 03, 2018 07:07:09
akl
Уточню. Режим Phase Correct PWM будет изменять состояние OCR0A, OCR0B в момент TOP=FF. При этом за счет двойного буфера возможно заносить значение в любой момент. Прерывания по сравнению не нужны, остаются только прерывание по переполнению.
СпойлерИзображение

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

Добавлено: Чт май 03, 2018 10:02:53
dumbass
Alexeyslav писал(а):при том что на входе вы сохраняете регистр состояния, а на выходе восстанавливаете и всё что менялось в обработчике идёт под хвост.
Да, точно! Долго потом можно будет ошибку искать...
akl писал(а):Прерывания по сравнению не нужны, остаются только прерывание по переполнению.
В прерывание по переполнению Т0 вставлял фрагмент с определением числа - да, все работает. Прерывания по каналу А и В можно вовсе отключить, главное настроить выводы СОМ0А(В)1(0).
Поясните, пожалуйста, еще такой момент: Когда происходит совпадение в канале (любом), на следующий такт после совпадения должен установится флаг прерывания и вывод ОС0 изм. свое состояние. В АВР Студии 4.19 выводы изм. свое сост. спустя 2 такта после совпадения значений. Почему, если должно быть на следующий такт после совпадения? Ошибка отладчика?
Фото потактовой отладки прикладываю
СпойлерИзображение Изображение Изображение Изображение

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

Добавлено: Чт май 03, 2018 10:53:42
Ivanoff-iv
а если уменьшить количество условий: всегда прибавлять, только прибавлять переменную - сначала в ней 1, когда дошли до верха в неё впишем -1 (0xFF), когда спустились обратно до 0 вписали в неё снова 1, так он и будет качаться...