Programowanie mikrokontrolerów - mimuw.edu.plmengel/mikrokontrolery/zajecia1i2.pdf · Co to jest...

57

Transcript of Programowanie mikrokontrolerów - mimuw.edu.plmengel/mikrokontrolery/zajecia1i2.pdf · Co to jest...

Programowanie mikrokontrolerów

Marcin Engel Marcin Peczarski

8 listopada 2007

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.

Diody LED

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

na skutek resetu zewn¦trznego

CC

Kiedy pojawia si¦ przerwanie RESET

przy spadku napi¦cia (brown-out detection)

VCC

RESET

TIME-OUT

INTERNALRESET

VBOT-VBOT+

tTOUT

Kiedy pojawia si¦ przerwanie RESET

przy braku wyzerowania ukªadu watchdog

CK

CC

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

Typowa inicjacja stosu

ldi r16, high (RAMEND)

out SPH, r16

ldi r16, low (RAMEND)

out SPL, r16

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

Przyciski w VMLab

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

Algorytm obsªugi przycisku z powtarzaniem

if (klawisz wcisniety) then begin

wait(T);

while (klawisz wcisniety) then begin

obsluz zdarzenie;

licz := 0;

while (klawisz wcisniety and (licz < timeout)) begin

wait(T);

licz := licz + 1

end

zmodyfikuj (timeout)

end

end