Ассемблер (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 »

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

the picoPower BOD can be turned off in Extended Standby, Standby, Power Save and Power Down modes

дайте полную цитату или даже ссылку на апноут. отсутствие начала фразы не позволяет понять её смысл однозначно.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
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
Друг Кота
Сообщения: 15541
Зарегистрирован: Вт мар 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
Друг Кота
Сообщения: 15541
Зарегистрирован: Вт мар 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
Друг Кота
Сообщения: 15541
Зарегистрирован: Вт мар 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»