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

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

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

Сообщение neoneon »

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

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

Сообщение neoneon »

Подскажите еще :) Если ZH=0, ZL=11111111 и к нему прибавить 1, то ZH=00000001 ? Или просто ZL обнулится и установится флаг переноса/переполнения?
Полный чайник.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Командами SUBI ZL,-1 INC ZL просто обнулится с установкой флага Z.
Командой ADIW ZH:ZL,1 просто добавится 1, т.е. значение пары станет 0x0100.
Но.

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

   LDI   R16,1
   ADD   ZL,R16
приведёт к обнулению и установке флагов Z и C!
Аватара пользователя
neoneon
Встал на лапы
Сообщения: 115
Зарегистрирован: Ср окт 22, 2014 07:39:26
Откуда: Омск

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

Сообщение neoneon »

akl писал(а):Командой ADIW ZH:ZL,1 просто добавится 1, т.е. значение пары станет 0x0100.

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

   adiw   ZH:ZL,0b10000000;

:? error: Operand 2 out of range: 0x80
Полный чайник.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Да ну...? Операнд 2 не может превышать 63.
ADIW Rd+1:Rd,K d ∈ {24,26,28,30}, 0 ≤ K ≤ 63 PC ← PC + 1

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

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

Сообщение neoneon »

akl писал(а): Операнд 2 не может превышать 63.

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

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

Сообщение zero648 »

akl писал(а):Командами SUBI ZL,-1 INC ZL просто обнулится с установкой флага Z.

Поправка, на флаг С не влияют команды INC и DEC, арифметика влияет, а SUBI ZL,-1 просто вычтет 255 из ZL и конечно же получится 0 и поэтому никакого переполнения не произойдет.
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

zero648 писал(а):
akl писал(а):Командами SUBI ZL,-1 INC ZL просто обнулится с установкой флага Z.

Поправка, на флаг С не влияют команды INC и DEC, арифметика влияет, а SUBI ZL,-1 просто вычтет 255 из ZL и конечно же получится 0 и поэтому никакого переполнения не произойдет.

Поправка , не вычтет а прибавит ибо (минус на минус дает плюс)
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

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

Сообщение Pink-Pank »

Именно вычтет. Потому что 255 - это и есть -1.
Fucking static initialization order fiasco
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

Вы хоть перед тем как писать ,написали бы две строки кода и посмотрели ,что происходит
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

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

Сообщение Jack_A »

Вот именно. Если написать пару строчек и попробовать, то будет, конечно, 0 и флаг С не установится. Процессор не призводит никаких тождественных преобразований "минус на минус = плюс", а тупо выполняет предписанное :
SUBI ZL,0xFF => 255 - 255 = 0 безо всяких С.
Один мой знакомый перед тем, как дать кому-то рекомендацию к действию, на себе проверял ....
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

А ну да , он переведёт в hex
Аватара пользователя
Petr_Vas
Родился
Сообщения: 2
Зарегистрирован: Пн фев 09, 2015 15:55:41
Откуда: Липецк

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

Сообщение Petr_Vas »

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

вперемешку (d0, d1, d2, d7 - одно устр-во , d3, d4, d5 d6 - другое). Необходимо выводить по команде 4 бита только на

1-е устройство, не затрагивая остальные 4 бита, как реализовать?
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

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

Особо вариантов не много. Либо сначала читать состояние порта, потом накладывать маску, изменять нужные, а остальные возвращать обратно и все это опять выводить в порт. Либо отдельно каждым пином управлять. :)
Если хочется примеры программ, то вот моя реализация второго варианта (там найдете, где объявлены линии порта, так и вывод в порт(ы)):
http://radiokot.ru/forum/viewtopic.php?p=2254028#p2254028
И у ДИ-Халта на сайте тоже есть описание его библиотеки подобной, там сделано по первому варианту работы с портом.

И еще, несколько страниц назад, вроде описывали это уже.
и если лень будет ковырять мою писинину, то вот:

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

DB_LINE:                     ; Выводим тетраду в линии дисплея
            rcall OUT_PORT                 ; Делает пины, которые используются на ВЫХОД и обнуляет их...
            
            sbrc    R18, 4          ; Пропустить слудующую, еслли бит сброшен
            sbi      DB4port, DB4pin   ; Ставим бит
            sbrc    R18, 5          ; Пропустить слудующую, еслли бит сброшен
            sbi      DB5port, DB5pin   ; Ставим бит
            sbrc    R18, 6          ; Пропустить слудующую, еслли бит сброшен
            sbi      DB6port, DB6pin   ; Ставим бит
            sbrc    R18, 7          ; Пропустить слудующую, еслли бит сброшен
            sbi      DB7port, DB7pin   ; Ставим бит         
   ret
Станислав
Аватара пользователя
Seriyvolk
Друг Кота
Сообщения: 4961
Зарегистрирован: Сб май 05, 2012 20:19:55
Откуда: Минск

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

Сообщение Seriyvolk »

Petr_Vas писал(а):Необходимо выводить по команде 4 бита только на

1-е устройство, не затрагивая остальные 4 бита, как реализовать?

Почитай у Ди-Хальта сталью про виртуальные порты. Под твою задачу - само то.
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Аватара пользователя
Petr_Vas
Родился
Сообщения: 2
Зарегистрирован: Пн фев 09, 2015 15:55:41
Откуда: Липецк

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

Сообщение Petr_Vas »

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

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

Сообщение neoneon »

Здравствуйте :) Задача была - на ATtiny13 собрать устройство, которое включало бы светодиод на 3 минуты. Т.к. требовалось сильное энергосбережение - всё сделал на на прерываниях и сне :) Но дебаггер (avr studio 4) ругается на переполнение стека, как и протеус. В общем, суть программы на псевдокоде такая:
Спойлер

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

$000 nach (переход при сбросе\включении питания)
$001 knopka (при наличии 0 на входе INT0)
$003 timer (переполнение таймера\счетчика)

nach:
       sei
       разрешение прерыв. от Int0
       rjmp start
Knopka:
       запрет прерыв. от Int0
       sei
       разрешение прерыв. от переполнения
       разрешение idle mode
       rjmp bla
Timer:
       sei
       inc REG
       _проверка REG на совпадение с некоторым числом(для формирования задержки)
       если REG<числа, то rjmp bla
       иначе
       запрет прерыв. по переполнению
       разрешение прерыв. от Int0
       sei
       rjmp start
Start:
       разрешение Power-down
       sleep
       rjmp start
Bla:
      sleep (был разрешен Idle mode)
      rjmp bla

Для полного понимания - вся прога:
Спойлер

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

.device      ATtiny13
.nolist
.include   "C:\Program Files (x86)\Atmel\AVR Tools\AvrAssembler2\Appnotes\tn13def.inc"
.list

.def   temp=r16;
.def   srl=r17;
.def   srh=r18;

.cseg                  
                  
.org   $000
rjmp nach               ; (reset)

.org   $001               
rjmp   Knopka            ;

.org    $002
reti

.org   $003            
rjmp   timer            ; Timer\counter overflow            

Nach:
   ldi      temp, low(ramend);
   out      spl,temp
   ldi      temp,0x80      ; выкл. комп.
   out    ACSR,temp      ;

   ldi      temp,0b11111111 ;
   out      DDRB,temp      ;
   ldi      temp,0b00000011   ;
   out      PortB, temp      ;

   sei                  ;
   ldi      temp,0b01000000   ;раз. прер. от Int0
   out      GIMSK, temp      ;

   rjmp    start
; =========

Knopka:
   ldi      temp,0b00000000   ; запрещ прер INT0
   out      GIMSK, temp      ;

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

   ldi      temp,0b00100000   ; разр. sleep, idle
   out      MCUCR, temp      ;

   sei                  ;

   ldi      zh,$00   ; вводим числа, с которыми будет сравниваться т.н. REG
   ldi      zl,$02   ;

   ldi      temp,0b00000010 ;
   out      TIMSK0, temp   ;разр прер по переполнению

   ldi      temp,0b00000001 ;      
   out      TCCR0B,temp      ; clk/1024

   ldi      srL, $00      
   ldi      srH, $00
   rjmp    bla            
Timer: ;проверка
   inc      srL
   brvc    PC+3         ;
   inc      srh
   clr      srl

   sei                  ;
   cp      srh, zh         ;
   brlo   bla            ;
   cp      srl,zl         ;
   brlo   bla            ;
   ;проверку прошел
   ldi      temp,0b00000011   ; выкл LED
   out      PortB, temp      ;

   ldi      temp,0b00000000 ;
   out      TIMSK0, temp   ; запр прер по переполнениню


   ldi      temp,0b01000000   ; разр прерыв INT0
   out      GIMSK, temp      ;   

   rjmp start;
; =========
Start:
   ldi      temp,0b00110000   ; sleep, Power-down, проснется от 0 на Int0
   out      MCUCR, temp      ;
   sleep
   nop;
   rjmp start
Bla:                  
   sleep;
   rjmp bla
.exit

тут схемка
Спойлер[url=http://img.radiokot.ru/files/100717/medium/kqb7q9qmr.PNG]

Есть мысль, что это из-за прерывания в прерывании, но не более того :dont_know: В дебаггере работает верно, если не считать ошибки переполнения стека :dont_know:
Полный чайник.
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

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

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

Сообщение neoneon »

ChipKiller писал(а):.. а где в обработчиках reti?

В обработчике Timer его нет, да. Если поставить reti, то после окончания задержки возвращается на bla...поэтому поставил rjmp start, а перед ним sei. Просто здесь sei еще не дописал :) Прерывание в прерывании, поэтому в конце два раза писать reti? О__о
Полный чайник.
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

reti нужен в конце любого прерывания - стек и улетает из-за его отсутствия
Ответить

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