Co to jest mikrokontroler?
Ukªad integruj¡cy w sobie nast¦puj¡ce elementy (w zale»no±ci odmodelu):
I jednostk¦ obliczeniow¡ (8-, 16- lub nawet 32-bitow¡)
I pami¦¢ danych (SRAM, EEPROM)
I pami¦¢ programu (FLASH, ROM, EEPROM)
I ukªady taktuj¡ce (RC)
I kontroler przerwa«
I liczniki
I przetworniki analogowo-cyfrowe
I przetworniki cyfrowo-analogowe
I interfejsy szeregowe (UART, SPI, I2C, 1WIRE, USB)
I ukªad nadzoruj¡cy (watchdog)
I zegar czasu rzeczywistego
Mikrokontroler = komputer w jednym ukªadzie
Popularne mikrokontrolery
I PIC rmy Microchip Technology
I ukªady rodziny 68HC rmy Motorola (FreescaleSemiconductor)
I Z8 rmy ZiLog
I ukªady AT89, AT90, AT91, AVR rmy Atmel
I . . .
Mikrokontrolery rmy Atmel
I rodzina AT89. . .
I rodzina AT90. . .
I rodzina AT91. . .
I procesory serii ATmega. . .
I procesory serii ATtiny. . .
I procesory ARM. . .
Jak zacz¡¢ zabaw¦?
I trzeba mie¢ mikrokontroler (ATmega16 kosztuje ok. 9PLN)
I oraz troszk¦ innych elementów elektronicznych (diody LED,mikroswitche, rezystory, kondensatory, zª¡cza itp).
Ponadto nale»y przygotowa¢:
I programator (cena ok. 26 PLN za gotowy, poni»ej 5 PLN przysamodzielnym monta»u)
I komputer z oprogramowaniem (darmowe programy PonyProg,AVRStudio, VMlab, . . . )
A tak»e:
I laminat, wytrawiacz, lutownic¦ i inne narz¦dzia lub
I pªytk¦ uniwersaln¡, lutownic¦ lub
I pªytk¦ stykow¡ lub
Zestaw uruchomieniowy
Umo»liwia szybkie tworzenie ukªadów testowych. Zawiera napokªadzie wszystkie niezb¦dne podzespoªy, które ª¡czy si¦ zapomoc¡ przewodów.
Zestaw uruchomieniowy typowe wyposa»enie
I wy±wietlacz LCD lub/i segmentowy LED
I przyciski lub klawiatura matrycow¡
I ukªad zasilaj¡cy, kwarc, zª¡cze programatora
Zestaw uruchomieniowy typowe wyposa»enie
I wyprowadzenia interfejsów szeregowych (z ew. konwersj¡napi¦¢)
I ciekawe peryferia (termometr, odbiornik i nadajnik IR,akumulator, pami¦¢ FLASH, zegar RTC . . . )
Poznajemy ATmega16
(XC
K/T
0) P
B0
(T1)
PB
1(IN
T2/A
IN0)
PB
2(O
C0/
AIN
1) P
B3
(SS
) P
B4
(MO
SI)
PB
5(M
ISO
) P
B6
(SC
K)
PB
7R
ES
ET
VC
CG
ND
XTA
L2X
TAL1
(RX
D)
PD
0(T
XD
) P
D1
(INT0
) P
D2
(INT1
) P
D3
(OC
1B)
PD
4(O
C1A
) P
D5
(ICP
1) P
D6
PA0
(AD
C0)
PA1
(AD
C1)
PA2
(AD
C2)
PA3
(AD
C3)
PA4
(AD
C4)
PA5
(AD
C5)
PA6
(AD
C6)
PA7
(AD
C7)
AR
EF
GN
DAV
CC
PC
7 (T
OS
C2)
PC
6 (T
OS
C1)
PC
5 (T
DI)
PC
4 (T
DO
)P
C3
(TM
S)
PC
2 (T
CK
)P
C1
(SD
A)
PC
0 (S
CL)
PD
7 (O
C2)
Budujemy pierwszy ukªad
Na pocz¡tku podª¡czymy:
I zasilanie (nó»ki VCC, GND)
I ukªad reset (nó»ka RESET)
I przygotujemy zª¡cze programatora (nó»ki MOSI, MISO, SCK,RESET, VCC, GND)
Wyja±nienia:
I VCC na schematach oznacza +zasilania (inne oznaczenie:VDD)
I GND to - zasilania
I oznaczenie RESET oznacza odwrócon¡ logik¦ (tj. reset jestnieaktywny, je±li podamy wysokie napi¦cie)
Zasilanie
I ukªad ATmega16 wymaga zasilania napi¦ciem staªym zzakresu 4.5 5.5V (wersja 16L od 2V7)
I dzisiaj zastosujemy 5V dostarczane przez stabilizatornapi¦cia 7805
1
Zasilanie, cd.
I schemat poª¡cze« znajduje si¦ w nocie katalogowej
I na pªytce testowej znajduje si¦ mostek prostowniczy istabilizator o regulowanym napi¦ciu wyj±ciowym
Ukªad resetu
I podczas normalnej pracy na nó»ce RESET powinien by¢ stanwysoki
I chcemy móc r¦czne zresetowa¢ urz¡dzenie (np. przyciskiem)
I programator równie» musi mie¢ mo»liwo±¢ zresetowania ukªadu
Rozwi¡zanie:
Programator
I skªada si¦ z dwóch cz¦±ci: sprz¦t (kabelek) i oprogramowanie
I dwa tryby programowania: równolegªy i szeregowy
I w±ród nich te» istnieje wiele ró»nych rozwi¡za«
Programator równolegªy:
I jest szybki
I daje (prawie) peªny dost¦p do mikrokontrolera
I jest niezale»ny od ukªadu, w którym zastosowanomikrokontroler
I jest skomplikowany i drogi
Programator szeregowy:
I umo»liwia programowanie bez wyjmowania mikrokontrolera zukªadu (In-System Programming)
I jest tani i prosty w budowie
Programator szeregowy
I przyª¡czany do nó»ek MOSI, MISO, SCK, RESETmikrokontrolera
I pobiera zasilanie z programowanego ukªadu
I wspóªpracuje z darmowym oprogramowaniem PonyProg
Standardy zª¡cza programatora ISP:
I ATMEL
I KANDA
Co mo»emy podª¡czy¢ do mikrokontrolera?
Jako wyj±cie:
I diody LED
I wy±wietlacz segmentowy LED
I wy±wietlacz LCD
I komputer (np. po zª¡czu szeregowym)
I inny ukªad (np. po zª¡czu I2C)
I nadajnik IR lub radiowy
I . . .
Co mo»emy podª¡czy¢ do mikrokontrolera?
Jako wej±cie:
I przycisk
I klawiatur¦ matrycow¡
I klawiatur¦ PC lub myszk¦
I inne ukªady
I komputer
I odbiornik IR, termometr analogowy itp.
Charakterystyka diody LED
I typowe parametry pracyI pr¡d od kilku do kilkudziesi¦ciu mA,I spadek napi¦cia od 1.5V do ponad 3V
I jasno±¢ diody zale»y od pr¡du przez ni¡ pªyn¡cego
I »ywotno±¢ te»!
I nadmierny pr¡d mo»e uszkodzi¢ diod¦
Jak przyª¡czy¢ diod¦ do mikrokontrolera?
I prawo Ohma: U = RI
I je±li chcemy, aby przez diod¦pªyn¡ª pr¡d 5mA, to
I sprawdzamy, jaki b¦dziespadek napi¦cia na niej
I wª¡czamy w obwód rezystordobrany tak, aby spadkinapi¦cia na nim i na diodziesumowaªy si¦ do napi¦ciazasilania
Na przykªad: je±li spadek napi¦cia nadiodzie przy pr¡dzie 5mA wynosi 1.7V,a napi¦cie zasilania 5V, to takie para-metry pracy zagwarantuje rezystor owarto±ci:
(5V−1.7V )/5mA = 3.3V /5mA = 660Ω
Dioda - podsumowanie
I przewodzi pr¡d w jednym kierunku (i wtedy ±wieci)
I wymaga ograniczenia pr¡du za pomoc¡ rezystora
W zestawie uruchomieniowym:
I nie trzeba u»ywa¢ rezystorów (bo s¡ wlutowane)
I po poª¡czeniu diody z portem procesora dioda b¦dzie ±wieci¢po podaniu stanu 1 na odpowiedni¡ nó»k¦
W symulatorze:
I nie trzeba u»ywa¢ rezystorów (ale b¦d¡ problemy z ogl¡daniemprzebiegów)
I dioda b¦dzie ±wieci¢ po podaniu stanu 0 na odpowiedni¡ nó»k¦(symulator)
Porty mikrokontrolera
I ka»da nó»ka mo»e by¢ skongurowana jako wyj±cie lub jakowej±cie (domy±lnie jest wej±ciem)
I mamy cztery 8-bitowe porty: PA, PB, PC, PD
I je±li wyprowadzenie jest skongurowane jako wyj±cie, to jegostan zale»y od warto±ci odpowiedniego bitu rejestru we/wyPORTA, PORTB, PORTC lub PORTD, przy czym:
I 1 oznacza stan wysoki (napi¦cie zasilania)I 0 oznacza stan niski (napi¦cie = 0V)
I wi¦kszo±¢ wyprowadze« ma tak»e drug¡ funkcj¦
I kierunek dziaªania portu mo»na dowolnie zmienia¢ w trakciepracy mikrokontrolera
I do ustalenia kierunku pracy portu sªu»¡ rejestry we/wy DDRA,DDRB, DDRC, DDRD, przy czym:
I 1 oznacza wyj±cieI 0 oznacza wej±cie
rodowisko VMLab
I tworzymy nowy projekt
I podgl¡damy rejestry PORTx oraz DDRx
I podª¡czamy wirtualne diody
Rejestry
7 0 Addr.
R0 $00
R1 $01
R2 $02
…
R13 $0D
General R14 $0E
Purpose R15 $0F
Working R16 $10
Registers R17 $11
…
R26 $1A X-register Low Byte
R27 $1B X-register High Byte
R28 $1C Y-register Low Byte
R29 $1D Y-register High Byte
R30 $1E Z-register Low Byte
R31 $1F Z-register High Byte
I 32 rejestry 8-bitowe: R0, . . . , R31
I rejestry R26, . . . , R31 mog¡ by¢ u»ywane do 16-bitowegoadresowania po±redniego pami¦ci danych (para rejestrówR26:R27, to rejestr X, R28:R29 to rejestr Y, R30:R31 torejestr Z), np.: ld R16, X
I rejestr Z mo»na stosowa¢ do adresowania po±redniego pami¦ciprogramu (rozkazy LPM, SPM)
Przerwania
I kod programu rozpoczyna si¦ od wektora przerwa«
I zgªoszenie przerwania powoduje sprz¦towe:I odªo»enie na stos adresu powrotu (ale nie rejestru stanu!)I zablokowanie przerwa« poprzez wyzerowanie bitu I w rejestrze
stanu SREG
I wykonanie rozkazu spod odpowiedniego adresu w pami¦ciprogramu
I program obsªugi przerwania musi ko«czy¢ si¦ rozkazem RETI,który wª¡cza przerwania
Vector No.ProgramAddress Source Interrupt Definition
1 $000 RESET External Pin, Power-on Reset, Brown-out Reset, Watchdog Reset, and JTAG AVR Reset
2 $002 INT0 External Interrupt Request 0
3 $004 INT1 External Interrupt Request 1
4 $006 TIMER2 COMP Timer/Counter2 Compare Match
5 $008 TIMER2 OVF Timer/Counter2 Overflow
6 $00A TIMER1 CAPT Timer/Counter1 Capture Event
7 $00C TIMER1 COMPA Timer/Counter1 Compare Match A
8 $00E TIMER1 COMPB Timer/Counter1 Compare Match B
9 $010 TIMER1 OVF Timer/Counter1 Overflow
10 $012 TIMER0 OVF Timer/Counter0 Overflow
11 $014 SPI, STC Serial Transfer Complete
12 $016 USART, RXC USART, Rx Complete
13 $018 USART, UDRE USART Data Register Empty
14 $01A USART, TXC USART, Tx Complete
15 $01C ADC ADC Conversion Complete
16 $01E EE_RDY EEPROM Ready
17 $020 ANA_COMP Analog Comparator
18 $022 TWI Two-wire Serial Interface
19 $024 INT2 External Interrupt Request 2
20 $026 TIMER0 COMP Timer/Counter0 Compare Match
21 $028 SPM_RDY Store Program Memory Ready
Pierwszy program
.CSEG
.ORG 0
jmp start
.CSEG
.ORG 42
start:
ldi r16, 0b00001111
out DDRA, r16 ; nozki PA0..PA3 pracuja jako wyjscia
ldi r16, 0B
out PORTA, r16
petla:
rjmp petla
Architektura mikrokontrolera ATmega16
I procesor o zredukowanym zbiorze rozkazów (RISC)
I architektura harwardzka (odr¦bne pami¦ci i magistrale dlaprogramu i danych)
I 16KB pami¦ci programu (pami¦¢ ash)
I 1KB pami¦ci danych (SRAM)
I 32 rejestry ogólnego przeznaczenia
I 64 rejestry wej±cia-wyj±cia dziaªanie podukªadów
I 512 bajtów pami¦ci nieulotnej (EEPROM)
I 3 liczniki
I 21 przerwa« (o ustalonej kolejno±ci obsªugi)
I interfejsy szeregowe: USART, I2C
I 8-kanaªowy, 10-bitowy przetwornik A/C
Architektura, schemat blokowy
FlashProgramMemory
InstructionRegister
InstructionDecoder
ProgramCounter
Control Lines
32 x 8GeneralPurpose
Registrers
ALU
Statusand Control
I/O Lines
EEPROM
Data Bus 8-bit
DataSRAM
Dire
ct A
dd
ress
ing
Ind
ire
ct A
dd
ress
ing
InterruptUnit
SPIUnit
WatchdogTimer
AnalogComparator
I/O Module 2
I/O Module1
I/O Module n
Rejestry
7 0 Addr.
R0 $00
R1 $01
R2 $02
…
R13 $0D
General R14 $0E
Purpose R15 $0F
Working R16 $10
Registers R17 $11
…
R26 $1A X-register Low Byte
R27 $1B X-register High Byte
R28 $1C Y-register Low Byte
R29 $1D Y-register High Byte
R30 $1E Z-register Low Byte
R31 $1F Z-register High Byte
I 32 rejestry 8-bitowe: R0, . . . , R31
I rejestry R26, . . . , R31 mog¡ by¢ u»ywane do 16-bitowegoadresowania po±redniego pami¦ci danych (para rejestrówR26:R27, to rejestr X, R28:R29 to rejestr Y, R30:R31 torejestr Z), np.: ld R16, X
I rejestr Z mo»na stosowa¢ do adresowania po±redniego pami¦ciprogramu (rozkazy LPM, SPM)
Rejestry7 0 Addr.
R0 $00
R1 $01
R2 $02
…
R13 $0D
General R14 $0E
Purpose R15 $0F
Working R16 $10
Registers R17 $11
…
R26 $1A X-register Low Byte
R27 $1B X-register High Byte
R28 $1C Y-register Low Byte
R29 $1D Y-register High Byte
R30 $1E Z-register Low Byte
R31 $1F Z-register High Byte
I tylko rejestry R16, . . . , R31 mo»na stosowa¢ w rozkazachadresowania natychmiastowego, np.:ldi R16, 123
subi R18, 5I przesªania warto±ci s¡ mo»liwe mi¦dzy ka»d¡ par¡ rejestrów:
mov R12, R17I jednostka arytmetyczno-logiczna potra wykonywa¢ operacje
na danych w dowolnych rejestrach, np.:add R12, R17
Jednostka arytmetyczno-logiczna
I wykonuje rozkazy arytmetyczne mi¦dzy rejestrami w jednymcyklu zegara
I wykonuje rozkazy arytmetyczne mi¦dzy rejestrem a danyminatychmiastowymi w jednym cyklu zegara
I wspiera operacje na liczbach bez znaku, ze znakiem (notacjauzupeªnieniowa do dwóch) oraz uªamkowych(staªoprzecinkowych)
I rejestr stanu (SREG) jest uaktualniany po ka»dej operacji ALU:
Rejestr stanu
Bit 7 6 5 4 3 2 1 0
I T H S V N Z C SREG
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W
Initial Value 0 0 0 0 0 0 0 0
I bit I wª¡czone przerwania
I bit T do przechowania dowolnego bitu (rozkazy BLD, BST)
I bit H wyst¡piªo przeniesienie z mªodszego póªbajta dostarszego
I bit V nadmiar w arytmetyce uzupeªnieniowej do dwóch
I bit N wynikiem operacji jest liczba ujemna
I bit S bit znaku
I bit Z wynikiem operacji jest zero
I bit C przeniesienie z najstarszego bitu
Pami¦¢ programu
$0000
$1FFF
Application Flash Section
Boot Flash Section
I ma 16KB
I jest podzielona na dwie cz¦±ci zniezale»n¡ ochron¡ dost¦pu: bootloader oraz cz¦±¢ aplikacji
I wi¦kszo±¢ kodów rozkazów jest2-bajtowa, ale s¡ te» rozkazy4-bajtowe
I program mo»e modykowa¢ samsiebie
Pami¦¢ wej±cia/wyj±cia
I/O Registers$00$01$02
$3D$3E$3F
...
I zawiera 64 rejestry wej±cia-wyj±cia odpowiedzialne m.in. zakonguracje poszczególnych ukªadów wej±cia-wyj±cia (m.in.rejestry PORTx, DDRx, SP, SREG)
I adresowane od $00 do $3F
I zapis do nich odbywa si¦ za pomoc¡ rozkazu OUT, a odczyt zapomoc¡ rozkazu IN
I na pierwszych 32 rejestrach we/wy mo»na bezpo±rednioustawia¢ bity (rozkazy SBI, CBI) i je sprawdza¢ (rozkazy SBIS,SBIC)
Przerwania
I kod programu rozpoczyna si¦ od wektora przerwa«
I zgªoszenie przerwania powoduje sprz¦towe:I odªo»enie na stos adresu powrotu (ale nie rejestru stanu!)I zablokowanie przerwa« poprzez wyzerowanie bitu I w rejestrze
stanu SREG
I wykonanie rozkazu spod odpowiedniego adresu w pami¦ciprogramu
I program obsªugi przerwania musi ko«czy¢ si¦ rozkazem RETI,który wª¡cza przerwania
Vector No.ProgramAddress Source Interrupt Definition
1 $000 RESET External Pin, Power-on Reset, Brown-out Reset, Watchdog Reset, and JTAG AVR Reset
2 $002 INT0 External Interrupt Request 0
3 $004 INT1 External Interrupt Request 1
4 $006 TIMER2 COMP Timer/Counter2 Compare Match
5 $008 TIMER2 OVF Timer/Counter2 Overflow
6 $00A TIMER1 CAPT Timer/Counter1 Capture Event
7 $00C TIMER1 COMPA Timer/Counter1 Compare Match A
8 $00E TIMER1 COMPB Timer/Counter1 Compare Match B
9 $010 TIMER1 OVF Timer/Counter1 Overflow
10 $012 TIMER0 OVF Timer/Counter0 Overflow
11 $014 SPI, STC Serial Transfer Complete
12 $016 USART, RXC USART, Rx Complete
13 $018 USART, UDRE USART Data Register Empty
14 $01A USART, TXC USART, Tx Complete
15 $01C ADC ADC Conversion Complete
16 $01E EE_RDY EEPROM Ready
17 $020 ANA_COMP Analog Comparator
18 $022 TWI Two-wire Serial Interface
19 $024 INT2 External Interrupt Request 2
20 $026 TIMER0 COMP Timer/Counter0 Compare Match
21 $028 SPM_RDY Store Program Memory Ready
Kiedy pojawia si¦ przerwanie RESET
po wª¡czeniu zasilania (Power-On Reset)
V
RESET
TIME-OUT
INTERNALRESET
tTOUT
VPOT
VRST
CC
Kiedy pojawia si¦ przerwanie RESET
przy spadku napi¦cia (brown-out detection)
VCC
RESET
TIME-OUT
INTERNALRESET
VBOT-VBOT+
tTOUT
Co si¦ dzieje po resecie?
I ustawienie rejestrów we/wy na warto±ci pocz¡tkowe
I rozpocz¦cie wykonania programu od instrukcji znajduj¡cej si¦pod adresem 0 (przerwanie 0)
Pierwszy program
.CSEG
.ORG 0
jmp start
.CSEG
.ORG 42
start:
ldi r16, 0b00001111
out DDRA, r16 ; nozki PA0..PA3 pracuja jako wyjscia
ldi r16, 0B
out PORTA, r16
petla:
rjmp petla
Pami¦¢ danych
I ma rozmiar 1KB
I adresowana od $0060 do $45F
I pami¦¢ ulotna
I na adresy $0000 do $005F s¡ wirtualnie odwzorowane rejestryogólnego przeznaczenia i pami¦¢ wej±cia-wyj±cia, np.: rozkazyout 10, r18 oraz st 30, r18 maj¡ ten sam efekt!
R0R1R2
R29R30R31
I/O Registers$00$01$02
...
$3D$3E$3F
...
$0000$0001$0002
$001D$001E$001F
$0020$0021$0022
...
$005D$005E$005F
...
$0060$0061
$045E$045F
...
Internal SRAM
Tryby adresowania
I natychmiastowe: ldi r16, 3
I bezpo±rednie: lds r1, 100
I po±rednie: ld r1, X
I po±rednie z postinkrementacj¡: ld r1, X+
I po±rednie z predekrementacj¡: ld r1, -X
I po±rednie z przemieszczeniem: ld r1, Y+2
I po±rednie pami¦ci programu: lpm
Stos
I znajduje si¦ w pami¦ci danych
I przed wykonaniem jakiejkolwiek operacji na stosie u»ytkownikmusi ustawi¢ dwubajtowy rejestr SP w pami¦ci we/wy
I stos ro±nie w dóª pami¦ci (od wysokich adresów do niskich)
I SP pokazuje zawsze na pierwszy wolny bajt pod wierzchoªkiemstosu
I rozkaz PUSH odkªada jeden bajt na stos, a POP zdejmuje jedenbajt ze stosu
I wywoªanie podprogramu (RCALL, CALL) odkªada dwa bajty(adres powrotu) na stos, a powrót z niego (RET) zdejmuje dwabajty
Pami¦¢ nieulotna
I stanowi odr¦bn¡ przestrze« adresow¡
I dost¦p do niej odbywa si¦ za pomoc¡ specjalnych rejestrówwe/wy (EEAR, EEDR, EECR)
I protokóª dost¦pu do tej pami¦ci pó¹niej
Sposób podª¡czania przycisku
I nó»ka musi by¢ ustawiona jako wej±cie (bit 1 DDRA
wyzerowany)
I wewn¦trzny rezystor podci¡gaj¡cy musi by¢ wª¡czony (bit 1PORTA ustawiony)
I odczyt stanu nó»ki odbywa si¦ poprzez rejestr we/wy PINA, . . .I wysoki stan nó»ki (1-szy bit PINA = 1) oznacza przycisk
otwartyI niski stan przycisk zamkni¦ty
Sposób podª¡czania przycisku
I nó»ka musi by¢ ustawiona jako wej±cie (bit 1 DDRA
wyzerowany)I wewn¦trzny rezystor podci¡gaj¡cy musi by¢ wª¡czony (bit 1
PORTA ustawiony)I odczyt stanu nó»ki odbywa si¦ poprzez rejestr we/wy PINA, . . .I wysoki stan nó»ki (1-szy bit PINA = 1) oznacza przycisk
otwartyI niski stan przycisk zamkni¦ty
Zjawisko drgania styków
I w rzeczywisto±ci wci±ni¦cie przycisku powoduje mikrodrgania
I stan stabilizuje si¦ po pewnym czasie
Symulacja tego zjawiska w VMLab
P_left NRZ(2m) PA1
+ KEY_4 "01010100000000000000000000000000001010101"
+ RESET "1"
Algorytm obsªugi przycisku bez powtarzania
if (klawisz wcisniety) then begin
wait(T);
if (klawisz wcisniety) then begin
obsluz zdarzenie;
while (klawisz wcisniety)
wait(T);
end
end
I jego realizacja
; Czy klawisz wcisniety?
in r16, PINA
andi r16, 0b00000010
brne key_end
; Tak, poczekaj na ustabilizowanie stanu.
ldi r25, high(KEY_STABILIZATION_TIME)
ldi r24, low(KEY_STABILIZATION_TIME)
rcall wait
; Czy klawisz nadal wcisniety?
in r16, PINA
andi r16, 0b00000010
brne key_end
; Tak, wykonaj procedure obslugi.
rcall key
Realizacja, cd.
key_wait:
; Czy klawisz nadal wcisniety?
in r16, PINA
andi r16, 0b00000010
brne key_end
; Tak, czekaj jeszcze.
ldi r25, high(KEY_STABILIZATION_TIME)
ldi r24, low(KEY_STABILIZATION_TIME)
rcall wait
brne key_wait