320 likes | 571 Views
AVR mikrokontrollerid. Artur Abels. Üldist. AVR perekonna mikrokontrollerid , tootja - Atmel ATMega169 baasil Programmeerime RIISTVARA tasemel, simuleerime mikrokontrolleri tööd AVRStudio abil, laeme programme demo-board ’ ide sisse, paneme board ’ id omavahel suhtlema jne.
E N D
AVR mikrokontrollerid ArturAbels
Üldist • AVR perekonna mikrokontrollerid, tootja - Atmel • ATMega169 baasil • Programmeerime RIISTVARA tasemel, simuleerime mikrokontrolleri tööd AVRStudio abil, laeme programme demo-board’ide sisse, paneme board’id omavahel suhtlema jne. • Õpime selgeks üldised mõisted, nagu IO registrid, katkestused jne. • Alustame programmeerimist ASM’iga, pärast läheme üle C peale. FORGET JAVA PLIIZZ!!!!
Mis vahendeid kasutame • DATASHEET == BIIBEL!!!!!!!!!! • AVR Studio (www.atmel.com -> search “AVR Studio”) • WinAVR (gcctoolchain AVR jaoks, askgoogle) • AVR Butterfly (demo board, info www.atmel.com peal)
Midatuleksteada • Binaar- ja kuueteiskümmendsüsteemi • Bitikaupa tehed • Oomiseadus
Mis on mikrokontroller ? • Kivi mille sees on sisuliseltväike arvuti, mis suhtleb välismaailmaga oma väljaviikude kaudu. • Väljaviikude arv ja nende eesmärk sõltub mikrokontrolleri funktsionaalsusest. • Sama tüüpi mikrokontrollereid toodetakse erinevas korpuses.
Milleks see hea on ? • Primitiivsed reflektoorsed robotid, ntx joone jälgimine. • Keerulisemad robotid – andurite signaalide analüüs ümbritsevast maailmast ettekujutuse saamiseks ja selle järgi otsuste tegemine. • Igasugune automaatika • Autopiloodid, sideseadmed (nii valmis seadmed kui ka moodulid), koduseadmed, Jne. • Mikrokontrollerite “helloworld” = valgusdioodi vilgutamine
ASSEMBLER • Väga riistvara lähedane platvormist sõltuv keel. • Assembleri käsud vastavad üks üheselt antud protsessori masinkeele käsudele. • See pole põhimõtte ega konstruktsioonide poolest raske, aga on raskesti loetav ja suuri programme selles kirjutada on peaaegu võimatu samamoodi nagu otsida vigu. • Annab arusaamise mis tegelikult sees toimub.
“No magic” demo • Panna mikrokontroller vilkuma valgusdioodiga. • PS: Kui sa ei ole käinud selles loengus ja praegu vaatad seda slaidi, siis tea et slaid ei asenda loengut :D
Mikrokontrolleri baasil vidina tegemise protsess • Valime sobiv mikrokontroller • Koostame skeemi ja teeme selle valmis • Kirjutame arvutis programmi, kompileerime selle spetsiaalsee kompilaatori abil. Võimalusel simuleerime programmi täitmist simulaatori abil. • Spetsiaalse seadmega mida kutsutakse programmaator, kirjutame kompileeritud programmi mikrokontrolleri programmimällu. • Kui teie programm on keerulisem “Helloworld’ist” siis debugime ööpäevade kaupa.
Mikrokontroller koosneb • Programmimälu – enamasti Flash tüüpi • CPU (ALU + Registrid) • RAM – tavaliselt 256B…32kB • Välismaaimaga suhtlemiseks seadmed – Pordid, ADC, taimerid, igasugused serial liidesed, jne jne… Need seadmed on ühendatud mikroskeemi väljaviikudega. • Võib olla palju muud sõltuvalt mikrokontrollerist
Kuidas meie programm töötab ?(video siin) ldi r16, 0xFF out 0x04, r16 out 0x05, r16 inc r16 rjmp 2
1 demos kasutatud: Registrid (generalpurposeregisters) • Spetsiaalsed mälukohad CPU sees, millega CPU oskab tehteid teha: liita, lahutada, bitikaupa tehteid teha, lugeda RAM’ist väärtus registrisse, kirjutada registri väärtus RAM’i, jne. CPU ei oska teha operatsioone otse mäluga, ntx ta ei oska liita kaks RAM’is olevat muutujat. Selleks et liita kaks RAM’is olevat muutujat tuleks esiteks lugeda iga muutuja registrisse, liita need registrid (tulemus osutub ka registris) ja siis kirjutada tulemus registrist tagasi RAM’i. • AVR mikrokontrollerites on 32 8-bittilist registrit.
1 demos kasutatud: IO registrid • Igal IO seadmel on olemas oma registrite kogum. CPU oskab kirjutada IO registritesse et anda seadmele käsu, või määrata selle töörežiimi. Samamoodi CPU oskab lugeda IO registrite sisu selleks et saada teada IO seadme staatust. • Kogu suhtlus IO seadmete ja CPU vahel käib IO registrite lugemise ja kirjutamise teel.
1 demos kasutatud: Pordid • PORT B (samamoodi nagu PORT A, C, D jne.) on IO seade määratud väljaviikude seisundi manipuleerimiseks ja lugemiseks. • Iga AVR mikrokontrollerite port käsitleb kuni 8 mikroskeemi jalga. • AVR arhitektuuris pordi tööd määravad 3 IO registrit (vt järgmine slaid)
1 demos kasutatud: Port B registrid • DDRB – DataDirection Register. Selle registri iga bitt määrab ühe Port B väljaviigu suunda. Kui DDRB mingi bit on 1 siis sellele bitile vastav jalg on väljundiks ja mikrokontroller manipuleerib seda jalga IO registri “PORTB” abil. Juhul kui DDRB mingi biti väärtus on 0 siis sellele bitile vastav jalg on sisendiks ja selle jala väärtus (määratud välismaailma poolt) pannakse IO registrisse PIND.
1 demos kasutatud: Port B registrid • PORTB (NB!! mitte segi ajada IO registrit nimega PORTB ja IO seadet nimega PORT B) – Selle registri iga bit määrab ühe jala seisundit juhul, kui see jalg on DDRB poolt sätitud väljundiks. Juhul kui DDRB poolt jalg on sätitud sisendiks, siis PORTB lülitab sisse jala sisemist pull-up takistit.
1 demos kasutatud: Port B registrid • PINB – kui DDRB poolt mingi jalg on määratud sisendiks siis sellele jalale vastav PINB bitt näitab selle jala peal olevat väärtust. Kui jala peal on loogiline “1” siis PINB vastav bitt sätitakse automaatselt “1”ks. • Kui mingi jala külge on ühendatud ntx nupp (mis määrab selle jala seisundit) siis programmis selle nupu vajutamisest saab teada vastava PINB biti testimisel.
“no magic” demo töös • Kas valgusdiood vilgub ? Tundub nagu põleks, aga tegelikuses ta vilgub väga suure sagedusega, kuna tsükkli täitmine võtab 4 takti ja taktsagedus on 1MHz, siis vilkumise sagedus on 125kHz • Peame tegema viivise!!
Viivis ldi r16, 0xff out 0x04, r16 ; DDRB out 0x05, r16 ; PORTB inc r16 ldi r17, 0xff ; delay start nop ; no operation – aja raiskamine :) nop nop nop dec r17 brne 5 ; ifdecreased r17 isnotzerothenbranchtofirstnop ; delay ended here rjmp 2
Beforewecontinue • Te nägite kui ebamugav oli kasutada rjmp 2 ja brne 5 instruktsioone, kuna neile tuleb ette anda hüppe aadressi programmimälus. Seega tuleb teada kus täpselt teile vajalik instruktsioon programmimälus asub. Kui näiteks me lisaks mingit instruktsiooni enne viivist, siis me kohe peaks vahetama “brne 5” “brne 6” vastu.
Beforewecontinue 2 ldi r16, 0xff out 0x04, r16 ; DDRB out 0x05, r16 ; PORTB inc r16 NOP ; mingil põhjusel oli vaja lisada mingi ; instruktsioon ldi r17, 0xff ; delay start nop ; no operation – aja raiskamine :) nop nop nop dec r17 brne5 ; ifdecreased r17 isnotzerothenbranchtofirstnop ; EI TÖÖTA, kuna nüüd tuleks hüpata hoopis aadressile 6 ; delay ended here rjmp 2
Beforewecontinue 3 • Selleks et lahendada seda probleemi, assembleris on olemas selline asi nagu LABEL – programmikohadele saab anda nimesid, ja kasutada nad rjmp ja muude instruktsioonide juures aadressite asemel. • ASM kompilaator ise ASENDAB nad korrektsete aadressitega kompileerimise käigus.
Ja meie programm näeks välja ldi r16, 0xff out 0x04, r16 ; DDRB Main_loop:; andsime programmikohale nime “Main_loop” out 0x05, r16 ; PORTB inc r16 ldi r17, 0xff ; delay start delay_loop: nop ; no operation – aja raiskamine :) nop nop nop dec r17 brnedelay_loop ; ifdecreased r17 isnotzerothenbranchtofirstnop ; delay ended here rjmpMain_loop
Maagiline brne või CPU Status Register • Kuidas instruktsiooni “brnedelay_loop” täitmisel teatakse kas eelminse instruktsiooni “dec r17” tulemuseks oli null või ei ole?? • Selleks on CPU sees spetsiaalne register nimega STATUS REGISTER või SREG. • See on loomulikult 8-bitine ja igal bitil on oma tähendus. • Erinevad instruktsioonid muudavad erinevaid SREG bitte, ja teised instruktsioonid sõltuvad nende bittide väärtustest.
SREG Kuidas erinevad instruktsioonid mõjutavad erinevaid lippe ja kuidas sõltuvad lippude seisust saab teada DATASHEEDIST (Instruction set summary), või AVRStudiost (AVR Studio -> Help ->AVR Tools user guide -> AVR Assembler -> Instructions)
DEC, BRNE instruktsioonid ja Zeroflag • Dec (decrease) instruktsioon muudab mitu lipu, nende seas ZeroFlag. • Brne(branch if not equal) instruktsioon vaatab Zero lippu ja hüpab etteantud kohta ainult kui Zero lipp on maas. (equals==zero) • On olemas ka breq (branch if equals) instruktsioon.
Conditional Branch instructions • On olemas ka teised tingliku ülemineku instruktsioonid, mis loevad mõningaid SREG bite ja käituvad vastavalt. • Ainus võimalus saada kogu infot instruktsioonide kohta on DATASHEET + AVR Studiohelp.
ProgramCounter • Kuidas CPU teab mis instruktsiooni ta peab täitma antud ajahetkel? • Tal on olemas PC (ProgramCounter) register kus hoitakse täidetava instruktsiooni programmimälu aadressi. • Jmp, rjmp, brne, breq ja muud sarnased instruktsioonid just muudavadki selle registri sisu et programmi käivitus jatkuks tahetud kohast.
ProgramCounter • Peale RESETi PC==0, nii et programmi käivitus algab kõige esimesest instruktsioonist. Ja iga instruktsiooni käivitamisel (v.a. jmp, brne ja sarnased) PC suureneb ühe võrra. Seega järgmisel taktil täidetakse järgmist instruktsiooni.