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

Обсуждаем контроллеры компании Atmel.
Feruz
Открыл глаза
Сообщения: 55
Зарегистрирован: Вс май 03, 2015 15:05:58

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

Сообщение Feruz »

Так вот была же, надежда. Из-за фразы из апноута

the picoPower BOD can be turned off in Extended Standby, Standby, Power Save and Power Down modes
dgrett
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

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

Сообщение dgrett »

Я так понял, что BOD может быть ВЫКЛЮЧЕН
Я всё-всё узнAю и стану профессором.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение 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]
дайте полную цитату или даже ссылку на апноут. отсутствие начала фразы не позволяет понять её смысл однозначно.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение 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
Feruz
Открыл глаза
Сообщения: 55
Зарегистрирован: Вс май 03, 2015 15:05:58

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

Сообщение Feruz »

Что и требовалось подтвердить, как говорится) akl, спасибо за поддержку эксперимента!
А вот тот самый аппноут:
Вложения
Innovative Techniques for Extremely Low Power Consumption.pdf
(324.92 КБ) 306 скачиваний
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15543
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Производитель МК выпускает множество разновидностей даже для одного наименования.
Каждая разновидность может иметь незначительные отличия в неоговоренных стандартно-обязательными требованиями параметров.
Надеяться на повторимость программ, подогнанных на те нюансы не есть хорошо - ибо повторимость будет весьма.... проблемна.
:(
dumbass
Встал на лапы
Сообщения: 89
Зарегистрирован: Вт мар 31, 2015 01:12:46

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

Сообщение 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? Как МК узнает в какую сторону двигаться?
Спасибо!
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15543
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Собственно совпадение отлавливается любой из команд неразрушающего сравнения.
Далее переход в начало обработчика того, за что то совпадение отвечает.
Если подпрограммы обработки в случае совпадения разный можно или дополнительный
флажок использовать или "косвенный переход" вида ICALL/IJMP
с предварительно выставленным в Z целевым адресом.
Да и иных методов много - смотрим по наиболее удобному варианту.
8)
Примерно так
Z=адрес целевой прожки
rmask=нашей контрольной маске
rcnt текущий счетчик
...
cpse Rcnt,Rmask
rjmp no_mask
icall или ijmp
no_mask:.....
:dont_know:
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

Ну оно и понятно почему у вас ничего не получается. Вы же даже задачу сформулировать толком не можете. Большая часть задачи осталась у вас в голове, а тут телепатов нет.
Как МК узнает в какую сторону двигаться?

В какую скажете, туда и будет двигаться.
Аватара пользователя
Ярослав555
Поставщик валерьянки для Кота
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

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

Сообщение Ярослав555 »

Переменная-флаг, ветвление по флагу - если фолс тот инкремент, если тру - декремент. Флаг меняем в крайних точках - 0 и 255. Удачной генерации пилы
dumbass
Встал на лапы
Сообщения: 89
Зарегистрирован: Вт мар 31, 2015 01:12:46

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

Сообщение 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 писал(а):Переменная-флаг

не знаю как воспользоваться данными рекомендациями, т.к. не могу представить как оно будет выглядеть "в живую".
Спасибо!
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

Тогда понятно. переменная-флаг может принимать значения 1 или 0, если 1 идем вверх, если ноль - вниз. Доходим до упора меняем значение переменной на противоположное 1<>0, или жестко устанавливаем в зависимости от того до какого упора дошли.
Можно использовать переменную целый байт, а можно и отдельный бит регистра, где можно хранить и другие переменные-флаги.
dumbass
Встал на лапы
Сообщения: 89
Зарегистрирован: Вт мар 31, 2015 01:12:46

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

Сообщение 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 код выравниваю пробелами, но когда отправляю сообщение, выравнивание пропадает( что можно сделать?
Спасибо!
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15543
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Вообще-то Т использовать можно по-любому...
Однако для флагов все же лучше отдельный регистрв "старшей" половине регистрового файла(очепятался... :oops: ).
У Т более интересные возможности/назначение.
8)
Последний раз редактировалось BOB51 Чт май 03, 2018 08:47:50, всего редактировалось 1 раз.
trofim2
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт сен 10, 2015 06:59:03
Откуда: Гродно, BY

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

Сообщение trofim2 »

В качестве флагов очень удобно использовать регистр GPIOR, там где он есть и расположен в первой половине адресов ввода-вывода, или даже другой не используемый в данной программе. Команды cbi и sbi не изменяют регистр состояния SREG.
dumbass
Встал на лапы
Сообщения: 89
Зарегистрирован: Вт мар 31, 2015 01:12:46

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

Сообщение 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
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

Флаг T можно использовать только в случае если он больше нигде не используется. Так забудете что его задействовали, используете удобные команды BLD/BST где-то и будете долго удивляться очень забавному поведению программы на ровном месте. Или второй аналогичный счетчик захочете орагнизовать... а бит-то ОДИН!
Кстати ещё одна интересная ситуация - подумайте, как вы можете изменить состояние этого бита в обработчике прерывания.... при том что на входе вы сохраняете регистр состояния, а на выходе восстанавливаете и всё что менялось в обработчике идёт под хвост.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Уточню. Режим Phase Correct PWM будет изменять состояние OCR0A, OCR0B в момент TOP=FF. При этом за счет двойного буфера возможно заносить значение в любой момент. Прерывания по сравнению не нужны, остаются только прерывание по переполнению.
СпойлерИзображение
Вложения
PWM_CORRECT_OC0.PNG
(35.28 КБ) 375 скачиваний
dumbass
Встал на лапы
Сообщения: 89
Зарегистрирован: Вт мар 31, 2015 01:12:46

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

Сообщение dumbass »

Alexeyslav писал(а):при том что на входе вы сохраняете регистр состояния, а на выходе восстанавливаете и всё что менялось в обработчике идёт под хвост.

Да, точно! Долго потом можно будет ошибку искать...
akl писал(а):Прерывания по сравнению не нужны, остаются только прерывание по переполнению.

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

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

Сообщение Ivanoff-iv »

а если уменьшить количество условий: всегда прибавлять, только прибавлять переменную - сначала в ней 1, когда дошли до верха в неё впишем -1 (0xFF), когда спустились обратно до 0 вписали в неё снова 1, так он и будет качаться...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Ответить

Вернуться в «AVR»