the picoPower BOD can be turned off in Extended Standby, Standby, Power Save and Power Down modes
Ассемблер (ASM) для AVR в вопросах и ответах
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Так вот была же, надежда. Из-за фразы из апноута
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Я так понял, что BOD может быть ВЫКЛЮЧЕН
Я всё-всё узнAю и стану профессором.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Так вот была же, надежда. Из-за фразы из апноута
the picoPower BOD can be turned off in Extended Standby, Standby, Power Save and Power Down modes
дайте полную цитату или даже ссылку на апноут. отсутствие начала фразы не позволяет понять её смысл однозначно.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Ассемблер (ASM) для AVR в вопросах и ответах
В качестве пятничной развлекухи загрузил программу ниже. Тактирование 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.
Включил 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
.EXITRe: Ассемблер (ASM) для AVR в вопросах и ответах
Что и требовалось подтвердить, как говорится) akl, спасибо за поддержку эксперимента!
А вот тот самый аппноут:
А вот тот самый аппноут:
- Вложения
-
- Innovative Techniques for Extremely Low Power Consumption.pdf
- (324.92 КБ) 306 скачиваний
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Производитель МК выпускает множество разновидностей даже для одного наименования.
Каждая разновидность может иметь незначительные отличия в неоговоренных стандартно-обязательными требованиями параметров.
Надеяться на повторимость программ, подогнанных на те нюансы не есть хорошо - ибо повторимость будет весьма.... проблемна.

Каждая разновидность может иметь незначительные отличия в неоговоренных стандартно-обязательными требованиями параметров.
Надеяться на повторимость программ, подогнанных на те нюансы не есть хорошо - ибо повторимость будет весьма.... проблемна.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Всем добрый день!
МК: 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? Как МК узнает в какую сторону двигаться?
Спасибо!
МК: 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 в вопросах и ответах
Собственно совпадение отлавливается любой из команд неразрушающего сравнения.
Далее переход в начало обработчика того, за что то совпадение отвечает.
Если подпрограммы обработки в случае совпадения разный можно или дополнительный
флажок использовать или "косвенный переход" вида ICALL/IJMP
с предварительно выставленным в Z целевым адресом.
Да и иных методов много - смотрим по наиболее удобному варианту.

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

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

-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Ну оно и понятно почему у вас ничего не получается. Вы же даже задачу сформулировать толком не можете. Большая часть задачи осталась у вас в голове, а тут телепатов нет.
В какую скажете, туда и будет двигаться.
Как МК узнает в какую сторону двигаться?
В какую скажете, туда и будет двигаться.
- Ярослав555
- Поставщик валерьянки для Кота
- Сообщения: 2081
- Зарегистрирован: Пт май 31, 2013 17:14:38
- Откуда: Украина, Винница
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Переменная-флаг, ветвление по флагу - если фолс тот инкремент, если тру - декремент. Флаг меняем в крайних точках - 0 и 255. Удачной генерации пилы
Re: Ассемблер (ASM) для AVR в вопросах и ответах
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 писал(а):Переменная-флаг
не знаю как воспользоваться данными рекомендациями, т.к. не могу представить как оно будет выглядеть "в живую".
Спасибо!
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Тогда понятно. переменная-флаг может принимать значения 1 или 0, если 1 идем вверх, если ноль - вниз. Доходим до упора меняем значение переменной на противоположное 1<>0, или жестко устанавливаем в зависимости от того до какого упора дошли.
Можно использовать переменную целый байт, а можно и отдельный бит регистра, где можно хранить и другие переменные-флаги.
Можно использовать переменную целый байт, а можно и отдельный бит регистра, где можно хранить и другие переменные-флаги.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
В качестве переменной-флага решил исп. пользовательский флаг Т
Пока как то так...
1 хорошо/плохо?
как лучше?
2 код выравниваю пробелами, но когда отправляю сообщение, выравнивание пропадает( что можно сделать?
Спасибо!
Спойлер
Код: Выделить всё
Перед входом в осн. цикл делаем вот так:
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 в вопросах и ответах
Вообще-то Т использовать можно по-любому...
Однако для флагов все же лучше отдельный регистрв "старшей" половине регистрового файла(очепятался...
).
У Т более интересные возможности/назначение.

Однако для флагов все же лучше отдельный регистрв "старшей" половине регистрового файла(очепятался...
У Т более интересные возможности/назначение.
Последний раз редактировалось BOB51 Чт май 03, 2018 08:47:50, всего редактировалось 1 раз.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
В качестве флагов очень удобно использовать регистр GPIOR, там где он есть и расположен в первой половине адресов ввода-вывода, или даже другой не используемый в данной программе. Команды cbi и sbi не изменяют регистр состояния SREG.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
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
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Флаг T можно использовать только в случае если он больше нигде не используется. Так забудете что его задействовали, используете удобные команды BLD/BST где-то и будете долго удивляться очень забавному поведению программы на ровном месте. Или второй аналогичный счетчик захочете орагнизовать... а бит-то ОДИН!
Кстати ещё одна интересная ситуация - подумайте, как вы можете изменить состояние этого бита в обработчике прерывания.... при том что на входе вы сохраняете регистр состояния, а на выходе восстанавливаете и всё что менялось в обработчике идёт под хвост.
Кстати ещё одна интересная ситуация - подумайте, как вы можете изменить состояние этого бита в обработчике прерывания.... при том что на входе вы сохраняете регистр состояния, а на выходе восстанавливаете и всё что менялось в обработчике идёт под хвост.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Уточню. Режим Phase Correct PWM будет изменять состояние OCR0A, OCR0B в момент TOP=FF. При этом за счет двойного буфера возможно заносить значение в любой момент. Прерывания по сравнению не нужны, остаются только прерывание по переполнению.

Спойлер
- Вложения
-
- PWM_CORRECT_OC0.PNG
- (35.28 КБ) 375 скачиваний
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Alexeyslav писал(а):при том что на входе вы сохраняете регистр состояния, а на выходе восстанавливаете и всё что менялось в обработчике идёт под хвост.
Да, точно! Долго потом можно будет ошибку искать...
akl писал(а):Прерывания по сравнению не нужны, остаются только прерывание по переполнению.
В прерывание по переполнению Т0 вставлял фрагмент с определением числа - да, все работает. Прерывания по каналу А и В можно вовсе отключить, главное настроить выводы СОМ0А(В)1(0).
Поясните, пожалуйста, еще такой момент: Когда происходит совпадение в канале (любом), на следующий такт после совпадения должен установится флаг прерывания и вывод ОС0 изм. свое состояние. В АВР Студии 4.19 выводы изм. свое сост. спустя 2 такта после совпадения значений. Почему, если должно быть на следующий такт после совпадения? Ошибка отладчика?
Фото потактовой отладки прикладываю
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: Ассемблер (ASM) для AVR в вопросах и ответах
а если уменьшить количество условий: всегда прибавлять, только прибавлять переменную - сначала в ней 1, когда дошли до верха в неё впишем -1 (0xFF), когда спустились обратно до 0 вписали в неё снова 1, так он и будет качаться...
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...