В качестве пятничной развлекухи загрузил программу ниже. Тактирование 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
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Производитель МК выпускает множество разновидностей даже для одного наименования. Каждая разновидность может иметь незначительные отличия в неоговоренных стандартно-обязательными требованиями параметров. Надеяться на повторимость программ, подогнанных на те нюансы не есть хорошо - ибо повторимость будет весьма.... проблемна.
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср май 02, 2018 09:09:45
Встал на лапы
Зарегистрирован: Вт мар 31, 2015 01:12:46 Сообщений: 89
Рейтинг сообщения:0
Всем добрый день! МК: 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? Как МК узнает в какую сторону двигаться? Спасибо!
Собственно совпадение отлавливается любой из команд неразрушающего сравнения. Далее переход в начало обработчика того, за что то совпадение отвечает. Если подпрограммы обработки в случае совпадения разный можно или дополнительный флажок использовать или "косвенный переход" вида ICALL/IJMP с предварительно выставленным в Z целевым адресом. Да и иных методов много - смотрим по наиболее удобному варианту.
Примерно так Z=адрес целевой прожки rmask=нашей контрольной маске rcnt текущий счетчик ... cpse Rcnt,Rmask rjmp no_mask icall или ijmp no_mask:.....
Ну оно и понятно почему у вас ничего не получается. Вы же даже задачу сформулировать толком не можете. Большая часть задачи осталась у вас в голове, а тут телепатов нет.
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср май 02, 2018 13:34:30
Встал на лапы
Зарегистрирован: Вт мар 31, 2015 01:12:46 Сообщений: 89
Рейтинг сообщения:0
Alexeyslav писал(а):
Вы же даже задачу сформулировать толком не можете.
Задачу
dumbass писал(а):
мне нужно держать число в диапазоне от 0х00 до 0хFF.
считал функционально законченной, поэтому и не стал выдавать всех тайн Общая задача такова: есть мк тини2313 с 2-мя св-диодами, подключенных к выводам PD5 и PB2. В МК настроен т/сч Т0 в режиме корректировке по фазе. Спойлер
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 писал(а):
Переменная-флаг
не знаю как воспользоваться данными рекомендациями, т.к. не могу представить как оно будет выглядеть "в живую". Спасибо!
Тогда понятно. переменная-флаг может принимать значения 1 или 0, если 1 идем вверх, если ноль - вниз. Доходим до упора меняем значение переменной на противоположное 1<>0, или жестко устанавливаем в зависимости от того до какого упора дошли. Можно использовать переменную целый байт, а можно и отдельный бит регистра, где можно хранить и другие переменные-флаги.
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср май 02, 2018 15:40:14
Встал на лапы
Зарегистрирован: Вт мар 31, 2015 01:12:46 Сообщений: 89
Рейтинг сообщения:0
В качестве переменной-флага решил исп. пользовательский флаг Т Спойлер
Код:
Перед входом в осн. цикл делаем вот так: 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 код выравниваю пробелами, но когда отправляю сообщение, выравнивание пропадает( что можно сделать? Спасибо!
Вообще-то Т использовать можно по-любому... Однако для флагов все же лучше отдельный регистрв "старшей" половине регистрового файла(очепятался... ). У Т более интересные возможности/назначение.
Последний раз редактировалось BOB51 Чт май 03, 2018 08:47:50, всего редактировалось 1 раз.
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср май 02, 2018 17:32:35
Встал на лапы
Карма: 3
Рейтинг сообщений: 7
Зарегистрирован: Чт сен 10, 2015 06:59:03 Сообщений: 106 Откуда: Гродно, BY
Рейтинг сообщения:0
В качестве флагов очень удобно использовать регистр GPIOR, там где он есть и расположен в первой половине адресов ввода-вывода, или даже другой не используемый в данной программе. Команды cbi и sbi не изменяют регистр состояния SREG.
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср май 02, 2018 20:34:00
Встал на лапы
Зарегистрирован: Вт мар 31, 2015 01:12:46 Сообщений: 89
Рейтинг сообщения:0
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
Флаг T можно использовать только в случае если он больше нигде не используется. Так забудете что его задействовали, используете удобные команды BLD/BST где-то и будете долго удивляться очень забавному поведению программы на ровном месте. Или второй аналогичный счетчик захочете орагнизовать... а бит-то ОДИН! Кстати ещё одна интересная ситуация - подумайте, как вы можете изменить состояние этого бита в обработчике прерывания.... при том что на входе вы сохраняете регистр состояния, а на выходе восстанавливаете и всё что менялось в обработчике идёт под хвост.
Уточню. Режим Phase Correct PWM будет изменять состояние OCR0A, OCR0B в момент TOP=FF. При этом за счет двойного буфера возможно заносить значение в любой момент. Прерывания по сравнению не нужны, остаются только прерывание по переполнению. Спойлер
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт май 03, 2018 10:02:53
Встал на лапы
Зарегистрирован: Вт мар 31, 2015 01:12:46 Сообщений: 89
Рейтинг сообщения:0
Alexeyslav писал(а):
при том что на входе вы сохраняете регистр состояния, а на выходе восстанавливаете и всё что менялось в обработчике идёт под хвост.
Да, точно! Долго потом можно будет ошибку искать...
akl писал(а):
Прерывания по сравнению не нужны, остаются только прерывание по переполнению.
В прерывание по переполнению Т0 вставлял фрагмент с определением числа - да, все работает. Прерывания по каналу А и В можно вовсе отключить, главное настроить выводы СОМ0А(В)1(0). Поясните, пожалуйста, еще такой момент: Когда происходит совпадение в канале (любом), на следующий такт после совпадения должен установится флаг прерывания и вывод ОС0 изм. свое состояние. В АВР Студии 4.19 выводы изм. свое сост. спустя 2 такта после совпадения значений. Почему, если должно быть на следующий такт после совпадения? Ошибка отладчика? Фото потактовой отладки прикладываю Спойлер
а если уменьшить количество условий: всегда прибавлять, только прибавлять переменную - сначала в ней 1, когда дошли до верха в неё впишем -1 (0xFF), когда спустились обратно до 0 вписали в неё снова 1, так он и будет качаться...
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Сейчас этот форум просматривают: Jack_A и гости: 36
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения