Страница 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 целевым адресом.
Да и иных методов много - смотрим по наиболее удобному варианту.

Примерно так
Z=адрес целевой прожки
rmask=нашей контрольной маске
rcnt текущий счетчик
...
cpse Rcnt,Rmask
rjmp no_mask
icall или ijmp
no_mask:.....

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
Вообще-то Т использовать можно по-любому...
Однако для флагов все же лучше отдельный регистрв "старшей" половине регистрового файла(очепятался...

).
У Т более интересные возможности/назначение.

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, так он и будет качаться...