Ассемблер (ASM) для AVR в вопросах и ответах
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Подскажите еще
Если ZH=0, ZL=11111111 и к нему прибавить 1, то ZH=00000001 ? Или просто ZL обнулится и установится флаг переноса/переполнения?
Полный чайник.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Командами SUBI ZL,-1 INC ZL просто обнулится с установкой флага Z.
Командой ADIW ZH:ZL,1 просто добавится 1, т.е. значение пары станет 0x0100.
Но. приведёт к обнулению и установке флагов Z и C!
Командой ADIW ZH:ZL,1 просто добавится 1, т.е. значение пары станет 0x0100.
Но.
Код: Выделить всё
LDI R16,1
ADD ZL,R16Re: Ассемблер (ASM) для AVR в вопросах и ответах
akl писал(а):Командой ADIW ZH:ZL,1 просто добавится 1, т.е. значение пары станет 0x0100.
Код: Выделить всё
adiw ZH:ZL,0b10000000;Полный чайник.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Да ну...? Операнд 2 не может превышать 63.

ADIW Rd+1:Rd,K d ∈ {24,26,28,30}, 0 ≤ K ≤ 63 PC ← PC + 1
Спойлер
Re: Ассемблер (ASM) для AVR в вопросах и ответах
akl писал(а): Операнд 2 не может превышать 63.
Спасибо! Я тоже хочу быть таким же умным
Полный чайник.
- zero648
- Вымогатель припоя
- Сообщения: 650
- Зарегистрирован: Пн июн 18, 2012 12:01:04
- Откуда: Челябинская область, Копейск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
akl писал(а):Командами SUBI ZL,-1 INC ZL просто обнулится с установкой флага Z.
Поправка, на флаг С не влияют команды INC и DEC, арифметика влияет, а SUBI ZL,-1 просто вычтет 255 из ZL и конечно же получится 0 и поэтому никакого переполнения не произойдет.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
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 в вопросах и ответах
Именно вычтет. Потому что 255 - это и есть -1.
Fucking static initialization order fiasco
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Вы хоть перед тем как писать ,написали бы две строки кода и посмотрели ,что происходит
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Вот именно. Если написать пару строчек и попробовать, то будет, конечно, 0 и флаг С не установится. Процессор не призводит никаких тождественных преобразований "минус на минус = плюс", а тупо выполняет предписанное :
SUBI ZL,0xFF => 255 - 255 = 0 безо всяких С.
Один мой знакомый перед тем, как дать кому-то рекомендацию к действию, на себе проверял ....
SUBI ZL,0xFF => 255 - 255 = 0 безо всяких С.
Один мой знакомый перед тем, как дать кому-то рекомендацию к действию, на себе проверял ....
Re: Ассемблер (ASM) для AVR в вопросах и ответах
А ну да , он переведёт в hex
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Здравствуйте форумчане!
Подскажите, желательно на примере кода в несколько строк на асме, реализацию следующей задачи.
Порт контроллера подключен 4 пинами к одному устройству, а остальными к другому, причём не подряд, а
вперемешку (d0, d1, d2, d7 - одно устр-во , d3, d4, d5 d6 - другое). Необходимо выводить по команде 4 бита только на
1-е устройство, не затрагивая остальные 4 бита, как реализовать?
Подскажите, желательно на примере кода в несколько строк на асме, реализацию следующей задачи.
Порт контроллера подключен 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
И у ДИ-Халта на сайте тоже есть описание его библиотеки подобной, там сделано по первому варианту работы с портом.
И еще, несколько страниц назад, вроде описывали это уже.
и если лень будет ковырять мою писинину, то вот:
Если хочется примеры программ, то вот моя реализация второго варианта (там найдете, где объявлены линии порта, так и вывод в порт(ы)):
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Станислав
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Petr_Vas писал(а):Необходимо выводить по команде 4 бита только на
1-е устройство, не затрагивая остальные 4 бита, как реализовать?
Почитай у Ди-Хальта сталью про виртуальные порты. Под твою задачу - само то.
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
СКАЗОЧНИК
Seriyvolk
Спасибо за ответы! Буду вкуривать.
Seriyvolk
Спасибо за ответы! Буду вкуривать.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Здравствуйте
Задача была - на 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]Есть мысль, что это из-за прерывания в прерывании, но не более того
В дебаггере работает верно, если не считать ошибки переполнения стека 
Полный чайник.
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: Ассемблер (ASM) для AVR в вопросах и ответах
.. а где в обработчиках reti?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
ChipKiller писал(а):.. а где в обработчиках reti?
В обработчике Timer его нет, да. Если поставить reti, то после окончания задержки возвращается на bla...поэтому поставил rjmp start, а перед ним sei. Просто здесь sei еще не дописал
Полный чайник.
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: Ассемблер (ASM) для AVR в вопросах и ответах
reti нужен в конце любого прерывания - стек и улетает из-за его отсутствия