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 od modelu): jednostk obliczeniow (8-, 16- lub nawet 32-bitow ) pami danych (SRAM, EEPROM) pami programu (FLASH, ROM, EEPROM) ukªady taktuj ce (RC) kontroler przerwa«liczniki przetworniki analogowo-cyfrowe przetworniki cyfrowo-analogowe interfejsy szeregowe (UART, SPI, I2C, 1WIRE, USB) ukªad nadzoruj cy (watchdog) zegar czasu rzeczywistego Mikrokontroler = komputer w jednym ukªadzie
Popularne mikrokontrolery PIC rmy Microchip Technology ukªady rodziny 68HC rmy Motorola (Freescale Semiconductor) Z8 rmy ZiLog ukªady AT89, AT90, AT91, AVR rmy Atmel...
Mikrokontrolery rmy Atmel rodzina AT89... rodzina AT90... rodzina AT91... procesory serii ATmega... procesory serii ATtiny... procesory ARM...
Jak zacz zabaw? trzeba mie mikrokontroler (ATmega16 kosztuje ok. 9PLN) oraz troszk innych elementów elektronicznych (diody LED, mikroswitche, rezystory, kondensatory, zª cza itp). Ponadto nale»y przygotowa : programator (cena ok. 26 PLN za gotowy, poni»ej 5 PLN przy samodzielnym monta»u) komputer z oprogramowaniem (darmowe programy PonyProg, AVRStudio, VMlab,... ) A tak»e: laminat, wytrawiacz, lutownic i inne narz dzia lub pªytk uniwersaln, lutownic lub pªytk stykow lub
Zestaw uruchomieniowy Umo»liwia szybkie tworzenie ukªadów testowych. Zawiera na pokªadzie wszystkie niezb dne podzespoªy, które ª czy si za pomoc przewodów.
Zestaw uruchomieniowy typowe wyposa»enie wy±wietlacz LCD lub/i segmentowy LED przyciski lub klawiatura matrycow ukªad zasilaj cy, kwarc, zª cze programatora
Zestaw uruchomieniowy typowe wyposa»enie wyprowadzenia interfejsów szeregowych (z ew. konwersj napi ) ciekawe peryferia (termometr, odbiornik i nadajnik IR, akumulator, pami FLASH, zegar RTC... )
Poznajemy ATmega16 (XCK/T0) PB0 (T1) PB1 (INT2/AIN0) PB2 (OC0/AIN1) PB3 (SS) PB4 (MOSI) PB5 (MISO) PB6 (SCK) PB7 RESET VCC GND XTAL2 XTAL1 (RXD) PD0 (TXD) PD1 (INT0) PD2 (INT1) PD3 (OC1B) PD4 (OC1A) PD5 (ICP1) PD6 PA0 (ADC0) PA1 (ADC1) PA2 (ADC2) PA3 (ADC3) PA4 (ADC4) PA5 (ADC5) PA6 (ADC6) PA7 (ADC7) AREF GND AVCC PC7 (TOSC2) PC6 (TOSC1) PC5 (TDI) PC4 (TDO) PC3 (TMS) PC2 (TCK) PC1 (SDA) PC0 (SCL) PD7 (OC2)
Budujemy pierwszy ukªad Na pocz tku podª czymy: zasilanie (nó»ki VCC, GND) ukªad reset (nó»ka RESET) przygotujemy zª cze programatora (nó»ki MOSI, MISO, SCK, RESET, VCC, GND) Wyja±nienia: VCC na schematach oznacza +zasilania (inne oznaczenie: VDD) GND to - zasilania oznaczenie RESET oznacza odwrócon logik (tj. reset jest nieaktywny, je±li podamy wysokie napi cie)
Zasilanie ukªad ATmega16 wymaga zasilania napi ciem staªym z zakresu 4.5 5.5V (wersja 16L od 2V7) dzisiaj zastosujemy 5V dostarczane przez stabilizator napi cia 7805 1
Zasilanie, cd. schemat poª cze«znajduje si w nocie katalogowej na pªytce testowej znajduje si mostek prostowniczy i stabilizator o regulowanym napi ciu wyj±ciowym
Ukªad resetu podczas normalnej pracy na nó»ce RESET powinien by stan wysoki chcemy móc r czne zresetowa urz dzenie (np. przyciskiem) programator równie» musi mie mo»liwo± zresetowania ukªadu Rozwi zanie:
Programator skªada si z dwóch cz ±ci: sprz t (kabelek) i oprogramowanie dwa tryby programowania: równolegªy i szeregowy w±ród nich te» istnieje wiele ró»nych rozwi za«programator równolegªy: jest szybki daje (prawie) peªny dost p do mikrokontrolera jest niezale»ny od ukªadu, w którym zastosowano mikrokontroler jest skomplikowany i drogi Programator szeregowy: umo»liwia programowanie bez wyjmowania mikrokontrolera z ukªadu (In-System Programming) jest tani i prosty w budowie
Programator szeregowy przyª czany do nó»ek MOSI, MISO, SCK, RESET mikrokontrolera pobiera zasilanie z programowanego ukªadu wspóªpracuje z darmowym oprogramowaniem PonyProg Standardy zª cza programatora ISP: ATMEL KANDA
Co mo»emy podª czy do mikrokontrolera? Jako wyj±cie: diody LED wy±wietlacz segmentowy LED wy±wietlacz LCD komputer (np. po zª czu szeregowym) inny ukªad (np. po zª czu I 2 C) nadajnik IR lub radiowy...
Co mo»emy podª czy do mikrokontrolera? Jako wej±cie: przycisk klawiatur matrycow klawiatur PC lub myszk inne ukªady komputer odbiornik IR, termometr analogowy itp.
Diody LED
Charakterystyka diody LED typowe parametry pracy pr d od kilku do kilkudziesi ciu ma, spadek napi cia od 1.5V do ponad 3V jasno± diody zale»y od pr du przez ni pªyn cego»ywotno± te»! nadmierny pr d mo»e uszkodzi diod
Jak przyª czy diod do mikrokontrolera? prawo Ohma: U = RI je±li chcemy, aby przez diod pªyn ª pr d 5mA, to sprawdzamy, jaki b dzie spadek napi cia na niej wª czamy w obwód rezystor dobrany tak, aby spadki napi cia na nim i na diodzie sumowaªy si do napi cia zasilania Na przykªad: je±li spadek napi cia na diodzie przy pr dzie 5mA wynosi 1.7V, a napi cie zasilania 5V, to takie parametry pracy zagwarantuje rezystor o warto±ci: (5V 1.7V )/5mA = 3.3V /5mA = 660Ω
Dioda - podsumowanie przewodzi pr d w jednym kierunku (i wtedy ±wieci) wymaga ograniczenia pr du za pomoc rezystora W zestawie uruchomieniowym: nie trzeba u»ywa rezystorów (bo s wlutowane) po poª czeniu diody z portem procesora dioda b dzie ±wieci po podaniu stanu 1 na odpowiedni nó»k W symulatorze: nie trzeba u»ywa rezystorów (ale b d problemy z ogl daniem przebiegów) dioda b dzie ±wieci po podaniu stanu 0 na odpowiedni nó»k (symulator)
Porty mikrokontrolera ka»da nó»ka mo»e by skongurowana jako wyj±cie lub jako wej±cie (domy±lnie jest wej±ciem) mamy cztery 8-bitowe porty: PA, PB, PC, PD je±li wyprowadzenie jest skongurowane jako wyj±cie, to jego stan zale»y od warto±ci odpowiedniego bitu rejestru we/wy PORTA, PORTB, PORTC lub PORTD, przy czym: 1 oznacza stan wysoki (napi cie zasilania) 0 oznacza stan niski (napi cie = 0V) wi kszo± wyprowadze«ma tak»e drug funkcj kierunek dziaªania portu mo»na dowolnie zmienia w trakcie pracy mikrokontrolera do ustalenia kierunku pracy portu sªu» rejestry we/wy DDRA, DDRB, DDRC, DDRD, przy czym: 1 oznacza wyj±cie 0 oznacza wej±cie
rodowisko VMLab tworzymy nowy projekt podgl damy rejestry PORTx oraz DDRx podª czamy wirtualne diody
Rejestry 7 0 Addr. $00 R0 R1 $01 R2 $02 R13 $0D General R14 $0E Purpose R15 $0F Working R16 $10 egisters 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 32 rejestry 8-bitowe: R0,..., R31 rejestry R26,..., R31 mog by u»ywane do 16-bitowego adresowania po±redniego pami ci danych (para rejestrów R26:R27, to rejestr X, R28:R29 to rejestr Y, R30:R31 to rejestr Z), np.: ld R16, X rejestr Z mo»na stosowa do adresowania po±redniego pami ci programu (rozkazy LPM, SPM)
Przerwania kod programu rozpoczyna si od wektora przerwa«zgªoszenie przerwania powoduje sprz towe: odªo»enie na stos adresu powrotu (ale nie rejestru stanu!) zablokowanie przerwa«poprzez wyzerowanie bitu I w rejestrze stanu SREG wykonanie rozkazu spod odpowiedniego adresu w pami ci programu program obsªugi przerwania musi ko«czy si rozkazem RETI, który wª cza przerwania
Vector No. Program Address 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 procesor o zredukowanym zbiorze rozkazów (RISC) architektura harwardzka (odr bne pami ci i magistrale dla programu i danych) 16KB pami ci programu (pami ash) 1KB pami ci danych (SRAM) 32 rejestry ogólnego przeznaczenia 64 rejestry wej±cia-wyj±cia dziaªanie podukªadów 512 bajtów pami ci nieulotnej (EEPROM) 3 liczniki 21 przerwa«(o ustalonej kolejno±ci obsªugi) interfejsy szeregowe: USART, I2C 8-kanaªowy, 10-bitowy przetwornik A/C
Architektura, schemat blokowy Data Bus 8-bit Flash Program Memory Program Counter Status and Control Instruction Register 32 x 8 General Purpose Registrers Interrupt Unit SPI Unit Instruction Decoder Control Lines Direct Addressing Indirect Addressing ALU Watchdog Timer Analog Comparator I/O Module1 Data SRAM I/O Module 2 I/O Module n EEPROM I/O Lines
Rejestry 7 0 Addr. $00 R0 R1 $01 R2 $02 R13 $0D General R14 $0E Purpose R15 $0F Working R16 $10 egisters 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 32 rejestry 8-bitowe: R0,..., R31 rejestry R26,..., R31 mog by u»ywane do 16-bitowego adresowania po±redniego pami ci danych (para rejestrów R26:R27, to rejestr X, R28:R29 to rejestr Y, R30:R31 to rejestr Z), np.: ld R16, X rejestr Z mo»na stosowa do adresowania po±redniego pami ci programu (rozkazy LPM, SPM)
Rejestry 7 0 Addr. $00 R0 R1 $01 R2 $02 R13 $0D General R14 $0E Purpose R15 $0F Working R16 $10 egisters 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 tylko rejestry R16,..., R31 mo»na stosowa w rozkazach adresowania natychmiastowego, np.: ldi R16, 123 subi R18, 5 przesªania warto±ci s mo»liwe mi dzy ka»d par rejestrów: mov R12, R17 jednostka arytmetyczno-logiczna potra wykonywa operacje na danych w dowolnych rejestrach, np.: add R12, R17
Jednostka arytmetyczno-logiczna wykonuje rozkazy arytmetyczne mi dzy rejestrami w jednym cyklu zegara wykonuje rozkazy arytmetyczne mi dzy rejestrem a danymi natychmiastowymi w jednym cyklu zegara wspiera operacje na liczbach bez znaku, ze znakiem (notacja uzupeªnieniowa do dwóch) oraz uªamkowych (staªoprzecinkowych) 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 bit I wª czone przerwania bit T do przechowania dowolnego bitu (rozkazy BLD, BST) bit H wyst piªo przeniesienie z mªodszego póªbajta do starszego bit V nadmiar w arytmetyce uzupeªnieniowej do dwóch bit N wynikiem operacji jest liczba ujemna bit S bit znaku bit Z wynikiem operacji jest zero bit C przeniesienie z najstarszego bitu
Pami programu Application Flash Section Boot Flash Section $0000 $1FFF ma 16KB jest podzielona na dwie cz ±ci z niezale»n ochron dost pu: boot loader oraz cz ± aplikacji wi kszo± kodów rozkazów jest 2-bajtowa, ale s te» rozkazy 4-bajtowe program mo»e modykowa sam siebie
Pami wej±cia/wyj±cia I/O Registers $00 $01 $02... $3D $3E $3F zawiera 64 rejestry wej±cia-wyj±cia odpowiedzialne m.in. za konguracje poszczególnych ukªadów wej±cia-wyj±cia (m.in. rejestry PORTx, DDRx, SP, SREG) adresowane od $00 do $3F zapis do nich odbywa si za pomoc rozkazu OUT, a odczyt za pomoc rozkazu IN na pierwszych 32 rejestrach we/wy mo»na bezpo±rednio ustawia bity (rozkazy SBI, CBI) i je sprawdza (rozkazy SBIS, SBIC)
Przerwania kod programu rozpoczyna si od wektora przerwa«zgªoszenie przerwania powoduje sprz towe: odªo»enie na stos adresu powrotu (ale nie rejestru stanu!) zablokowanie przerwa«poprzez wyzerowanie bitu I w rejestrze stanu SREG wykonanie rozkazu spod odpowiedniego adresu w pami ci programu program obsªugi przerwania musi ko«czy si rozkazem RETI, który wª cza przerwania
Vector No. Program Address 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) VCC V POT RESET V RST TIME-OUT t TOUT INTERNAL RESET
Kiedy pojawia si przerwanie RESET na skutek resetu zewn trznego CC
Kiedy pojawia si przerwanie RESET przy spadku napi cia (brown-out detection) V CC V BOT- V BOT+ RESET TIME-OUT t TOUT INTERNAL RESET
Kiedy pojawia si przerwanie RESET przy braku wyzerowania ukªadu watchdog CC CK
Co si dzieje po resecie? ustawienie rejestrów we/wy na warto±ci pocz tkowe 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 ma rozmiar 1KB adresowana od $0060 do $45F pami ulotna na adresy $0000 do $005F s wirtualnie odwzorowane rejestry ogólnego przeznaczenia i pami wej±cia-wyj±cia, np.: rozkazy out 10, r18 oraz st 30, r18 maj ten sam efekt! R0 R1 R2... R29 R30 R31 I/O Registers $00 $01 $02... $3D $3E $3F $0000 $0001 $0002... $001D $001E $001F $0020 $0021 $0022... $005D $005E $005F Internal SRAM $0060 $0061... $045E $045F
Tryby adresowania natychmiastowe: ldi r16, 3 bezpo±rednie: lds r1, 100 po±rednie: ld r1, X po±rednie z postinkrementacj : ld r1, X+ po±rednie z predekrementacj : ld r1, -X po±rednie z przemieszczeniem: ld r1, Y+2 po±rednie pami ci programu: lpm
Stos znajduje si w pami ci danych przed wykonaniem jakiejkolwiek operacji na stosie u»ytkownik musi ustawi dwubajtowy rejestr SP w pami ci we/wy stos ro±nie w dóª pami ci (od wysokich adresów do niskich) SP pokazuje zawsze na pierwszy wolny bajt pod wierzchoªkiem stosu rozkaz PUSH odkªada jeden bajt na stos, a POP zdejmuje jeden bajt ze stosu wywoªanie podprogramu (RCALL, CALL) odkªada dwa bajty (adres powrotu) na stos, a powrót z niego (RET) zdejmuje dwa bajty
Typowa inicjacja stosu ldi r16, high (RAMEND) out SPH, r16 ldi r16, low (RAMEND) out SPL, r16
Pami nieulotna stanowi odr bn przestrze«adresow dost p do niej odbywa si za pomoc specjalnych rejestrów we/wy (EEAR, EEDR, EECR) protokóª dost pu do tej pami ci pó¹niej
Sposób podª czania przycisku nó»ka musi by ustawiona jako wej±cie (bit 1 DDRA wyzerowany) odczyt stanu nó»ki odbywa si poprzez rejestr we/wy PINA,... wysoki stan nó»ki (1-szy bit PINA = 1) oznacza przycisk otwarty
Sposób podª czania przycisku nó»ka musi by ustawiona jako wej±cie (bit 1 DDRA wyzerowany) wewn trzny rezystor podci gaj cy musi by wª czony (bit 1 PORTA ustawiony) odczyt stanu nó»ki odbywa si poprzez rejestr we/wy PINA,... wysoki stan nó»ki (1-szy bit PINA = 1) oznacza przycisk otwarty
Przyciski w VMLab
Zjawisko drgania styków w rzeczywisto±ci wci±ni cie przycisku powoduje mikrodrgania 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