400 likes | 637 Views
BME VIK - Mérés laboratórium 2. AVR ATmega128 mikrokontroller. 1. mérés. A mérés célja. Mikrokontrolleres környezet megismerése Jobb rálátás arra, mi zajlik a magasszintű programozási nyelvek „hátterében” Beágyazott alkalmazásfejlesztés módszereinek elsajátítása. A mérés témái.
E N D
BME VIK - Mérés laboratórium 2 AVR ATmega128 mikrokontroller 1. mérés
A mérés célja • Mikrokontrolleres környezet megismerése • Jobb rálátás arra, mi zajlik a magasszintű programozási nyelvek „hátterében” • Beágyazott alkalmazásfejlesztés módszereinek elsajátítása BME VIK - Mérés laboratórium 2
A mérés témái • ATmega128 hardver ismertető • Assembly bevezető • Beágyazott specialitások • I/O portok kezelése • Megszakítások • Időzítés • Amikről nem beszélünk… De tudni kell! • Fejlesztőkörnyezet, szimuláció BME VIK - Mérés laboratórium 2
ATmega128 hardver ismertető • CPU: • 16 MHz (11 MHz a laborban használt paneleken) • 133 RISC jellegű utasítás • Általában 1 utasítás/ciklus, ha nem ugrás • Mem: • 128K Flash (program) • 4K EEPROM + 4K belső SRAM (adat) • 32 regiszter, 16 felsőnek kitüntetett szerep, 3 páros regiszter • Perifériák: (mérőpanel-specifikus) • LED, nyomógomb, kapcsoló, LCD, potméter, fényérzékelő, hőmérséklet-szenzor, UART, … • Perifériakezelés: I/O reg. tartomány és memóriába ágyazott • Sok I/O láb; némely kimenet alkalmas LED-ek közvetlen meghajtására, beépítése pl. FPGA-khoz képest könnyű További paraméterek:avr128-leir2.pdf (+389 oldalas adatlap) Harvard-architektúra BME VIK - Mérés laboratórium 2
ATmega128 mérőpanel Mérőpanel-specifikus: AVR_ExperimentBoard_v103.pdf BME VIK - Mérés laboratórium 2
AVR blokkvázlat BME VIK - Mérés laboratórium 2
ATmega128 programozása • AVR: Atmel RISC processzorcsalád,ATmega128: AVR processzor 128K flash memóriával („Advanced Virtual RISC”) • Fejlesztőkörnyezet: AVRStudio • Assembly és C nyelv támogatott (utóbbi nem beépített: AVR-GCC, WinAVR) • Hardverben történő felprogramozás (ISP, In System Programming) és debug (JTAG-ICE, In Circuit Emulation) • Jó minőségű szimulációs felület (mikrokontroller + integrált perifériák) – kész hardver nélkül is elkezdhető a programozás Házi feladatot mindenki ellenőrizze otthon! (azokat a részeket, amiket lehet) BME VIK - Mérés laboratórium 2
AVRStudio IDE (IDE: Integrated Development Environment) Használata: avrst-haszn1.pdf + mérés 2. része BME VIK - Mérés laboratórium 2
A mérés témái • ATmega128 hardver ismertető • Assembly bevezető • Beágyazott specialitások • I/O portok kezelése • Megszakítások • Időzítés • Amikről nem beszélünk… De tudni kell! • Fejlesztőkörnyezet, szimuláció BME VIK - Mérés laboratórium 2
Assembly kitérő (x86) – mekkora kód? BME VIK - Mérés laboratórium 2
Assembly kitérő (x86) – ekkora! S equ 0E5h ; like original org 100h ; assumes: ah=0 bx=0 cl>0 di=0FFFEh si=0100h mov al,13h ; (2) int 10h ; (2) lds bx,[bx] ; (2) bx=20CDh ds=9FFFh M: cmp [bx],cl ; (2) adc [bx],ah ; (2) if ([bx] < cl) [bx]++ (first pass increases) imul bx,byte S ; (3) pseudorandom generator: bx = S*bx-1 (works if S%4==1) mov cl,[bx] ; (2) we don't decrease bx yet add cl,[bx+di] ; (2) add cl,[bx-321] ; (4) add cl,[bx+si+63]; (3) cl = ([bx+1]+[bx-1]+[bx-320]+[bx+320]) & 0FFh dec bx ; (1) in al,60h ; (2) standard ESC check dec al ; (2) jnz M ; (2) ret ; (1) Lefordítva gépi kódra: 32 byte (Forrás: http://www.pouet.net/prod.php?which=28913) BME VIK - Mérés laboratórium 2
Assembly kitérő (x86) – C fordítás menete C nyelvű forráskód Előfeldolgozó (preprocessor) C forrás (makrók stb. behelyettesítve: #define; #include…) gcc –E prog.c Fordító (compiler) Assembly kód (architektúra-függő, optimalizált) gcc –S prog.c Assembler Tárgykód (Object code) Könyvtári függvények (libraries) Linker Futtatható állomány (.com, .exe, ELF…) BME VIK - Mérés laboratórium 2
Assembly bevezető • Assembly = „összeszerelés” • Alacsonyszintű programozási nyelv • Architektúrafüggő (pl. x86, PPC, AVR…) • C nyelv és gépi kód között – tömör és jól kiszámítható lefutású • Alkalmazás: főként kis beágyazott rendszerek (pl. PIC, AVR) • Nagyobb projektek: asm fejlesztés drága, rugalmatlan; C fordítók jól optimalizálnak • Főként számításintenzív feladatokra, ott is ritkán (matematikai, grafikai) + reverse engineering (pl. programok feltörése) BME VIK - Mérés laboratórium 2
AVR assembly - regiszterek • RISC utasításkészlet, load/store architektúra: egyszerű memóriamanipulációk a regiszterkészlet segítségével • Regiszterkészlet: • kiemelt fontosságú, 32 db 8 bites adat • szinte minden művelet rajtuk keresztül zajlik • 16 fölöttiek használhatók közvetlen műveletekhez • Utolsó 3 pár kettősregiszterként (16 bit) is szolgál Pl: „rakj a LED-re 00110011 mintát”: 1. Tölts egy regiszterbe 00110011-et: ldi temp, 0b00110011 2. Add ki a kimenetre a regisztert: out PORTC, temp BME VIK - Mérés laboratórium 2
AVR assembly – speciális regiszterek • Státuszregiszter (SREG) - flagek • Carry, Zero, Global Interrupt Enable/Disable… • Néhány utasítás automatikusan átbillentheti értéküket (aritmetikaiak), mások az értékük alapján adnak lehetőséget elágazásra – lásd az utasításkészletben • buta megoldás: I/O címtartományban, emiatt interruptkezelő rutin elején státuszmentés: PUSH temp PUSH SREG helyett IN temp, SREG PUSH temp További információ: avr128-leir2.pdf, „Regiszterek” fejezet BME VIK - Mérés laboratórium 2
AVR assembly – speciális regiszterek • Veremmutató (SP, Stack pointer) • Szubrutinok visszatérési címeinek és megszakításkezelő rutin környezeti változóinak átmeneti tárolására (push, pop) • Inicializálás RAM tetejére: • 2 byte-os regiszter • Utasításszámláló (PC, Program Counter) • Aktuális utasítás címe • CALL és megszakítás hatására verembe mentődik; RET és RETI innen tölti vissza a szubrutin ill. megszakításkezelő rutin végén ldi temp, LOW(RAMEND) out SPL, temp ldi temp, HIGH(RAMEND) out SPH, temp BME VIK - Mérés laboratórium 2
AVR assembly - utasítások utasítás (mnemonic) ldi temp, 0xA5 ; 10100101 out PORTC, temp ; LEDre írás argumentumok (operandusok) megjegyzés (nagyon fontos!) Utasítás-család pl: load, load immediate, load direct from SRAM… LD, LDI, LDS… BME VIK - Mérés laboratórium 2
AVR assembly - utasítások utasítás argumentumok ldi temp, 0xA5 ; 10100101 out PORTC, temp ; LEDre írás „hátulról előre” SREG Utasításkészlet: avr128-prog1.pdf + Instr_set.pdf + fejlesztőkörnyezet súgója BME VIK - Mérés laboratórium 2
AVR assembly - utasítástípusok • aritmetikai és logikai utasítások • elágazások és ugrások • adatmozgató • bitmódosító, bittesztelő utasítások BME VIK - Mérés laboratórium 2
AVR assembly – utasítások C jelleggel Aritmetikai és logikai Adatmozgató Bitműveletek, egyebek BME VIK - Mérés laboratórium 2
AVR assembly - ugróutasítások • JMP: feltétel nélküli ugrás Végtelen ciklus pl.: • CALL, RET: szubrutinhívás és visszatérés (PC bekerül a verembe) • RETI: visszatérés interruptból Szubrutin: Hasonló C konstrukció: BME VIK - Mérés laboratórium 2
AVR assembly – feltételes elágazások • egyenlőségvizsgálat A CPSE utasítás a „JMP L2”-t átugorja, ha a két operandus egyenlő - így pont L1-re érkezik.Az összetettebb feltételekhez rajzoljunk folyamatábrát, különben a mérésvezető sem fogja tudni követni! BME VIK - Mérés laboratórium 2
AVR assembly – feltételes elágazások • switch / case Figyelem! A BREQ maximálisan 64 byte távolságra alkalmazható! (Távolabbra pl. közbeiktatott JMP-vel.) BME VIK - Mérés laboratórium 2
AVR assembly – for ciklus • több byte-os ciklusszámlálójú for ciklus: Megoldható 2 byte-os utasításokkal is (pl. SBIW vagy ADIW). BME VIK - Mérés laboratórium 2
AVR assembly – direktívák, egyebek .include "m128def.inc" • az ATmega128 regisztereit és bitjeit specifikáló állomány beolvasása .def temp = r16 • az r16-os regiszterre a továbbiakban temp-ként is hivatkozhatunk .equ tconst = 100 • konstans érték definiálása .org $0046 • az ezt a sort követő utasítás kezdőcíme a memóriában (pl. interrupt-táblának hely fenntartása a program elején) M_LOOP: • címke ugróutasítások, elágazások számára BME VIK - Mérés laboratórium 2
A mérés témái • ATmega128 hardver ismertető • Assembly bevezető • Beágyazott specialitások • I/O portok kezelése • Megszakítások • Időzítés • Amikről nem beszélünk… De tudni kell! • Fejlesztőkörnyezet, szimuláció BME VIK - Mérés laboratórium 2
Beágyazott specialitások • I/O portok kezelése: • LED, gomb, kapcsoló • Megszakítások kezelése • Időzítés + házi feladathoz (nem lesz róluk részletesen szó): • pergésmentesítés (gombok) • A/D konverzió (fény- és hőmérséklet-érzékelő, potméter) • stamp2.asm: • LCD kijelző • UART (soros kommunikáció) • memóriakezelés (EEPROM) • SPI, PWM kimenet, … BME VIK - Mérés laboratórium 2
I/O portok kezelése • Portonként 3 I/O regiszter, bitenként szabályozható • DDRx: irány (1: ki, 0: be) • PORTx: • DDR=ki esetén ide írjuk a kimeneti adatot • DDR=be esetén itt szabályozzuk a bemeneti felhúzó ellenállást/lebegést • PINx: a kimeneti port aktuális értéke • DDR=ki esetén 1 órajel késéssel PORTx • DDR=be esetén a bemeneti adat • IN, OUT utasítással (kivéve: kapcsolók, ezekre LDS, STS – memóriába ágyazott) BME VIK - Mérés laboratórium 2
I/O portok kezelése irány DDRx DDRx értéke kimeneti érték / bemenet felhúzása PORTx PORTx értéke PINx (ki/)bemeneti érték BME VIK - Mérés laboratórium 2
I/O portok kezelése • LED-ek bekapcsolása: ldi temp, 0xff ; 8 bites LED kimenet out DDRC, temp out PORTC, temp ; LED-ek bekapcsolása • Kapcsolók beolvasása: ldi temp, 0xFF sts PORTG, temp ; nem tri-state ldi temp, 0xEB ; csak a kapcsoló-biteket olvassuk sts DDRG, temp ; bemenet lds temp, PING ; kapcsolók allapotanak beolvasasa LDS/STS csak a kapcsolóknál kell, többi IN/OUT. A SW2 PING 4. bitjére van kötve a 2. helyett. A nyomógombok nem pergésmentesítettek! BME VIK - Mérés laboratórium 2
I/O portok kezelése - további infók • bekötések az AVR_ExperimentBoard_v103.pdf alapján • minta-programváz fejlécében a lényegesebb regiszterek felsorolva • avr128-leir2.pdf-ben a portok kezelése részletesebben • excel állomány a lábkiosztással • (+ m128def.inc-ben megtalálhatóak az I/O műveletekre definiált regiszterek) BME VIK - Mérés laboratórium 2
Megszakítások kezelése • Egyszintű, egyszerű interruptrendszer • Beérkező interrupt törli a globális megszakításengedélyező flaget, interruptból visszatérés (RETI) engedélyezi – nem kell még egyszer törölni / engedélyezni a rutinon belül! • Megszakítási ugrótáblába (v. vektortábla) bejegyezzük megszakításkezelőnket • Megszakításokegyedi engedélyezése, pl. interrupt control regiszter + interrupt maszk: EICRB, EIMSK (gombok esetén) • SEI utasítást ki kell adnunk a megszakítások globális engedélyezéséhez • Megszakításkezelő rutinban a státuszregisztert és minden más használt regisztert el kell menteni, visszatéréskor pedig engedélyezni BME VIK - Mérés laboratórium 2
jmp TIMER_IT; Timer0 Compare Match Handler Megszakítási vektortábla .org $0000 ; Define start of Code segment jmp RESET ; Reset Handler, jmp is 2 word instruction reti ; INT0 Handler on $0002, dummy nop reti ; INT1 Handler, if INTn used, 'reti' and 'nop' ; will be replaced by 'jmp INTn_Handler_Address' nop reti ; INT2 Handler nop ... reti ; Timer1 Compare Match B Handler nop reti ; Timer1 Overflow Handler nop reti nop reti ; Timer0 Overflow Handler nop .org $0046 ; MAIN program... BME VIK - Mérés laboratórium 2
Megszakításkezelő rutin TIMER_IT: ; nem kell CLI ; elmentjük a státusz és az átmeneti regiszert push temp in temp, SREG push temp <...IT-kezelés...> ; visszaállítjuk a státusz és az átmeneti regiszert pop temp out SREG, temp pop temp ; nem kell SEI reti ; visszatérünk SREG mentése arra az esetre, ha az összehasonlítás és az azt követő elágazás között futna le az IT rutin BME VIK - Mérés laboratórium 2
Időzítés • Időzítés, megszakítás használata nélkül: • egymásba ágyazott ciklusok (16MHz-es órajel miatt a 8 bit kevés a számlálóhoz) • timer counter folyamatos lekérdezése (itt is kell saját számláló) • egyszerűbb őket megvalósítani, debugolni • csúnya megoldások, alkalmatlanok pontos időzítésre • Időzítő megszakítás használata • időzítő prescaler (előosztó) értékét be kell állítani, hogy ne túl sűrűn érkezzen IT • engedélyezni az időzítő megszakítást • mintapélda a timer0-it.asm-ben • számláló szükséges (prescaler: 1/1024) BME VIK - Mérés laboratórium 2
Időzítés megszakítással dokumentáció segítségével össze kell tudni állítani + tudni, melyik bit mit jelent ; ***** Timer 0 inicializálása ***** ; előosztás (prescaler) beállítása ldi temp,0b00001111 ; 0....... ; FOC=0 ; .0..1... ; WGM=10 (clear timer on compare match) ; ..00.... ; COM=00 (kimenet tiltva) ; .....111 ; CS0=111 (CLK/1024) out TCCR0,temp ; Timer 0 TCCR0 regiszter ; compare regiszter beállítása ldi temp,108 ; 11059200Hz/1024 = 108*100 out OCR0,temp ; Timer 0 OCR0 regiszter ; Timer 0 IT engedélyezése, többiek tiltása ldi temp,0b00000010 ; 000000.. ; Timer2,1 IT tiltva ; ......1. ; OCIE0=1 - match ; .......0 ; TOIE0=0 - overflow out TIMSK,temp ; Timer IT Mask regiszter sei ; globális IT engedélyezve pontos baudrate érdekében BME VIK - Mérés laboratórium 2
További tudnivalók... • Kommentezés nélküli assembly kód nem fogadható el, még akkor se, ha tökéletes! • A házi feladathoz áttekintő folyamatábrát kell készíteni • Általában van benne megszakításkezelés • A házi feladat komplexitása miatt a leszimulálható részek működőképessége otthon ellenőrzendő (egyszerű IT is szimulálható!) • Közösen írt HF: a másik által írt részt is értsd és tudd bővíteni, ha szükséges; kiadásnál egyeztetni, hogy ki melyik részt csinálja • stamp2.asm-ben sok olyan rutin, ami ötletet adhat a házihoz (LCD, UART, SW timer...) BME VIK - Mérés laboratórium 2
A mérés témái • ATmega128 hardver ismertető • Assembly bevezető • Beágyazott specialitások • I/O portok kezelése • Megszakítások • Időzítés • Amikről nem beszélünk… De tudni kell! • Fejlesztőkörnyezet, szimuláció BME VIK - Mérés laboratórium 2
Szimulációval egybekötött fejlesztés Kiindulási alap: avrblank1.asm 1. feladat: LED-ek kigyújtása számlálóval 2. feladat: LED-ek vezérlése kapcsolóval 3. feladat: Kapcsolók sorbarendezése Minden lépésben ellenőrizni a várt működést szimulációval. BME VIK - Mérés laboratórium 2