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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
neoneon
Встал на лапы
Сообщения: 115
Зарегистрирован: Ср окт 22, 2014 07:39:26
Откуда: Омск

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

Сообщение neoneon »

ChipKiller писал(а):reti нужен в конце любого прерывания - стек и улетает из-за его отсутствия

Спасибо, буду разбираться :)
Полный чайник.
Аватара пользователя
neoneon
Встал на лапы
Сообщения: 115
Зарегистрирован: Ср окт 22, 2014 07:39:26
Откуда: Омск

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

Сообщение neoneon »

А можно каким-то образом вручную обнулить значение таймера TCNT0? Не регистр же :?
Полный чайник.
Аватара пользователя
Seriyvolk
Друг Кота
Сообщения: 4965
Зарегистрирован: Сб май 05, 2012 20:19:55
Откуда: Минск

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

Сообщение Seriyvolk »

neoneon писал(а):Спасибо, буду разбираться

Просто перед ждампом сделай РОР (два раза вроде, т.к. адрес двухбайтный) для выдёргивания адреса возврата из стека.
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Аватара пользователя
neoneon
Встал на лапы
Сообщения: 115
Зарегистрирован: Ср окт 22, 2014 07:39:26
Откуда: Омск

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

Сообщение neoneon »

Seriyvolk писал(а):
neoneon писал(а):Спасибо, буду разбираться

Просто перед ждампом сделай РОР (два раза вроде, т.к. адрес двухбайтный) для выдёргивания адреса возврата из стека.

Ставил, после третьего нажатия на кнопку в протеусе почему-то пропадает напряжение почти на всех ножках и 0 реакции. И сообщения: Push program stack: SP is not initialized
Полный чайник.
Аватара пользователя
neoneon
Встал на лапы
Сообщения: 115
Зарегистрирован: Ср окт 22, 2014 07:39:26
Откуда: Омск

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

Сообщение neoneon »

В общем, я сделал по-человечески, т.е.создал переменную (типа флага), на какое прерывание нужно переходить, reti после каждого прерывания. Но такая неприятная штука: показывает на переполнение стека по адресу 3c. Постоянно на этот адрес, даже если там программа закончилась...
В протеусе довольно странная зависимость получилась - если число, с которым сравнивается значение циклов, меньше 0x0f, то более-менее работает, хоть иногда и косяки в виде пропадания напряжения. Чем меньше число, тем стабильнее. (0f - секунд 7 горит, зависимость примерно линейная). Но если записать число для 3х минут - 0xCE0, то пропадает напряжение через 20 секунд, еще секунд через 10 ошибки Writing to memory location (число) outside of memory size 0xA0 :? Ни черта не понимаю, может, косяк самого протеуса? Хотя в дебаггере тоже переполнение :?
Вложения
temp.asm
(2.72 КБ) 413 скачиваний
333.PNG
(13.87 КБ) 499 скачиваний
Полный чайник.
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

я сделал по-человечески, т.е.создал переменную (типа флага), на какое прерывание нужно переходить, reti после каждого прерывания
... по-человечески на прерывание не переходят - вход в прерывание происходит аппаратно .... косяк не у протеуса - советую в начале выучить матчасть.
Аватара пользователя
neoneon
Встал на лапы
Сообщения: 115
Зарегистрирован: Ср окт 22, 2014 07:39:26
Откуда: Омск

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

Сообщение neoneon »

ChipKiller писал(а):
по-человечески на прерывание не переходят - вход в прерывание происходит аппаратно.
Я имел ввиду, в какой из видов сна переходит при соответствующем прерывании :) я знаю, что аппаратно, спасибо :)
Полный чайник.
Аватара пользователя
Andrew Martin
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Вт июн 25, 2013 18:45:07

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

Сообщение Andrew Martin »

Для начала таблицу прерываний нормально сделай, лучше всего сдери с даташита.

Что это за адреса такие?????


.cseg ; выбор сегмента - программный код

.org $000
rjmp nach ; (reset)

.org $001
rjmp Knopka ; появление 0 на PB1

.org $002
reti

.org $003
rjmp timer ; Timer\counter overflow
Аватара пользователя
Andrew Martin
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Вт июн 25, 2013 18:45:07

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

Сообщение Andrew Martin »

Кто так сравнивает двухбайтовые слова???

;проверка на достижение 3296
sei
cp srh, zh; сравниваем
brlo bla ; переход, если srh<zl
cp srl,zl ;
brlo bla ; переход если srl<zl


Для многобайтовых операций есть комманды adc, sbc, sbci, cpc.

Сравнить можно так:

cp srl,zl
cpc srh,zh
brlo bla

Если не видел - почитай справку.
Вложения
AVRASM.ZIP
(321.54 КБ) 172 скачивания
Аватара пользователя
neoneon
Встал на лапы
Сообщения: 115
Зарегистрирован: Ср окт 22, 2014 07:39:26
Откуда: Омск

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

Сообщение neoneon »

Я исправил, конечно, но проблема та же осталась :?
Скопировал текст программы в другой проект - ошибки исчезли О_о Но в протеусе так же пропадает напряжение через 20 сек.
Полный чайник.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Странно. По мне, эта программа вообще не должна работать как задумано. Попробуйте
Спойлер

Код: Выделить всё

   .INCLUDE "tn13def.inc"

; ****************************
; Дата:  14.02.2015                              ПРОВЕРКА ДРУГОЙ СТРУКТУРЫ
; Для AVR: ATtiny13A
; Тактовая частота: 4.8 МГц
; Выполняемые функции: включение светодиода на 3 минуты, двойное энергосбережение
; =========
; объявления
.equ   Fo=4800000

.def   temp=r16;
.def   flag=r19;
; =========
.cseg                  ; выбор сегмента - программный код
                  
.org   $000
rjmp nach               ; (reset)

.org   $001               
rjmp   Knopka            ; появление 0 на PB1

.org    $002
reti

.org   $003            
Timer:                  ; Timer\counter overflow
   SBIW   ZH:ZL,1
   BRNE    BLA

   ldi      temp,0b00000011   ; выкл LED
   out      PortB, temp      ;

   out      TIMSK0,R0      ; запрещ прерыв таймера

   ldi      flag,0
   reti
; =========
Bla:
   cpi      flag,1
   brlo    PC+3; переход, если  flag=0
   ldi      temp,0b00100000   ; разрешение sleep (5 бит), idle (4-3 биты)
   out      MCUCR, temp      ; сон для таймера
   RETI

; обработка прерывания
Knopka:
   out      GIMSK,R0      ; запрещение прерывания от INT0

   LDI      R22,1<<SE
   OUT      MCUCR,R22      ; режим работы SLEEP IDLE

   ldi      temp,0b00000010   ; вкл LED
   out      PortB, temp      ;            

   ldi      temp,0b00000010 ;
   out      TIMSK0, temp   ;разрешение прерыв по переполнению
; очистка счетчика           
   ldi      temp,0b0000001 ; для проверки clk/1!!!!!!!!!
;   ldi      temp,0b0000101 ;      
   out      TCCR0B,temp      ; clk/1024 - tccr0b=xxxx x101
; тут счетчик начал считать
   ldi      flag,$01      ; флаг=1 -> переход в bla
   reti      
; =========
; =========
; =========
Nach:
   SBI   ACSR,ACD   ; выключить аналоговый компаратор
; =========
; инициализация портов и периферии
   ldi      temp,0b11111111 ;
   out      DDRB,temp      ;
   ldi      temp,0b00000011   ;
   out      PortB, temp      ;

   CBI   DDRB,1      ; лапу INT0(PB1) на вход с подтяжкой
   
   LDI   ZH,HIGH(3*60*Fo/256/1024)
   LDI   ZL,LOW(3*60*Fo/256/1024)   ; загрузка значения 3 минуты
;   ldi      zh,$0C         ;для числа 3296: zl=$E0, zh=$0C
;   ldi      zl,$E0         ;

   CLR   R0
   OUT   TCNT0,R0

   ldi      temp,0b00110000   ; разрешение sleep (5 бит), power down (4-3 биты),
   out      MCUCR, temp      ; просыпается от низкого уровня на INT0 (1-0 биты)

   ldi      temp,0b01000000   ; разрешение прерывания от INT0
   out      GIMSK, temp      ;
   OUT      GIFR,temp
   sei
WAIT:
   SLEEP
; Основное тело программы
; flag=1? да - к таймеру. нет - спать
   CPI      flag,1
   BREQ    WAIT; переход, если  flag=1

   rjmp Nach
.exit
Аватара пользователя
neoneon
Встал на лапы
Сообщения: 115
Зарегистрирован: Ср окт 22, 2014 07:39:26
Откуда: Омск

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

Сообщение neoneon »

По мне, эта программа вообще не должна работать как задумано.

Почему? :?
Попробуйте

Ошибок нет. Получилась зависимость времени(сек) от коэф. деления: 2(1), 11(8), 90(64), 360(256).
Поставил коэф. 64, изменил множитель в LDI ZH,HIGH(3*120*Fo/256/1024). Всё работает идеально :)) :)) Спасибо огромное, Akl ! Который раз уже выручаете :)) Только пока не разобрался в вашем коде. Вопросы появились:
1. Почему PB1 изменили на вход? Ведь прерывание работает независимо от того, на вход или выход работает ножка
2. ZH,HIGH(3*60*Fo/256/1024). F/1024=столько сделает подсчетов таймер за секунду. Делим еще на 256, получается 18,31... раз переполнится за секунду таймер. Умножаем на 180, получаем количество прерываний за 3 минуты. Но почему тогда светодиод выключился за 1.5 минуты?
3. Для чего установили флаг прерывания INT0 в GIFR в инициализации?
4. Если PB1 на вход, R вкл, то Pin.1=0. Если PB1 на вход, R вкл., затем вручную установить снова на вход, то Pin.1=0. Но! если PB1 на выход, R вкл., вручную установить на вход, то Pin.1=1. Почему так?

Понял, что я сильно замудрил :) у вас намного проще=> меньше вероятности ошибок
Полный чайник.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

1. Вы, в дальнейшем, переходите в POWER DOWN и чтобы прерывание по низкому уровню! сработало нужно какое-то время (не менее 6 тактов) для возникновения генерации RC-генератора.
2. Думаю, что тактирование осуществляется от 9,6МГц
3. Сброс флагов требования прерываний осуществляется записью 1.
4. Эти манипуляции сделаны только для проверки в студии.
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Сообщение СКАЗОЧНИК »

Привет всем еще раз. )
Возник у меня очередной тупой вопрос.
Есть некое число, которое представлено 25ю байтами в оперативке (может во флеше) МК АТТИНИ2313. Можно ли с ним делать операции сдвига? Как вообще нормально с ним работать?
Цель, сделать бегущий огонь. Описание его здесь:
http://radiokot.ru/forum/viewtopic.php?p=2304817#p2304817

Как в итоге узнавать, что в конце числа уже есть единица? Как делать сдвиг 200 битового числа, чтобы последняя единица (единицы) не вываливались?

З.Ы. хочу обратить внимание, что ИМЕННО 200 светодиодов в линию и именно 25 регистров распаяно для их управления. Бежит огонек от одного конца к другому только ОДИН. остается в конце строки. ЗА ним следующий падает на первый и тоже остается уже вторым с конца. За ними третий. и т.д. до заполнения всей строки.

З.З.Ы. Спасибо. Уже сам все победил. Осталось только по таймеру выровнять.
Если у кого-то будут интересные предложения, обязательно выслушаю. А пока я сделал свой извращенный алгоритм и он работает в железе, не занимая оперативки. Все на циклах и числа в 200 бит как такового не существует... :)))
Станислав
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3868
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

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

Сообщение Engineer_Keen »

LSL, LSR - сдвиг влево и вправо, выдвинутый бит остается в С, с обратной стороны задвигается 0.
ROL , ROR - тоже самое, но задвигаемый бит берется как раз из С, так можно двигать влево-вправо числа любой битности.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Сообщение СКАЗОЧНИК »

Понял. Знаю такие команды.
Однако на данный момент, сделал по своему. и неоптимизированный вариант эффекта не занимает оперативной и флеш памяти. Используются только регистры. Сам эффект при компиляции 116 Байт. И 56 Байт начальная конфигурация МК. Я доволен.
Станислав
Аватара пользователя
Flash.#13
Держит паяльник хвостом
Сообщения: 965
Зарегистрирован: Сб апр 12, 2014 23:46:03
Откуда: Киев

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

Сообщение Flash.#13 »

Хелп, полез в ШИМ с "точной фазой", (Phase Correct PWM) и дело не пошло (ATMega8). По описанию ШИМ в данном режиме меняет состояние ножки доходя до регистра сравнения, и затем счетчик реверсируется, и вновь меняет состояние ножки дойдя нули и обратно. В таком режиме вроде можно получить ровные прямоугольные колебания, их надо для пищалки, для звука будильника типа "пи". Обычный режим "быстрый ШИМ" запускается нормально, но с "точной фазой" чего-то не стартует. Нужна помощь, чего не так делаю:

Изображение

Код: Выделить всё

sbi DDRB, 1                ;ножка OC1A вкл.
ldi R16, 0x00
out OCR1AH, R16
ldi R16, 0xFF
out OCR1AL, R16         ;вписали задержку 00FF в OCR1A
ldi R16, 0b11000001
out TCCR1A, R16         ;настройка
ldi R16, 0b00010001
out TCCR1B, R16         ;настройка и пуск

Вписал WGM13_10 1001 (Phase and Freguensy Correct PWM, с OCR1A), но ножка OC1A не меняет состояние :cry:
Немного файлов по зажиганию: ФУОЗ 2.2 + программа правки таблиц 0.987, монтажка
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

для звука будильника типа "пи" сойдет и Fast PWM с "неточной фазой" :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Flash.#13
Держит паяльник хвостом
Сообщения: 965
Зарегистрирован: Сб апр 12, 2014 23:46:03
Откуда: Киев

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

Сообщение Flash.#13 »

Неа, Fast PWM плохо звучит и плохо регулируется. Почти день мучил этот будильник, в результате увидел что даже с транзистором в режиме эмиттерного повторителя он слишьком тихий, было принято решение выковырять пищалку с ее обвязкой с "дешевого китайского будильника", и использовать МК как ее включатель. :facepalm:
Немного файлов по зажиганию: ФУОЗ 2.2 + программа правки таблиц 0.987, монтажка
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

извиняюсь за оффтоп, но может у вас со слухом что-то не то? я делал полифонический "звонок" на тиньке с FastPWM на 15 кГц - звук был отличный! а ШИМ с "корректной фазой" будет в2 раза меньше по частоте, следовательно заведомо хуже по тембру.

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

Мой уютный бложик... заходите!
Ответить

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