AVR ATmega128 mikrokontroller

Download Report

Transcript AVR ATmega128 mikrokontroller

BME VIK Mérés laboratórium 2

1. mérés

AVR ATmega128 mikrokontroller

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 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 3

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) Harvard architektúra – 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)

BME VIK Mérés laboratórium 2 4

ATmega128 mérőpanel

Mérőpanel-specifikus: AVR_ExperimentBoard_v103.pdf

BME VIK Mérés laboratórium 2 5

AVR blokkvázlat

BME VIK Mérés laboratórium 2 6

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 7

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 8

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 9

Assembly kitérő (x86) – mekkora kód?

BME VIK Mérés laboratórium 2 10

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 11

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…) Fordító gcc –E prog.c

(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 12

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 13

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 14

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 SREG

helyett

PUSH temp IN temp, SREG PUSH temp

További információ: avr128-leir2.pdf, „Regiszterek” fejezet

BME VIK Mérés laboratórium 2 15

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

ldi temp, LOW(RAMEND) out SPL, temp ldi temp, HIGH(RAMEND) out SPH, temp 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 BME VIK Mérés laboratórium 2 16

AVR assembly utasítások

utasítás (mnemonic) argumentumok (operandusok) ldi temp, 0xA5

; 10100101

out PORTC, temp

; LEDre írás

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 17

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 18

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 19

AVR assembly – utasítások C jelleggel

Aritmetikai és logikai

a+b a-b a&b a|b a++ a- -a a=0 … ADD SUB AND OR INC DEC NEG CLR …

Adatmozgató

reg1=reg2 reg=17 reg=mem reg=*mem mem=reg *mem=reg perifériáról perifériára verembe veremből … MOV LDI LDS LD STS ST IN OUT PUSH POP … BME VIK Mérés laboratórium 2

Bitműveletek, egyebek

a<<1 a>>1 Ø C meg felelő státusz bitek Üres utasítás … LSL LSR, ROL, ROR SEI, CLI, CLZ...

NOP … 20

AVR assembly ugróutasítások

• JMP: feltétel nélküli ugrás Végtelen ciklus pl.:

M_LOOP: …utasítások… jmp M_LOOP

Hasonló C konstrukció: while (1) { ...utasítások...

} • • CALL, RET: szubrutinhívás és visszatérés (PC bekerül a verembe) RETI: visszatérés interruptból Szubrutin:

M_LOOP: … CALL FV … FV:…utasítások… RET

void fv() { …utasítások… return; } void main () {… fv(); } BME VIK Mérés laboratórium 2 21

AVR assembly – feltételes elágazások

• egyenlőségvizsgálat

M_LOOP: ; compare, CPSE a, b ; skip if eq.

JMP L2 L1:… ; a == b JMP M_LOOP L2:… ; a != b JMP M_LOOP

if (a==b) { (L1) } else { (L2) } 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 22

AVR assembly – feltételes elágazások

• switch / case

M_LOOP: ..

CP ch, 65 ; compare->ZeroF BREQ L1 ; branch if eq.

CP ch, 66 BREQ L2 ...

JMP VEGE L1:… JMP VEGE L2:… (JMP VEGE) VEGE: ...

switch (ch) { case 'A': (L1) break; case 'B': (L2) break; ...

} (VEGE) 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 23

AVR assembly – for ciklus

• több byte-os ciklusszámlálójú for ciklus:

LDI temp0, 0x20 ; belső változó LDI temp1, 0x4E ; külső változó LOOP: ...

DEC temp0 BRNE LOOP ; branch if !=0 DEC temp1 BRNE LOOP

for (int a=0; i<20000; i++) { ...

}; Megoldható 2 byte-os utasításokkal is (pl. SBIW vagy ADIW).

BME VIK Mérés laboratórium 2 24

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 25

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 26

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 27

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 felhúzó ellenállást/lebegést

kimeneti adat

ot – DDR=be esetén itt szabályozzuk a bemeneti •

PINx

: a kimeneti port aktuális értéke – DDR=ki esetén 1 órajel késéssel PORTx – DDR=be esetén a ezekre LDS, STS

bemeneti adat

• IN, OUT utasítással (kivéve: kapcsolók, – memóriába ágyazott) BME VIK Mérés laboratórium 2 28

I/O portok kezelése

irány DDRx értéke kimeneti érték / bemenet felhúzása PORTx értéke DDRx PORTx (ki/)bemeneti érték PINx BME VIK Mérés laboratórium 2 29

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 30

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 31

• •

1.

2.

3.

4.

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ások egyedi engedélyezése

EICRB, EIMSK (gombok esetén) , pl. interrupt control regiszter + interrupt maszk:

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 32

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 jmp TIMER_IT ; Timer0 Compare Match Handler

reti ; Timer0 Overflow Handler nop .org $0046 ; MAIN program...

BME VIK Mérés laboratórium 2 33

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

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

<...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

BME VIK Mérés laboratórium 2 34

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 35

Időzítés megszakítással

; ***** Timer 0 inicializálása ***** ; előosztás (prescaler) beállítása ldi ; 0.......

temp,0b00001111 ; FOC=0

dokumentáció segítségével össze kell tudni állítani + tudni, melyik bit mit jelent

; .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

pontos baudrate érdekében

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 ; 000000..

temp,0b00000010 ; 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

BME VIK Mérés laboratórium 2 36

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 37

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 38

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 39