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

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

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

Сообщение Alexeyslav »

Вот оно как.
can be changed without unintentionally changing
именно эта фраза из даташита дает гарантию того что порт работает правильно - т.е. инструкция SBI не зависит от реальных значений других битов на выводах контроллера.

Думаю, что ответ может дать эксперимент.


этот эксперимент только покажет что у PINx имеется защелка на входе, которая судя по даташиту срабатывает в начале выполнения следующей инструкции, т.е. в принципе NOP между инструкциями не нужен. Он там нужен чтобы дать напряжению на выводе контроллера установится, если его надо немедленно прочитать при помощи регистра PINx (впрочем - так работают емкостные датчики, измеряя время за которое напряжение на сенсоре достигнет установленного).

Эксперимент надо проводить несколько другой.
0. Подтянуть порт резисторами на 0
1. загрузить в порт 0b11111111, пару НОП-ов
2. переключить его на ввод и дать инструкцию SBI для любого бита, пару НОП-ов
3. переключить порт на вывод
Если там окажется хоть один НОЛЬ - значит SBI оперирует реальными значениями на порту а не значением в защелке.
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

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

Сообщение HHIMERA »

zero648 писал(а):Вы хоть бы потрудились перевести, что здесь написано.

Спасибо, не нуждаюсь... В технической литературе оперирую только лишь английским, даже мыслю на нём... :))

Уточню вопрос... чтобы понятнее было...
Из даташита Атмэла...
All AVR ports have true Read-Modify-Write functionality when used as general digital I/O ports.
..........
....
with the SBI and CBI instructions
....

А вот ваше умозаключение...
чтения нет у С/SBI

Откуда тогда берётся, по вашему, чтение в true Read-Modify-Write ??? :))
Попытайтесь перевести true и Read ... чтобы понять... :))
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

Сообщение zero648 »

HHIMERA писал(а):Откуда тогда берётся, по вашему, чтение в true Read-Modify-Write ??? :))

Здесь "чтение" относится к самим портам, а не к командам установки/сброса битов портов, этим командам абсолютно не важно состояние порта, так же как и команде OUT, по сути эти инструкции работают одинаково с той разницей, что OUT устанавливает весь порт, а CBI/SBI работают с отдельными битами.
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

Alexeyslav писал(а):Эксперимент надо проводить несколько другой.
Зачем так сложно!
Посмотрите на схему из даташита внимательно. Если сигнал идёт по кругу, то всё равно достаточно того, что я ранее приводил.
Количество nop-ов, возможно, придётся пробовать большее до 3-4. Чтобы точно определить задержку.

Ну, проверит кто-нибудь в железе это? Или нет? (нет у меня под рукой сейчас ничего для эксперимента :( )
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

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

Сообщение HHIMERA »

zero648 писал(а):
HHIMERA писал(а):Откуда тогда берётся, по вашему, чтение в true Read-Modify-Write ??? :))

Здесь "чтение" относится к самим портам, а не к командам установки/сброса битов портов, этим командам абсолютно не важно состояние порта, так же как и команде OUT, по сути эти инструкции работают одинаково с той разницей, что OUT устанавливает весь порт, а CBI/SBI работают с отдельными битами.

Ну да, ну да... для лучшего и однозначного понимания сойдёт... :))
А "true Read-Modify-Write" - просто атавизм... но зато как красиво звучит!!! :))
Из той же оперы... Single Cycle Operation...
Подайте один цикл и... ничего не произойдёт... Потому что один цикл выборки, другой - исполнение... правда с выборкой следующей команды... :))
"Я не даю готовых решений, я заставляю думать!"(С)
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

Речь идет не о задержках, а о том какой из сигналов RRx или RPx используется для чтения значения в процедуре Read-Modify-Write инициированной командой SBI.

Задержка? Триггер тактируется CLKio, значение в нем обновляется каждый такт, команды SBI выполняются два такта - первый из них это вычисление адреса операнда, значение в триггере успевает обновится до того как выполнится команда.
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

Ну , что-то совсем "зависла" тех поддержка ATMEL.
Поэтому в личной переписке мы обсудили этот вопрос с уважаемым AVREAL и пришли к следующим выводам
Если использовать SBI и CBI надо отдавать отчет что эта операция хоть и изменяет только один бит порта, но операция затрагивает все 8 выводов. Тоесть если на выводе будет лог.1 а его электрически замкнуть на лог.0 то после SBI/CBI это значение перекочует и в регистр порта...

Это однозначно нет. Скорее это пришло из PIC. По выходу у AVR стоит усилитель , так что до состояния регистра он не дотянется.Пока усилитель не выгорит совсем.
Новая функция порта избавляющая нас от необходимости проверки состояния порта перед его изменением.
Writing a logic one to PINxn toggles the value of PORTxn, independent on the value of DDRxn.
Note that the SBI instruction can be used to toggle one single bit in a port.

выполняется через мультиплексор и инвертор в обратной связи регистра PORTx.
Ну и "читается" и соответственно записывается именно PORTx при выполнениии команд SBI и CBI . Хотя на самом деле никакого чтения порта не происходит , лишнее это. Вот команды sbis sbic - эти да , читают таки порт , но опять таки PORTx
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15551
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

"Чтение-модификация- запись" однако существует...
Только у АВРки осложнения вызваны наличием трех регистров - собственно контроль входных выводов, регистр данных и регистр направления, да еще возможность произвольно устанавливать направление работы каждой лапки порта индивидуально... + "альтернативные" функции, которые включаются автоматически... :cry:
Аватара пользователя
ZERO..
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Сб окт 16, 2010 19:52:32
Откуда: Сургут

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

Сообщение ZERO.. »

Вечер добрый, форумчане!
Я уже писал свой вопрос на другой ветке форума, но там никого...
Начну с предистории, как и почему именно так хочу - но не получается :dont_know:
Мысль в голове не дает покоя сделать (симитировать) сигнал с пульта дистанционного управления, для самостоятельного изучения Ассемблера и AVR. В последующем конечно больше т.е. сделать устройство, которое будет принимать сигналы клавиш с пульта моего телевизора.
Но пока, хотелось бы конечно, именно симитировать по типу протокола самсунг: там сигнал состоит из 32бит+2бита стартовых. Это 8адрес+8адрес(без инверсии)+8команда+8команда(с инверсией).
На ATmega 8515, я по прерыванию TIM1_COMPA сделал сигнал в котором можно увеличить или уменьшить (во времени) сигнал "1" или "0" вне зависимости друг от друга (не знаю как Вам, но мне с трудом далось):
Потом (т.е. сейчас) у меня встал вопрос как этот самый сигнал от прерывания TIM1_COMPA: сделать просто от клавиши или хотя-бы от клавиши с прерыванием INT??? (т.е. нажал на клавишу сигнал пошел, отпустил сигнал пропал)
:kill: :kill: :kill:
Заранее Всем спасибо!!!
Мой вариант:
Спойлер;****************************************************
; ОСНОВНОЙ ЦИКЛ
Inf: rjmp Inf ;бесконечный цикл
;****************************************************
TIM1_COMPA: ;прерывание случилось

ldi Temp,0 ;обнуление таймера
out TCNT1H,Temp ;обнуление таймера
out TCNT1L,Temp ;обнуление таймера


inc Flag
cpi Flag,0b11111100 ;здеся время во включенном состоянии
breq Output_vikl
rjmp Output_vkl

Output_vikl:
ldi Flag,0b11111011 ;здеся на 1 меньше от времени включеного состояния
inc Flag1
cpi Flag1,0b11111100 ;здеся время в выключенном состоянии
brne Shift
ldi Flag,0
Shift:
ldi Temp1,0b10000000
out PortB,Temp1 ;вывод в порт
reti

Output_vkl:
ldi Flag1,0
ldi Temp1,0b00000001
out PortB,Temp1 ;вывод в порт

reti
[color=#FF4000]Ищу где? и как? надо пользоваться личкой[/color]
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

В пульте сигнал отправляется однократно, дальше повторы - в виде стартового импульса и ничего более пока держишь кнопку.

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

Вообще, если надо будет подавать на светодиод, то алгоритм должен быть несколько сложнее - импульсы надо еще промодулировать частотой в 38кГц.
Аватара пользователя
ZERO..
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Сб окт 16, 2010 19:52:32
Откуда: Сургут

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

Сообщение ZERO.. »

Alexeyslav спасибо за развёрнутый ответ, но пока хотелось бы просто за клавишу определться, дело в том что когда я вставляю команду проверки sbis PORTB,PB4, то у меня получается что сигнал идет, при "+" на ноге, а когда я зажимаю клавишу (на землю) то он пропадает и не появлятся больше даже после отпускания клавиши (подачи на ногу PB4 +)...
Если я включаю при "0" на PB4, то у меня сигнал не появлятся ни при старте, ни даже после отпускания клавиши (подачи на ногу PB4 +)
:facepalm: :facepalm: :facepalm:
[color=#FF4000]Ищу где? и как? надо пользоваться личкой[/color]
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

Где-то накосячил, что сказать...
Аватара пользователя
Coldheart
Прорезались зубы
Сообщения: 244
Зарегистрирован: Пт сен 10, 2010 20:39:32
Откуда: Украина Луганская обл.

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

Сообщение Coldheart »

Подскажите товаищи одну странную странность.
Значит ситуация такая.
Есть контроллер Тини 2313
На нем срабатывает прерывание по нажатию кнопки PD2 и PD3 то есть GIMSK у нас 0b11000000
При этом контроллер все время долбит динамическую индикацию
Ну зашибись, все работает гудд.
Далее делаем задержку прерывания чтобы он уходил на прерывание раз в 170 циклов динамики

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

   inc r29                              ;Задержка прерываний
   cpi r29,170         ;Если равно
   breq WR         ;То прыгаем на WR
   rjmp Indic          ;Иначе на Indic

Ну гудд далее делаю очистку EIFR(регистр маски прерываний по нажатию кнопок),
Разрешаю прерываения, буквально на один такт

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

WR:
   clr r29
   out EIFR,r29
   sei               ;Разрешаем прерывания
   nop
   cli
   rjmp Indic

Только вот незадача все равно если нажать быстро несколько раз кнопку, контроллер посчитает два раза её.
Т.е. как я понимаю, срабатывает прерываение => контроллер обрабатывает его => чухает задержку прерываения(в этот момент приходит второе нажатие), он дожидается разрешения прерываений и считает его.
Соответственно 2 раза вместа одного. Подскажите что не так?
Ведь если я почистил EIFR, то контроллер не должен идти на прерываение второй раз.
Задача: сделать так, чтобы кнопка нажалась, ушло прерываение сработало изменение в алгоритме, подождали 170 циклов динамики. Только теперь разрешаем срабатываеть контроллеру по прерываению.
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

Вообще это плохой подход. Обрабатывай кнопки вместе с динамической индикацией.

У тебя скорей всего возникает не два прерывания на месте а банальный дребезг контактов, второе срабатывание может произойти через сотню тактов после первого.
Кнопки на прерываниях - плохая, ОЧЕНЬ плохая идея. Возможно их так использовать только для однократного пробуждения контроллера от спячки, а дальше читать кнопки вместе с динамической индикацией или по таймеру каждые 10..20мс.
Аватара пользователя
Coldheart
Прорезались зубы
Сообщения: 244
Зарегистрирован: Пт сен 10, 2010 20:39:32
Откуда: Украина Луганская обл.

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

Сообщение Coldheart »

Alexeyslav
Милости прошу на 165 страницу сего раздела.
Сообщение за Ср окт 24, 2012 10:51:05
Там народ мну уговаривал "замутить на прерываниях", вот послушал.
Вообще мне кажется просто с динамикой кнопки обрабатывать тож не очень хорошая идея.
Там код достаточно большой и динамика затухнет пока сработает обработка кнопки а потом антидребезг.
К тому же основная причина почему взялся за прерывания - прерывание должно произойти по фронту сигнала.
На счет таймеров - согласен.
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

Сообщение zero648 »

Coldheart, обрабатывать кнопки во время индикации очень даже рационально, просто не надо фильтровать антидребезг в прерывании, а только сохранить в какую нибудь переменную состояние порта на котором кнопки и работать над антидребезгом уже в основной программе. Если грамотно подойти, то можно одним таймером выводить динамику, опрашивать кнопки, проигрывать WAV музыку и еще программный шим приделать на регулировку яркости дисплея, я такое делал на 8 МГц тактовой и ничего не тупит.
Не понятно почему нужно вызывать прерывание пофронту сигнала нажатия кнопки, с какой целью?
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

Вся прелесть обработки кнопок по таймеру в строгие интервалы времени в том что не нужно реализовывать никакого антидребезга, он выполняется автоматически - лишь бы проверки происходили не чаше 10мс. Тогда получится одно состояние не чаще 10мс, даже если попадет проверка на дребезг максимум что получим - регистрация нажатия на 10мс позже.
Аватара пользователя
Coldheart
Прорезались зубы
Сообщения: 244
Зарегистрирован: Пт сен 10, 2010 20:39:32
Откуда: Украина Луганская обл.

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

Сообщение Coldheart »

Спасибо большое, все пожелания учту в следующий раз.
Помогите с вопросом, почему не сбрасывается флаг прерывания?
Устройство почти готово, уже плату почти развел. Только под сомнение попало. что счетчик на 100 витках накручивает от себя еще 3-4 витка. Шпротеус работает идеально в данном случае, т.е. виртуальный образец делает все что от него и требуется, задержку хоть 20 минут делай. срабатывает он только один раз.
Посмотрите код, если у кого есть время :)
Частота 4МГц
Спойлер

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

.include "tn2313def.inc"         

.dseg

.cseg

       .ORG 0x0000   ; (RESET) Reset Handler
         rjmp Reset
         .ORG 0x0001    ; (INT_0) External Interrupt0 Handler
         rjmp CycleINC           
         .ORG 0x0002   ; (INT_1) External Interrupt1 Handler
         rjmp Flag   
         .ORG 0x0003   ; (TIMER1_CAPT) Timer1 Capture Handler
         RETI           
         .ORG 0x0004   ; (TIMER1_COMPA) Timer1 CompareA Handler
         RETI             
         .ORG 0x0005   ; (TIMER1_OVF) Timer1 Overflow Handler
         RETI         
         .ORG 0x0006    ; (TIMER0_OVF0) Timer0 Overflow Handler
         RETI           
         .ORG 0x0007   ; (USART0_RXC) USART0 RX Complete Handler
         RETI             
         .ORG 0x0008   ; (USART0_DRE) USART0,UDR Empty Handler
         RETI           
         .ORG 0x0009   ; (USART0_TXC) USART0 TX Complete Handler
         RETI             
         .ORG 0x000A   ; (ANA_COMP) Analog Comparator Handler
         RETI           
         .ORG 0x000B   ; (PCINT) Pin Change Interrupt
         RETI   
         .ORG 0x000C   ; (TIMER1_COMPB) Timer1 Compare B Handler
         RETI           
         .ORG 0x000D   ; (TIMER0_COMPA) Timer0 Compare A Handler
         RETI             
         .ORG 0x000E   ; (TIMER0_COMPB) Timer0 Compare B Handler
         RETI         
         .ORG 0x000F   ; (USI_START) USI Start Handler
         RETI             
         .ORG 0x0010   ; (USI_OVERFLOW) USI Overflow Handler
         RETI             
         .ORG 0x0011   ; (EE_READY) EEPROM Ready Handler
         RETI           
         .ORG 0x0012   ; (WDT_OVERFLOW) Watchdog Overflow Handler
         RETI                       
    .ORG   INT_VECTORS_SIZE         ; Конец таблицы прерываний

Reset:
   clr r0
   clr r1
   clr r2
   clr r3
   clr r4
   clr r5
   clr r6
   clr r7
   clr r8
   clr r9
   clr r10
   clr r11
   clr r12
   clr r13
   clr r14
   clr r15
   clr r16
   clr r17
   clr r18
   clr r19
   clr r20
   clr r21
   clr r22
   clr r23
   clr r24
   clr r25
   clr r26
   clr r27
   clr r28
   clr r29
   clr r30
   clr r31

   ldi R16,0b11000000    ; настройка флагов прерываний
      out GIMSK,R16

   ldi R16,0b00001010
      out MCUCR,R16   
      
   ldi R16,low(RamEnd)  ;установка указателя стека
       out SPL,R16
       
   ldi R16,0b00000000    ;настройка порта А
      out DDRA,R16

   ldi R16,0b11111111   ;настройка порта B
      out DDRB,R16

   ldi R16,0b01110011   ;настройка порта D
      out DDRD,R16

Indic:                ;Цикл индикации
   in R4,PinA

   sbrs R4,0          ;Если установлен PinA,0
   rcall EEWrite       ;То уходим на запись
      
   sbrs R4,1          ;Если установлен PinA,1
   rcall EERead       ;То уходим на чтение

   mov R22,R23
   rcall Decoder
   sbrc R19,7
   cbr R17,0b10000000
   out PortB,R17
   sbi PortD,5
   rcall Delay       
    cbi PortD,5
   
   
   mov R22,R24
   rcall Decoder       
   out PortB,R17     
   sbi PortD,4
   rcall Delay
   cbi PortD,4

   mov R22,r25
   rcall Decoder       
   out PortB,R17     
   sbi PortD,1
   rcall Delay
   cbi PortD,1

   mov R22,r26
   rcall Decoder       
   out PortB,R17   
   sbi PortD,0
   rcall Delay
   cbi PortD,0

   cbi PortD,6
   
     inc r29            ;Задержка прерываний
   cpi r29,170         ;Если равно
   breq WR            ;То прыгаем на WR
   rjmp Indic          ;Иначе на Indic

WR:
   clr r29
   out EIFR,r29
   
   sei            ;Разрешаем прерывания
   nop
   cli
   rjmp Indic


Flag:               ;Флаг инверсии
   rcall Delay
   sbrs r19,7         ;Если бит установлен, то
   rjmp YU            ;Пропускаем
   clr r19
   reti
YU:
   sbr r19,0b10000000
   sbi PortD,6
   rcall Delay
   reti

CycleINC:            ;!!!ЦИКЛ УВЕЛИЧЕНИЯ!!!   

   sbi PortD,6         ;Включили пищалку
   sbrc r19,7
   rjmp CycleDec
   inc r23
   cpi r23,10
   breq M
   ret
M:
   clr r23   
   inc r24
   cpi r24,10
   breq F
   ret
F:
   clr r24   
   inc r25
   cpi r25,10
   breq W
   ret
W:
   clr r25   
   inc r26
   cpi r26,10
   breq T
   ret
T:
   clr r26
   reti
          

CycleDEC:            ;!!!ЦИКЛ УМЕНЬШЕНИЯ!!!
   dec r23
   cpi r23,255
   breq M1
   ret
M1:
   ldi r23,9
   dec r24
   cpi r24,255
   breq F1
   ret
F1:
   ldi r24,9   
   dec r25
   cpi r25,255
   breq W1
   ret
W1:
   ldi r25,9
   dec r26
   cpi r26,255
   breq T1
   rjmp Indic
T1:
   ldi r26,9
   rjmp Indic
      

Decoder:            

   ldi ZL,Low(DcMatrix*2)      ;инициализация массива
   ldi ZH,High(DcMatrix*2)
   ldi R18,0                ;прибавление переменной
   add ZL,R22                 ;к 0-му адресу массива
   adc ZH,R18

   lpm                        ;загрузка значения
    mov R17,r0 
   ret

DcMatrix:
;массив - таблица истинности декодера
        ; hgfedcba   hgfedcba
   .db 0b11000000,0b11111001   ;0,1
   .db 0b10100100,0b10110000   ;2,3
   .db 0b10011001,0b10010010   ;4,5
   .db 0b10000010,0b11111000   ;6,7
   .db 0b10000000,0b10010000   ;8,9

EEWrite:               ;!!!ЗАПИСЬ ПЗУ!!!
   sbi PortD,6
   sbi PortB,6
   
   ldi R27,0      
   mov r5,r23
   rcall write
   
   inc r27
   mov r5,r24
   rcall write
   
   inc r27
   mov r5,r26
   rcall write
   
   inc r27
   mov r5,r26
   rcall write

   ldi r17,0b01111111      ;Начало красотульки
   out PortB,R17
   sbi PortD,0          
   rcall Delay1
   cbi PortD,0   

   sbi PortD,1            
   rcall Delay1
   cbi PortD,1   

   cbi PortD,6            ;-
   sbi PortD,4
   rcall Delay1
   cbi PortD,4
   
   sbi PortD,6            ;+
   sbi PortD,5
   rcall Delay1         ;Конец красотульки
   
   ldi R17,0b00000000                     
    out PortD,R17   
   cbi PortD,6            ;-
   ret

Write:
   SBIC   EECR,EEWE      ; Ждем готовности памяти к записи. Крутимся в цикле
   RJMP   Write           ; до тех пор пока не очистится флаг EEWE
                      
   OUT    EEARL,R27       ; Загружаем адрес нужной ячейки
   OUT    EEDR,R5       ; и сами данные, которые нам нужно загрузить
 
   SBI    EECR,EEMWE      ; взводим предохранитель
   SBI    EECR,EEWE      ; записываем байт
                
   RET                ; возврат из процедуры
   
EERead:                  ;!!!ЧТЕНИЕ ПЗУ!!!   
   sbi PortD,6

   ldi    r27,0
   rcall    Read
   mov    r23,r5
   
   inc    r27
   rcall   Read
   mov      r24,r5

   inc      r27
   rcall   Read
   mov      r25,r5

   inc    r28
   rcall   read
   mov      r26,r5
   
   ldi r17,0b01111111      ;Начало красотульки
   out PortB,R17
   sbi PortD,5

   rcall Delay1
   cbi PortD,6            ;-
   cbi PortD,5   

   sbi PortD,4
   rcall Delay1
   cbi PortD,4   

   sbi PortD,6            ;+
   sbi PortD,1
   rcall Delay1
   cbi PortD,1
            
   sbi PortD,0
   rcall Delay1         ;Конец красотульки
   
   ldi R17,0b00000000                     
    out PortD,R17   
   cbi PortD,6            ;-
   ret

Read:
   sbic    EECR,EEWE      ; Ждем пока будет завершена прошлая запись.
   rjmp   EERead         ; также крутимся в цикле.
   OUT    EEARL,r27      ; загружаем адрес нужной ячейки
   SBI    EECR,EERE       ; Выставляем бит чтения
   IN       R5, EEDR       ; Забираем из регистра данных результат
   ret   

     
Delay:
   ldi R20,10
   ldi R21,4
d1:       
   dec R20
   brne d1
   dec R21
   brne d1
   ret

Delay1:
   ldi R20,200
   ldi R21,200
d2:       
   dec R20
   brne d2
   dec R21
   brne d2
   ret


Вот тогда интересно в чем осовное преминение данных прерываний? Вызвать контроллер из дрема? И все...
Обработку по фронту здесь я решил применить потому что на счетчике будет висеть датчик Холла, геркон, либо оптокодер(пробовал все). Т.е. датчик сработал, пошел спад фронта - контроллер посчитал его.К тому же кнопка "Инверсия" идесь идет с фиксацией. Т.е. нажали, подождали спада переключились в инкремент, подождал второго спада, переключиись декремент. Писать все это ручками, без прерывания пробовал, получается неочень.
Вложения
Counter2313.rar
(8.23 КБ) 134 скачивания
HProteus.rar
(16.39 КБ) 130 скачиваний
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

Какой ужас а не программа... мне это больше напомнило дизассемблированную программу с языка высокого уровня.
Какой смысл обнулять все регистры, если это делается в процессе неизбежного аппаратного сброса? По крайней мере, если не верите то обнулить стоит только те регистры которым не происходит присваивание ДО их использования в программе, бывает это крайне редко.
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

Сообщение zero648 »

Alexeyslav писал(а):Какой смысл обнулять все регистры, если это делается в процессе неизбежного аппаратного сброса? По крайней мере, если не верите то обнулить стоит только те регистры которым не происходит присваивание ДО их использования в программе, бывает это крайне редко.

Аппаратный сброс регистры в реале не очищает, только в протеусе все так красиво, а на самом деле после сброса там всякая всячина, сам лично проверял.
Ответить

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