You are on page 1of 68

AVR

PROGRAMUJEME

V JAZYKU C

Bc. Ondrej Zvodsk

Zoznmte sa s MCU rady Atmel AVR


1

AVR
PROGRAMUJEME

V JAZYKU C
Bc. Ondrej Zvodsk

Tto kniku mono pouva a rozirova na nekomern ely bezplatne. Ak chcete prejavi autorovi vaku a uznanie za as strven napsanm tejto kniky, alebo prpadne usdite, e vm tto knika pomohla a uetrila vea prce a asu, mete prispie ubovonou iastkou na slo tu: 0263746912/0900 akujem!

2012 Bc. Ondrej Zvodsk - zawin@svetelektro.com

OBSAH

Obsah
vod........................................................................................................................... 5 Mikropotae Atmel AVR...................................................................................... 6 Prca v AVR STUDIO 4.......................................................................................... 7 Peme prv program............................................................................................... 10 Preruenia.................................................................................................................. 16 tae/asovae......................................................................................................... 19 tae/asovae - PWM......................................................................................... 26 Prca so znakovm LCD displ................................................................................ 33 AD prevodnky......................................................................................................... 37 Rozhranie USART.................................................................................................... 42 Rozhranie SPI........................................................................................................... 49 Rozhranie TWI......................................................................................................... 53 Reimy spnku MCU............................................................................................... 61 Pouit literatra...................................................................................................... 65

VOD

vod
Tto knika vznikla spojenm jednotlivch ast serilu o programovan AVR v jazyku C, ktor publikujem na webe svetelektro.com. Knika Vs najskr zoznmi s mikropotami Atmel AVR a programom AVR Studio 4, v ktorom budeme psa nae programy. V prvch kapitolch bude vysvetlen prca s registrami, I/O portami a obsluhou pamti. V dalch kapitolch bud bliie vysvetlen jednotliv perifrie mikropotaa. Ku kadej kapitole sa nachdza mnostvo jednoduchch prkladov pre jednoduchie pochopenie danej innosti. Prklady s testovan na mikropotai ATmega8, bud vak fungova aj na ATmega16 a 32. Schmy zapojenia sa vak budu li. Knika je orientovan hlavne na popis prce s jednotlivmi perifriami mikropotaa, nevenuje sa v nej pozornos vysvetleniu programovacieho jazyka C. Preto predtm ako sa pustte do tania tejto knihy, odporam zska aspo zkladn vedomosti o programovacom jazyku C. Na to Vm me posli napr. kniha od Pavla Herouta - Uebnica jazyka C Poakovanie: Chcem sa poakova vetkm, o sa akmkovek spsobom priinili o pomoc pri tvorbe lnkov na webe svetelektro.com o programovan AVR v jazyku C, pretoe bez Vs by tto knika nemohla existova v takej podobe ako je teraz. Osobitne by som sa chcel poakova kamartom Awen-ovi - ktor mi kad as serilu podrobne skontroloval a opravil a Lubovi (luboss17) ktor mi pomohol s tvorbou kninc.

MIKROPOTAE ATMEL AVR

Mikropotae Atmel AVR


V roku 1997 uviedla na trh firma Atmel nov osembitov mikropotae rady AVR. Oproti predolmu jadru 8051 nastalo viacero zmien. Mikropota Atmel AVR zaal vyuva architektru RISC (Reduced instruction set computing), o prinieslo znane zvenie vkonu. Taktie oproti mikroprocesorom 8051 nastalo zvenie rky intruknho slova na 16 bitov. To umonilo zrchlenie natavania intrukci, kde a na niekoko vnimiek dochdza k ich nataniu v priebehu jednho strojovho cyklu. Mikropota AVR je optimalizovan pre programovanie v jazyku C. Mikropota podporuje taktie aj viacero zdrojov hodinovho signlu: extern krytl / rezontor extern nzkofrekvenn krytl (32,768 kHz) extern RC osciltor intern kalibrovan RC osciltor

Architektra mikropotaa Atmel AVR


V tomto mikropotai sa nachdzaj tri druhy pamte: Pam FLASH m rku 16 bitov a vyuva sa na uloenie programu, d sa zmaza a optovne zapsa, priom vrobca garantuje a 10 000 cyklov zmazanie/zpis. D sa programova sriovo, o zjednoduilo nahrvanie programu z PC do mikropotaa. Pam RAM m rku 8 bitov, je rchla a sli na Obr 1.0 - blokov schma mikropotaa ATmega8 doasn ukladanie vsledkov a dt. Po odpojen naptia sa zmae. Pam EEPROM sli na ukladanie dt, ktor sa uchovaj aj po odpojen napjacieho naptia. Mikropotae AVR taktie ponkaj bohat vbavu o sa perifrii tka s to naprklad: ta/asova s monosou PWM modulcie AD prevodnk SPI, TWI, USART Watchdog A in... Tmto perifrim sa budeme podrobnejie venova v alch kapitolch kniky.

PRCA V AVR STUDIO 4

Prca v AVR STUDIO 4


V tejto kapitole si ukeme ako mono vytvori program v jazyku C a prostred AVR Studio 4, v ktorom budeme psa vetky alie programy. Upozorujem itateov e je potrebn aspo zkladn znalos jazyka C. Na alej obrazovke si zvolme debugovaciu platformu ie ako chceme program ladi. Pokia nemte JTAG programtor zvote monos AVR simultor. Dleit je vpravo vybra sprvny mikropota. Nakoniec klikneme na tlaidlo "Finish" a tm vytvorme nov projekt.

Intalcia AVR Studia 4

Z oficilnej strnky Atmel-u stiahneme sbory: AVR Studio 4 AVR Toolchain 3.4 (pre 8-bitov MCU) Odkaz: http://www.atmel.com/tools/studioarchive.aspx Pred sahovanm treba vyplni registran daje aby bolo mon sbory stiahnu. Naintalujeme teda AVR Studio 4 a nsledne AVR Toolchain 3.4. AVR studio 4 je pracovn prostredie na vvoj programu, AVR toolchain 3.4 je compiler, linker Obr 2.1 - Vytvorenie projektu - AVR Studio 4 a zjednoduen verzia stdlib jazyka C. Po naintalovan spustme program AVR Studio a sksime vytvori Popis pracovnho prostredia n prv projekt. Po vytvoren projektu meme psa samotn projekt v jazyku C. Naavo sa nachdza rozbaovacia ponuka, Vytvorenie projektu Po spusten programu AVR studio sa objav welcome kde si meme zvoli zdrojov a hlavikov sbory, obrazovka kde zvolme monos "Create new project". ktor nsledne cez direktvu #include meme prida do projektu. Sli to na lep prehad v projekte. Napr. Kee programova ideme v jazyku C, zvolme mo- jeden zdrojov sbor bude sli na komunikciu s nos AVR GCC. Napeme nzov projektu a urme UART, al na komunikciu s EEPROM a v hlavnom pracovn adresr projektu. Odporam zakrkn sbore ich potom pridme. monos "Create folder", ktor spsob e projekt sa vytvor vo vlastnom adresri. V strede sa nachdza editor, v ktorom peme program. Nevhodou je vak to, e je to len hol editor s vemi zkladnm zvraznenm syntaxe, take treba dba na viu pozornos pri psan programu. Napravo s ovldacie registre procesora, ktor meme poas debugovania nastavova alebo sledova poas behu programu ako sa nastavili. innos a funkcia registrov bude podrobnejie vysvetlen v alej kapitole. Naspodu sa nachdza okno, ktor ns informuje o spenom, alebo nespenom skompilovan projektu.

Obr 2.0 - Vytvorenie projektu - AVR Studio 4

PRCA V AVR STUDIO 4


Vype chyby, alebo varovania, ktor poas kompilo- Kompilcia projektu vania nastali a zobraz vyuitie pamte FLASH a RAM Vina netrivilnych projektov sa sklad z viac, ako pri pouit nho programu. jednho .c sboru. Je to spsoben tm, e program je takto lepie truktrovan a niektor jeho asti sa daj opakovane poui (naprklad podprogramy pre ovldanie perifri a podobne). Aby sa tieto sbory sprvne "zloili" do jedinho vstupnho .hex sboru, je potrebn spoluprca viacerch programov a sborov, preto popem postup kompilcie takhoto projektu. Ako prklad som si vybral projekt, ktor generuje pulzy rznej dky nastavitenej z PC cez USB-VCP (virtual COM port) - UART prevodnk. Tento projekt sa sklad z nasledujcich sborov :  main.c zdrojov sbor, obsahuje hlavn program  ansiterm.c zdrojov sbor, obsahuje rutiny pre obsluhu ANSI terminlu  ansiterm.h hlavikov sbor, obsahuje deklarcie rutn z ansiterm.c Makefile sbor, ktor kontroluje preklad a naplenie projektu Aby sa projekt mohol zostavi, je najprv potrebn preloi jednotliv .c sbory. Prv, o sa v tejto chvli stane je, e sa sbor otvor a prejde cez preprocesor. To je program, ktor odstrni komentre, rzne priprav sbor, ale hlavne spracuje direktvy preprocesora (riadky zanajce sa znakom #). Tam sa radia hlavne include guardy, makr, includy. Naprklad pomocou direktvy #include sa vkladaj do .c sboru poadovan .h sbory, ktor obsahuj deklarcie. Tie oznamuj, ak tvar maj jednotliv funkcie a tak podobne. Preto je naprklad pri kompilcii main.c projektu z prkladu potrebn vloi ansiterm.h, ktor obsahuje deklarcie funkci pre ANSI terminl. Tento predspracovan sbor alej spracuje kompiltor, ktor pri bezchybnom preklade vygeneruje sbor .o. Tomuto sboru sa hovor objektov sbor (neplies s OOP objektovm programovanm). Tento sbor obsahuje preloen tel funkci, defincie premennch a tak podobne.

Obr 2.2 - Prostredie programu AVR studio 4

Nastavenie projektu

V hornom menu zvolme monos: "Project Configuration Options"

Obr. 2.3 - Nastavenie vlastnost projektu Tu nastavme minimlne frekvenciu pouitch hodn v Hz. Monos Optimalization nastavuje ako chcem program optimalizova na rchlos. Mon s rovne -O0 a -O3.

almi monosami s -O0 (vypnutie vetkch optimalizci) a -Os, ktor povol monosti -O2 okrem tch, ktor zvuj kd a poksi sa viac zmeni vsledn hex sbor. Veobecne si vystame s vobou Os. alie monosti zatia nastavova netreba, sta Po kompilcii potrebnch .c sborov vsledn .o spotvrdi tlaidlom OK. bory id na spracovanie do linkera, ktor "pospja"

PRCA V AVR STUDIO 4


jednotliv moduly dopln adresy funkci a premennch z inch modulov a pod. Preto s niektor chyby zisten a v tejto fze. To znamen, e ak linker pe, e niektor funkcia nie je definovan, je to prve kvli chbajcemu objektovmu, alebo knininmu sboru. Ke prebehne v poriadku aj linkovanie, dostaneme vsledn binrny sbor, ktor sa u len pretransformuje do vhodnho .hex formtu a me nasledova vyplenie programu do MCU. Cel tento proces je riaden programom make, ktor spracovva sbor Makefile. Tento obsahuje popis loh a pre kad lohu zvislosti. Na zklade nich sa spracuje cel projekt. Naprklad vsledn sbor .hex zvis od skompilovanej binrky .out, t od sborov .o a tie zasa od .c a .h sborov. A tmto spsobom sa kompiluje vina (ak nie vetky) programy v jazyku C, aj ke o tom programtor vaka modernm prostrediam asto ani nevie.

Obr 2.4 - Priebeh kompilcie projektu

PEME PRV PROGRAM

Peme prv program


Pravidl psania kdu
1. Stiahnite si datasheet mikrokontrolra, s ktorm idete pracova. Nachdzaj sa tam pre vs vetky potrebn informcie, sta len sprvne hada! 2. Pri psan kdu pouvajte komentre pre lepiu orientciu v kde. 3. Pouvajte truktrovan zpis ztvoriek a sprvne odsadenie. 4. as kdu ktor sa v programe viackrt opakuje je vhodnejie napsa do funkcie. 5. Pouvajte vstin nzvy premennch, funkci, typov...

Registre

Naui sa sprvne pracova s registrami patr medzi znalosti, bez ktorch sa pri programovan mikropotaov alej nezaobdeme. Pomocou registrov nastavujeme a ovldame sprvanie mikrokontrolra a jeho perifri ako naprklad porty, ta/asova, A/D prevodnk, UART a pod.

Rozliujeme 3 typy registrov 1. Pracovn je to 32 8-bitovch registrov sliacich na ukladanie vsledkov a premennch pri behu programu. Pri programovan v C tieto registre manauje kompilr. 2. Prznakov s to registre, ktor ns informuj o Vyuitie hlavikovch sborov stave mikrokontrolra, perifri at. Po ich preV hlavikovch sboroch sa nachdzaj defincie tan sa meme dozvedie napr. stav portu. kontnt, makr a funkcie ktor nm umouj prcu 3. Nastavovacie tmto budeme venova najviu s mikropotaom. pozornos. Pomocou tchto registrov meme nastavova vetky parametre mikrokontrolra. Najastejie pouvan hlavikov sbory #include<avr/io.h> Umouje nm prcu s registrami mikrokontrolra a I/O Porty (Vstupno - vstupn porty) prstup k nim pomocou ich nzvu. Bez pridania tohto Port predstavuje 8 bitov (tj. jeden bajt), ktor s fyhlavikovho sboru by zpis PORTD |= (1 << PD4) zicky vyveden na piny mikrokontrolra. Nie vdy je vyvedench vetkch 8 bitov (kvli obmedzenmu nebol mon! potu pinov pzdra). Porty sa oznauj abecedne PORTA, PORTB, PORTC.., ich poet zvis od typu #include<avr/interrupt.h> Tento hlavikov sbor vklad funkcie a makr na ob- mikrokontrolra. Jednotliv bity (piny) portu s oznaen Pn0 - Pn7 sluhu preruen. (n reprezentuje psmeno portu). Pn7 je prv bit za#include <avr/sleep.h> va. Vyuvame ho vtedy, ke chceme pouva funkcie spnku. Vlastnosti: Jednotliv piny portu mono nastavi ako vstupn #include <util/delay.h> alebo vstupn Vemi asto pouvan. Vaka tomuto hlavikovmu Piny portu mu ma v zvislosti od nastavenia sboru meme vyuva asovacie funkcie registrov aj alternatvnu funkciu ako napr. UART, _delay_us(); a _delay_ms(); SPI, pripojenie externho krytlu a pod. #include <stdlib.h> Piny s chrnen didami voi VCC a GND Funkcie na generovanie nhodnch sel, triedenie, Pin mono zaai prdom a 40mA a to v oboch hadanie, celoseln matematika, prevody reazcov stavoch log. 1 aj log. 0 atd.. Pin me ma aktivovan pull-up rezistor voi VCC (cca 20 50 k) #include <stdio.h> Rutiny pre prcu so vstupom a vstupom

10

PEME PRV PROGRAM


2.) Chceme nastavi vetky piny portu PORTD ako vstupn, a nieo vykona, ak je na vetky piny priveden log. 1. DDRD = 0b00000000; // vetky piny ako vstupn PORTD = 0b00000000; // pull-up rezistory neaktivovan if (PIND == 0b11111111) // podmienka ak stav portu rovn sa 1111 1111 { /* akcia */ }

D1 PIN D2 Cp

Rp

log.obvody MCU

Maskovanie

Obr 3.0 - Vntorn truktra I/O pinu MCU Kad port m 3 registre: DDRx (data direction register) nastavujeme nm jednotliv piny portu ako vstupn alebo vstupn. Log. 1 na prslunom bite nastavuje pin ako vstupn a log. 0 naopak ako vstupn. PORTx nastavuje log. rovne na vstupnch pinoch portu. Pre piny, ktor s nastaven ako vstupn, sa zpisom log. 1 do prslunho bitu aktivuje pull-up rezistor na danom pine. PINx uren len na tanie. Register obsahuje stav logickch rovn na porte. Mono teda na port zvonka privdza log. rovne a pomocou tohto registra zisova logick hodnoty na jednotlivch pinoch portu. Prklady 1.) Chceme nastavi vetky piny portu PORTD ako vstupn, a zapsa na vstup bitov informciu 1111 0000. To znamen, e piny PD7 a PD4 bud v log. 1 a PD3 a PD0 v log. 0. Najskr nastavme piny portu ako vstupn: DDRD = 0b11111111; // bitov zpis, alebo: DDRD = 0xFF; // hexadecimlny zpis Potom zapeme dta: PORTD = 0b11110000; // bitov zpis,alebo: PORTD = 0xF0; // hexadecimlny zpis,alebo: PORTD = 240; // dekadick zpis

Ukzali sme si teda ako nastavova a ta jednotliv piny portu. o vak v takom prpade, e na porte u mme zapsan nejak hodnoty a chceme zmeni len jeden pin (bit) v danom porte? Vtedy prichdza na rad maskovanie. Pri maskovan vyuvame bitov log. opertory & (bitov "and") | (bitov "or") ~ (bitov negciu) << bitov posun

Obr 3.1 - Pravidvostn tabulka log. lenov AND a OR Najastejie vyuvame takto tl zpisu: (pre nzornos zvolme pin PD6 registra PORTD) PORTD |= (1 << PD6); zpis log. 1 na pin 6 portu D PORTD &= ~(1 << PD6); zpis log.0 na pin 6 portu D

11

PEME PRV PROGRAM


Tento zpis rob zaiatonkom asi najv problm, Zase vidme e predol obsah portu ostal zachovan preto si ho rozoberieme na jednotliv asti. a zmenil na log. 0 sa zmenil len iesty bit. V prpade e chceme zapsa viac bitov zpis je nasleV hlavikovom sbore s definovan jednotliv piny dovn: portu. Konkrtne ku PD6 je priraden slo 6. Je to tak PORTB |= (1 << PB4) | (1 << PB2); aj pre alie piny napr. PD0=0, PD1=1,PD2=2 ..... pri zapsan viac log. 1 Zpis (1 << PD6) mono nahradi aj za zpis (1 << 6), PORTB &= ~((1 << PB4) | (1 << PB2)); teda log. 1 (hodnota 0b00000001) je bitovo posunut pri zapsan viac log. 0 o 6 bitov doava - 0b01000000. Toto je teda naa maska ktor sme vytvorili a budeme s ou alej pracova. Zoberte si teda papier a pero a overte, e tento zpis naozaj funguje :) ! Zpis log. 1 na pin 6 portu D: Zpis PORTD |= (1 << PD6); Maskovanie vyuvame aj pri tan: mono zapsa aj v tvare: Mme napr. podmienku v ktorej ns zaujma i dan PORTD = PORTD | (1 << PD6); pin portu je zvonka nastaven na log. 1. Pre nzornos si zvome tento pin napr. PD4 Teda vykonme log. operciu OR (logick set) medzi jednotlivmi bitmi aktulnej hodnoty registra if (PIND & (1 << PD4) ){ PORTD a masky, ktor sme vytvorili, a tento vsledok /*... prkazy po splnen podmienky...*/ potom nasp zapeme do registra PORTD. } Prklad: Register PORTD m zapsan hodnotu Maska 0b00010000 0b00001111. Vykonme operciu bitov OR s maskou PIND 0b00110011 0b01000000 Vsledok 0b00010000 PORTD 0b00001111 MASKA 0b01000000 Vsledok 0b01001111 Vidno teda, e predol obsah portu ostal zachovan a zmenil sa len bit slo 6, ktor potrebujeme. Zpis log. 0 na pin 6 portu D: PORTD = PORTD & ~(1 << PD6); Majme teraz na PORTD zapsan hodnotu 0b11110000. Zpis ~(1 << PD6) znamen to, e log. 1 bitovo posunieme o 6 bitov doava (0b01000000) a nsledne vykonme bitov negciu (0b10111111). Teraz vykonme operciu AND (logick sin) medzi bitmi registra PORTD a masky. PORTD 0b11110000 MASKA 0b10111111 Vsledok 0b10110000 Po operci bitovho AND je vsledok 0b00010000, teda ostatn piny portu sme "odfiltrovali" a overili sme stav len iadanho pinu. Logick hodnota vrazu v podmienke je "pravda" (true), a teda podmienka je splnen, pretoe vsledok opercie je nenulov (seln hodnota 0, tj. 0b00000000 by bola vyhodnoten ako logick nepravda). V dalom prklade majme opan situciu a to overenie i dan pin PD4 je v log. 0 if ((PIND & (1 << PD4)) == 0 ){ /* ... prkazy po splnen podmienky... */ } Maska 0b00010000 PIND 0b10001111 Vsledok 0b00000000 Vsledok po operci bitovho AND bude = 0b00000000, a porovnanie s hodnotou 0 je pravda, ie podmienka je splnen.

12

PEME PRV PROGRAM


Ukonili sme teda as softwarov a teraz pristpime k samotnmu hardwaru. Ukeme si ako zapoji mikropota ATmega8, ako naprogramova mikropota a jeho fuse-bity a nakoniec si predvedieme funknos ukkovho programu. o najbliie ku napjaciemu pinu zapojme kondenztor 100nF oproti zemi. Pokia je napjacch pinov viac, dvame 100n kondenztor pri kad z nich! Pin AVCC je napjanie pre AD prevodnk a piny 0 a 3 na porte C. Pri pouit AD prevodnka je odporan tento pinpripja cez LC filter, aby sme znili ruenie z napjacej vetvy a dosiahli lepie parametre AD prevodu. Ak AD prevodnk nepouvame, alebo LC filter nemusme/nememe/nechceme do obvodu zapoji, pripojme pin priamo na kladn napjanie. Pin AREF je pin napovej referencie AD prevodnka. Pri pouit internej referencie je naho pripojen vstupn naptie z internej referencie, a preto na tento pin pripojme blokovac kondeztor 100nF. Ak pouvame extern napov referenciu, pripjame ju na tento pin.

Zapojenie mikrokontrolra

V alch kapitolch budem pouva mikropota ATmega8. Vdy na konci kapitoly bude pr ukkovch programov, ktor si mete sami otestova. Preto vm odporam zakpi tento mikropota a kontaktn pole, na ktorom si napsan programy jednoducho odskate. Vaina prezentovanch programov bude fungova aj na mikropotaoch ATmega16 a ATmega32. Rozdiel bude vak v schmach, pretoe tieto mikropotae maju inak rozloen piny. Pre tch o to myslia s programovanm vnejie, dvam do pozornosti aj tieto vvojov dosky publikovan na webe svetelektro.com : Vvojov doska s ATmega16/32 - luboss17 Vvojov doska s ATmega 16/32 - bobo87

Najpouvanej spsob programovania mikrokontrolra AVR je ISP (In System Programming), cez sriov rozhranie SPI. Mikrokontrolr sa d naprogramova tmto spsobom priamo v aplikci bez potreby vyberania mikrokontrolra, o je vek vhoda. Na Obr 3.2 vidno zkladn zapojenie mikrokontro- Na naprogramovanie sa vyuvaj 4 dtov vodie lra ATmega8: MOSI, MISO, SCK a RESET, a spolon zem GND. Ako tandard na pripojenie programtora k mikropotau sa pouva 6 alebo 10 pinov konektor. Niektor mikropotae rady AVR maj aj JTAG programovacie rozhranie, ktor okrem programovania ponka aj monos debugovania (ladenia) programu. Pri programovan cez ISP sa vdy drte pravidla e aplikcia napja programtor cez ISP a nie naopak! tandard zapojenia ISP konektora

Programovacie rozhranie mikrokontrolra

Obr 3.2 - Zapojenie MCU ATmega8 Reset signl je pripojen cez odpor 10k na VCC. Pripojenm log. 0 na reset pin retartujeme mikropota. Obr 3.3 - tandardn zapojenie ISP konektora Pokia chceme poui extern krytl, tak ho zapojme na piny PB6 a PB7. Pripojme aj 22pF kondenztory na tieto piny oproti zemi. Rozsah napjacieho naptia je 2,7 5,5V pre ATmega8L, a 4,5 - 5,5V pre ATmega8.

13

PEME PRV PROGRAM


Vber programtora V prvom rade sa treba rozhodn i chcete programova mikropota v prostred AVR Studio 4. M to vek vhodu, pretoe je vetko "pod jednou strechou". Pokia sa rozhodnete pre tto monos budete si musie zakpi originlny programtor alebo vyrobi klon. Za celkom dobr ceny sa predvaj programtory AVR dragon, AVRISPmkI a AVRISPmkII. Na Slovensku sa daj zakpi napr. v SOS alebo GME Na internete je vak aj mnostvo nvodov na vrobu ISP programtorov pre AVR: Najjednoduch programtor cez paraleln port (neodpora sa) USBasp - USB programtor (pre AVRDUDE, odporan) AVRISP-MKII clone - USB programtor (kompatibiln s AVR Studio, odporan) biprog - RS232 programtor (kompatiblin s AVR Studio, odporan) Obr 3.5 - Prv zloka programovania MCU Na strnkach sa dozviete aj ak programovac software treba poui na naprogramovanie mikropotaa. alia zloka Program je najastejie vyuvan. Sli na naprogramovanie FLASH a EEPROM pamte zo sboru, ktor sme po skompilovan dostali. Pre Nahranie programu do mikrokontrolra v prostre- naprogramovanie nho programu vyberieme skomd AVR studio 4: pilovan *.hex sbor z nho projektu a stlame tlaalej budem popisova ako nahra v program po- idlo Program. mocou programtora kompatibilnho s prostredm AVR Studio 4. Pokia sa rozhodnete pre in programtor, treba si pretudova spsob programovania na strnke autora. Po stlaen tlaidla "Connect" vyberieme typ programtora a port na ktor je pripojen a potvrdme tlaidlom "Connect".

Obr. 3.4 - Pripojenie ku programtoru Objav sa nm nov okno s viacermi zlokami. Na prvej Main obrazovke mono vymaza obsah pamte mikrokontrolra alebo preta Signatru, ktor nm hovor o type mikrokontrolra. Tm meme zisti ak mikropota sa nachdza v danom zapojen.

Obr 3.6 - Druh zloka programovania MCU

14

PEME PRV PROGRAM


Zloka Fuses sli na nastavenie mikrokontrolra: RSTDISBL vypnutie reset signlu a vyuitie danho pinu ako vstupno-vstupn. Pozor po nastaven tejto poistky sa nebude da mikropota cez rozhranie ISP programova! WTDON zapnutie funkcie watchdog SPIEN povolenie SPI rozhrania. Pozor po vypnut tejto poistky sa nebude da mikropota cez rozhranie ISP programova! EESAVE poistka nastavuje i sa m EEPROM pam po prepsan FLASH zmaza alebo zachova BOOTSZ uruje miesto vo FLASH pamti kde sa nachdza bootloader BOOTRST zapnutie funkcie bootloadera CKOPT pri pouit externho krytlu tto voba zvi naptie osciltora a rob ho tak menej nchylnm v zaruenom prostred. Zvyuje spotrebu zariadenia BODLEVEL nastavenie spodnej hranice napjacieho naptia pri ktorej sa mikropota retartuje BODEN zapnutie funkcie retartu mikrokontrolra pri urenom nzkom stave napjacieho naptia SUT_CKSEL najpouvanejia poistka. Sli na nastavenie zdroja hodn pre mikropota. Mono zvoli napr. intern RC osciltor, extern krytl a pod... Vyuitie registrov: pomocou registra DDRD sme nastavili PD7 ako vstupn pin a ostatn piny portu ako vstupn pomocou registra PORTD sme nastavili pull-up rezistor na pin PD7 a prepname pomocou neho log. rove na PD6 m LED blik. tame register PIND a overujeme log. rove na PD6. Zdrojov kd:
#include <avr/io.h> #include <util/delay.h> int main(){ // PD7 ako vstupn pin ostatn ako vstupne DDRD = 0b01111111; PORTD |= (1 << PD7); // zapnutie pull-up rezistora na PD7 // nekonen sluka while(1){ if((PIND & (1 << PD7)) == 0){ // ak je PD7 nulov PORTD |= (1 << PD6); // rozsvie LED _delay_ms(200); // pokaj 200ms PORTD &= ~(1 << PD6); // zhasni LED _delay_ms(200); // pokaj 200ms }

N prv program

V naom prvom programe si vyskame prcu s IO } Portami. Zapojenie zapojme poda schmy na Obr 3.2. Fuse bity nastavme na intern RC osciltor 8 MHz, tak ist frekvenciu nastavme aj do projektu Youtube video: Test prvho programu - link AVR Studio 4. Program funguje nasledovne: LED blik len v tom prpade ak je PD7 spojen s GND a teda je na om log. 0. Ke pin PD7 odpojme od GND, intern pull-up rezistor privedie na pin PD7 napjacie naptie, o zmen log. rove na pine. Tm pdom podmienka nie je splnen a LED neblik.

return 0;

15

PRERUENIA

Preruenia
Preruenie
Pred pouitm akhokovek preruenia sa musia prePreruovac podsystm umouje efektvnu obsluhu ruenia najskr globlne povoli. To dosiahneme ponepravidelnch udalost, na ktor m mikrokontro- mocou funkcie sei(); lr reagova. V prpade vskytu definovanej udalos- Naopak v niektorch kritickch astiach programu ti mikokontrolr preru beh programu a venuje sa chceme preruenie globlne zakza. Na to sli funkprogramovej obsluhe udalosti, ktor dan preruenie cia cli(); vyvolala. Po skonen tejto programovej obsluhy mikrokontrolr pokrauje vo vkone hlavnho programu. Zpis obsluhy preruenia Vznam preruen je hlavne v zrchlen a zefektvnen Na zaiatku programu pridme hlavikov sbor pobehu programu. mocou direktvy #include <avr/interrupt.h> , ktor V jednej chvli (t.j. v jednom strojovom cykle) sa nm zabezpe prcu s prerueniami. mu vyskytn viacer preruenia a mikrokontrolr mus rozhodn, ktor iados bude vykonan ako Samotn funkciu preruenia potom deklarujeme prv. Na to je potrebn definova aksi poradie dle- takto: itosti prioritu preruen. ISR (vektor preruenia) { Na zklade priority preruen sa ur postupnos spra- // ... akcia preruenia ... // covania iadost v tom istom strojovom cykle. Plat } teda, e m menie slo vektora preruenia, tm ma preruenie vyiu prioritu. Z tabuky teda vidme e Kompletn zoznam vektorov preruenia pre C najviu prioritu ma preruenie od RESET a najmen- njdete na adrese: iu od SPM_RDY. http://www.nongnu.org/avr-libc/user-manual/ group__avr__interrupts.html Program s preruenm me teda vyzera takto:
#include <avr/interrupt.h> // preruenie od INT0 ISR (INT0_vect) { // ...nejak akcia... // } int main () { sei(); //povolenie globlneho preruenia GICR |= (1 << INT0); // povolenie preruenia od INT0 while(1); // nekonen sluka }

Poda monosti sa sname obslun funkciu preruenia spravi o najkratiu (zmeni premenn a pod.). Obr 4.1 - Tabuka zdrojov preruen Robme to preto, aby zbytone dlh obsluha prerueVidme teda e ATmega8 m celkovo 19 zdrojov pre- nia nebrzdila hlavn program alebo prpadne alie ruenia. V nasledovnch riadkoch sa budeme venova preruenia, ktor mu nasta. externm prerueniam - INT0, INT1.

16

PRERUENIA
Zdielan premenn: Ak potrebujeme v obsluhe preruenia meni hodnotu globlnej premennej, mus by tto premenn deklarovan s kovm slovom volatile. V opanom prpade sa zmena hodnoty premennej vykonan v obsluhe preruenia neuchov po skonen obsluhy. Prklad: volatile uint8_t abc; ISC10 Popis 0 iados o preruenie na vstupe INT1 je generovan rovou odpovedajcou log.0 0 1 ubovoln logick zmena na vstupe INT1 generuje iados o preruenie 1 0 Zostupn hrana na vstupe INT1 Extern preruenia generuje iados o preruenie Vyuvame ich vtedy, ak chceme preruenie vyvola 1 Nben hrana na vstupe INT1 zvonku (napr. stlaenie tlaidla). ATmega8 m dva ex- 1 generuje iados o preruenie tern zdroje preruenia nazvan INT0 (na pine PD2) Tab 4.1 - Spsob aktivcie ext. preruenia INT1 a INT1 (na pine PD3). Na ich obsluhu vyuvame dva registre (pozri dataPrklad: sheet MCU ATmega8 strana 66): Nastavme reakciu INT0 na nben hranu a INT1 na doben hranu: Popis registrov: // INT0 na nben hranu MCUCR - MCU Control Register pomocou bitov ISC11, ISC10, ISC01 a ISC00 v tom- MCUCR |= (1 << ISC01) | (1 << ISC00) ; to registri nastavme spsob aktivcie externho pre- //INT1 na doben hranu ruenia od INT0 a INT1. MCUCR |= (1 << ISC11); GICR - pomocou bitov INT1 a INT0 v tomto registri povolme preruenia od INT0 a INT1. Obr 4.2 - Register MCUCR Na vber mme tieto monosti: Reakcia na nzku rove naptia na pine Zmena logickho stavu na pine Reakcia na nben hranu (rising edge) Reakcia na doben hranu (falling edge) ISC00 Popis 0 iados o preruenie na vstupe INT0 je generovan rovou odpovedajcou log.0 0 1 ubovoln logick zmena na vstupe INT0 generuje iados o preruenie 1 0 Zostupn hrana na vstupe INT0 generuje iados o preruenie 1 1 Nben hrana na vstupe INT0 generuje iados o preruenie Tab 4.0 - Spsob aktivcie ext. preruenia INT0 ISC01 0 Prklad: Povolenie preruenia od INT1: GICR |= (1 << INT1); Ukkov program: Zapnutie LED na pine PD7 pomocou INT0 a vypnutie pomocou INT1. Reakcia preruenia na doben hranu (zmenu z log. 1 na log. 0). Schma zapojenia: ISC11 0

Obr 4.3 - Schma zapojenia s ext. preruenm

17

PRERUENIA
Zdrojov kd:
#include <avr/io.h> #include <avr/interrupt.h> ISR(INT0_vect){ PORTD |= (1 << PD7); // zapni LED } ISR(INT1_vect){ PORTD &= ~(1 << PD7); // vypni LED } int main(){ DDRD |= (1 << PD7); //PD7 ako vstupn (LED) // PD2,PD3 ako vstupn (ext. preruenia) DDRD &= ~((1 << PD2) | (1 << PD3)); // Zapnutie internho pull-up rezistora PORTD |= (1 << PD2) | (1 << PD3); MCUCR |= (1 << ISC01); // doben hrana INT0 MCUCR |= (1 << ISC11); // doben hrana INT1 // povol preruenia od INT1 a INT0 GICR |= (1 << INT1) | (1 << INT0); sei(); //povol globlne preruenia while(1); // nekonen cyklus return 0; }

Zdrojov kd pouitie globlnej premennej: To ist ako prv ukkov program, ale s pouitm globlnej premennej. Tip: vyskajte si program bez kovho slova "volatile".
#include <avr/io.h> #include <avr/interrupt.h> volatile uint8_t led = 0; ISR(INT0_vect) { led = 1; } ISR(INT1_vect) { led = 0; } int main() { DDRD |= (1 << PD7); //PD7 ako vstupn (LED) // PD2,PD3 ako vstupn (ext. preruenia) DDRD &= ~((1 << PD2) | (1 << PD3)); // Zapnutie internho pull-up rezistora PORTD |= (1 << PD2) | (1 << PD3); MCUCR |= (1 << ISC01); // doben hrana INT0 MCUCR |= (1 << ISC11); // doben hrana INT1 // povol preruenia od INT1 a INT0 GICR |= (1 << INT1) | (1 << INT0); sei(); // globlne povolenie preruen while(1) // nekonen cyklus { if (led) PORTD |= (1 << PD7); // zapni LED else PORTD &= ~(1 << PD7); // vypni LED } return 0;

Youtube video:

Test externeho preruenia - link

18

TAE/ASOVAE

tae/asovae
vod k taom/asovaom
ta/asova patr medzi najpouvanejie perifrie o sa mikrokontrolrov tka. Umouje presne asova beh uritej asti programu, doke ta vonkajie alebo vntorne impulzy, generova signl PWM, alebo signl uritej frekvencie a pod. Ide o samostatn as, ktor be nezvisle na prebiehajcich intrukcich mikrokontrolra. Mikrokontrolry rady AVR obsahuj niekoko jednotiek taa/asovaa a oznauj sa slom (0, 1, 2 ...). Konkrtne ATmega8 obsahuje takto jednotky tri. Kad z nich doke vykonva zkladn innosti (ta/ asova) avak niektor z nich obsahuj aj alie funkcie ako generovanie PWM signlu, extern vstup taa at... Register ktor uklad aktulnu hodnotu taa sa oznauje TCNTn, kde n predstavuje slo taa/asovaa. Pri asovan udalost asto vyuvame preteenia TCNTn, pri ktorom vykonme preruenie. Preteenie nastane vtedy, ke mme v tai maximlnu hodnotu (napr. pri 8 bitovom je to hodnota 255) a tto hodnotu inkementujeme. Vtedy sa ta vynuluje a nastane preruenie.

Pri pouvan internho RC osciltora sa me n nastaven as od skutonho mierne li. Je to spsoben odchlkou osciltora. Pri vrobe mikrokontrolra bol vntorn RC osciltor nakalibrovan a vsledkom je kalibran kontanta. Tto kontantu sa dozvieme v programovacom okne v zloke "Advanced". Po vybrat elanej frekvencie a stlaen tlaidla Read sa dozvieme nau kalibran kontantu, ktor je pre kad mikrokontrolr jedinen. V mojom prpade je hodnota 0xA5. Ke chceme aplikova kalibran kontantu v naom programe zapeme tto hodnotu do registra OSCCAL. Zpis v mojom prpade bude vyzera takto : OSCCAL = 0xA5; V nasledovnch riadkoch si postupne rozoberieme tri tae/asovae ktor obsahuje mikrokontrolr ATmega8 a zoznmime sa s monosami ich pouitia.

ita/asova 0 (vi datasheet obvodu Atmega8 na strane 67)


Vlastnosti: 8 bitov ta/asova ta externch impulzov privdzanch na T0 10 bitov preddelika Preruenie na akciu preteenia TCNT0

Obr 5.1 - Blokov schma taa/asovaa 0 Obr 5.0 - Pretanie kalibranej kontanty MCU

19

TAE/ASOVAE
Popis registrov: TCCR0 (Timer/Counter 0 Control Register) sli na riadenie funkcie taa/asovaa 0. Kede ta/asova 0 je 8-bitov ,tak preteenie nastane vdy po 256 impulzoch, teda nastane kadch 256*128us = 32,768ms Vypotame teda koko krt mus preruenie nasta ,aby sme dosiahli as 0,5s. N = 500ms / 32,768ms = 15,25x o je zaokrhlene 15x, teda 491,52ms o predstavuje odchlku -1,7% Zdrojov kd:
#include <avr/io.h> #include <avr/interrupt.h> volatile unsigned char i; // preteenie potadla TCNT0 //nastane kadch 128us*256 = 32,768ms ISR (TIMER0_OVF_vect){ // 15*32.768 = 491,52ms if(i == 15){ // finta s log. operciou XOR - neguje len pin PD7 PORTD ^= (1 << PD7); i=0; } } i++;

Obr 5.2 - Register TCCR0 V prpade taa/asovaa 0 sli len na vber zdroja hodin a preddeliky pomocou bitov CS02, CS01, CS00. Z tabuky vidme, e obsah registra TCNT0 meme inkrementova bu vntorne (priamo alebo cez preddeliku), alebo externe cez vstupn pin T0. Ak mme frekvenciu hodn 8MHz, tak bez preddeliky sa bude obsah registra TCNT0 inkrementova za as T = 1/8MHz = 125ns. Pri preddelike 64 bude perida inkrementcie TCNT0 - T= 1/(8MHz/64) = 8ms.

Obr 5.3 - Vber preddeliky TIMSK (Timer/counter Interrupt Mask Register)

int main(){ DDRD |= (1 << PD7); // PD7 ako vstupn // preddelicka /1024 (128us) TCCR0 |= (1 << CS02) | (1 << CS00); TIMSK |= (1 << TOIE0); // preruenie pri preteen TCNT0 sei(); //povol globlne preruenia while(1); //nekonenn sluka

Obr 5.4 - Register TIMSK

Pomocou bitu TOIE0 (Timer/counter 0 Overflow In- return 0; terrupt Enable) v tomto registri meme povoli pre- } ruenie na akciu preteenia taa/asovaa 0. Youtube video: 8-bitov ta/asova 0 - link Prklady: Prklad .1: S vyuitm taa/asovaa 0 a frekvenci hodn 8 MHz Prklad .2: realizujte blikanie LED s priblinou dkou zopnutia Z predchdzajceho prkladu vidme, e pri preddelike 1024 a frekvencii hodn 8MHz nie je mon naTon=0,5s a dkou rozopnutia Toff = 0,5s. stavi ta/asova 0 na presne zadan as. Pouijeme teda preddeliku 8 pri frekvenci hodn 8MHz, pri Zvolme preddeliku 1024: ktorom bude perida inkrementcie taa 1us. T = 1 / (8MHz / 1024) = 128us S tmto asom u vieme pohodlnejie pracova. perida inkrementcie TCNT0.

20

TAE/ASOVAE
Ukeme si aj "fintu" s runm nastavenm registra Prklad .3: TCNT0, ktorm nastavme, aby nm preteenie na- Pomocou tlaidla privdzajte impulzy do externho stalo vdy po 100 impulzoch teda po 100us. vstupu T0 s reakciou na doben hranu a napotan hodnotu (TCNT0) ,zobrazte pomocou 4 LED v binrZdrojov kd: nom tvare.
#include <avr/io.h> #include <avr/interrupt.h> volatile unsigned int i; void delay_ms(unsigned int time); // preteenie potadla TCNT0 - nastane kadch 100us ISR (TIMER0_OVF_vect){ // nastavenie poiatonej hodnoty potadla TCNT0 = 156; i++; } //vlastn akacia funkcia s vyuitm taa/asovaa 0 void delay_ms(unsigned int time){ TCNT0 = 156; i=0; // cakaj pokial prebehne i krat pretecenie while(i != time*10);

Zdrojov kd:
#include <avr/io.h> int main(){ DDRC |= 0xFF; // PORTC ako vstupn DDRD &= ~(1 << PD4); // PD4 (T0) ako vstupn PORTD |= (1 << PD4);// PD4 (T0) do log 1. //dobezna hrana na T0 TCCR0 |= (1 << CS02) | (1 << CS01); while(1){ PORTC = TCNT0; // zobraz binrne napotan hodnotu if(TCNT0 > 15) TCNT0 = 0; // iba spodne 4 bity } return 0; }

int main(){ DDRD |= (1 << PD7); // PD7 ako vstupn TCCR0 |= (1 << CS01); // preddelicka /1024 (1us) // preruenie pri preteen TCNT0 TIMSK |= (1 << TOIE0); sei(); //povol globlne preruenia while(1){ PORTD ^= (1 << PD7); //neguj PD7 // volanie nasej cakacej funkcie delay_ms(200); } return 0; }

Youtube video: 8-bitov ta/asova 0 - extern zdroj hodn

ta/asova 1 (vi datasheet obvodu ATmega8 na strane 75)


Vlastnosti: 16 bitov ta/asova 2 nezvisl porovnvacie jednotky OCRn ta vonkajch impulzov Generovanie PWM alebo frekvencie Zachytenie akt. hodnoty taa/asovaa 1 na udalos Input Capture

Youtube video: 8-bitov ta/asova 0 - akacia funkcia

21

TAE/ASOVAE

Obr 5.6 - Blokov schma Input Capture Popis registrov: TCCR1A (Timer/Counter 1 control register B) riadiaci register taa/asovaa 1 Sli na nastavenie reimu PWM, funkcia tohto registra bude vysvetlen v alej kapitole.

Obr 5.5 - Blokov schma taa/asovaa 1

ta/asova 1 obsahuje register TCNT1,do ktorho sa uklad aktulna hodnota taa. Tento register TCCR1B (Timer/Counter 1 control register B) je oproti TCNT0 16 bitov, o znamen e potadlo riadiaci register taa/asovaa 1 me nadobda 65536 hodnt. Znamen to teda ,e bude preteka pomalie ako 8 bitov ta/asova, o je pohodlnejie z hadiska generovania dlhch asov. Obr 5.7 - register TCCR1B Obsah registra TCNT1 meme inkrementova bu vntorne (priamo alebo cez preddeliku), alebo ex- ICNC1 (Input capture noise canceller) pri poterne cez vstupn pin T1. Ovldac register potadla volen (log. 1) zapne obmedzova umu na pine je TCCR1 je 16-bitov a preto je rozdelen na dva ICP1 8-bitov registre TCCR1A a TCCR1B. Obsah pota- ICES1 (Input Capture Edge Select) nastav na dla mono porovnva s dvoma registrami OCR1A a ak hranu vstupnho signlu na pine ICP1 sa m OCR1B ,ktor s tie 16-bitov, o sa vyuva hlavne vykona zachytenie aktulneho obsahu TCNT1 do pri generovan PWM signlu. registra ICR1. Pri zpise log. 1 je to reakcia na nben hranu pri log. 0 na doben hranu ita/asova 1 m asto vyuvan funkciu uloe- WGM13, WGM12 sli na nastavenie PWM nia stavu potadla TCNT1 do registra ICR1 pri udamdu losti Input Capture (vi obr 5.6). Tto udalos me CS12, CS11, CS10 vber zdroja hodin a preddeby vyvolan prchodom impulzu na pin ICP1 (Input liky (vi Obr 5.8) Capture Pin) alebo vstupom z internho kompartora. Tto funkcia sa vyuva hlavne na meranie dky peridy externho signlu, frekvencie alebo striedy signlu.

22

TAE/ASOVAE
Zdrojov kd:

#include <avr/io.h> #include <avr/interrupt.h> // preteenie registra TCNT1 ISR (TIMER1_OVF_vect){ // nastavenie poiatonej hodnoty potadla TCNT1 = 34286; PORTD ^= (1 << PD7); //neguj PD7 } int main(){ DDRD |= (1 << PD7); // PD7 ako vstupn

Obr 5.8 - vber preddeliky a zdroja hodn pre ta/ asova 1 TIMSK (Timer/counter Interrupt Mask Register) sli na povolenie jednotlivch preruen od taa/ asovaa 1

TCCR1B |= (1 << CS12); //preddelika 256 (32us)

Obr 5.9 - Register TIMSK TICIE1 (Timer/counter 1 Input Capture Interrupt Enable) povolenie preruenia po prchode impulzu na pin ICP1 OCIE1A(Output compare A Interrupt Enable) povolenie preruenia pri zhode registra TCNT1 a OCR1A OCIE1B (Output compare B Interrupt Enable) povolenie preruenia pri zhode registra TCNT1 a OCR1B TOIE1 (Timer/counter 1 Overflow Interrupt Enable) povolenie preruenia pri preteen alebo podteen registra TCNT1 Prklady Prklad .1: Blikanie LED pomocou v intervale Ton=1s a Toff=1s runm nastavenm nastavenm TCNT1 alebo vyuitm porovnvacieho registra OCR1A. V programe sme zvolili preddeliku taa/asovaa 1 na hodnotu 256. To znamen, e register TCNT1 sa bude inkrementova za as 32us. Ke chceme aby preruenie na udalos preteenia TCNT1 nastalo za 1sec, tak mus prs 1s/32us = 31250 impulzov. Preteenie nastane pri hodnote 65536 teda,ke maximlnu hodnotu taa/asovaa 1 (65535) inkrementujeme. V preruen teda nastavme TCNT1 na hodnotu 65536 31250 = 34286 a preteenie nastane vdy za as 1s.

// preruenie pri preteen TCNT1 TIMSK |= (1 << TOIE1); OSCCAL = 0xA5; // nastavenie kalibracneho bajtu interneho RC oscilatora sei(); // povol globalne preruenia return 0; } while(1); // nekonen sluka

Youtube video: ta/asova 1 - meranie asu 1s Pozn.: Podobn efekt meme dosiahnu aj nastavenm porovnvacieho registra OCR1A, ktor nastavme na hodnotu na 31250 1 = 31249. Pri zhode TCNT1 a OCR1A nastane preruenie. V naom prpade tie v 1s intervale. Zdrojov kd:
#include <avr/io.h> #include <avr/interrupt.h> // preteenie pri zhode registrov OCR1A a TCNT1 ISR (TIMER1_COMPA_vect){ TCNT1 = 0; // nuluj TCNT0 PORTD ^= (1 << PD7); //neguj PD7 } int main(){ DDRD |= (1 << PD7); // PD7 ako vstupn

TCCR1B |= (1 << CS12); //preddelika 256 (32us)

23

TAE/ASOVAE
// preruenie pri zhode OCR1A a TCNT1 TIMSK |= (1 << OCIE1A); OCR1A = 31249; // TOP hodnota, preteenie nastane pri hodnote 31250 // 7812 je poet impulzov TCNT1 za as 1s for(blik=0;blik < (namerane/7812);blik++){ PORTD |= (1 << PD7); _delay_ms(200); PORTD &= ~(1 << PD7); _delay_ms(200); } } return 0; } namerane = 0; }

OSCCAL = 0xA5; // nastavenie kalibracneho bajtu interneho RC oscilatora sei(); // povol globalne preruenia while(1); // nekonen sluka return 0; }

Prklad .2 Pozn: Program bude korektne fungova len do asu Realizujte meranie asu pomocou ICP1 pinu. Dobu menieho ako pribl. 8 sec, nakoko pri vyom ase u v sekundch medzi dvoma stlaeniami, tlaidla bude preteie obsah registra TCNT1 reprezentova poet bliknut LED Youtube video: Zdrojov kd: 16 bitov ta/asova 1 - Meranie dky asu
#include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h>

volatile unsigned int namerane; // akcia Input Capture ISR (TIMER1_CAPT_vect){ namerane = TCNT1; TCNT1 = 0; } int main(){ unsigned char blik; DDRD |= (1 << PD7); // PD7 ako vstupn

Prklad .3: Vyuitie taa/asovaa 0 a 1. Pomocou taa/asovaa 1 nastavte blikanie LED s frekvenciou pribl. 2Hz. ta/asova 0 vyuite na modulciu signlu pri zapnutej LED s frekvenciou pribl. 15Hz. Zdrojov kd:
#include <avr/io.h> #include <avr/interrupt.h> volatile unsigned char blikaj; // preteenie TCNT0 za as 32ms ISR (TIMER0_OVF_vect){ // ak blikaj tak blikaj :) if(blikaj) PORTD ^= (1 << PD7); } // preteenie TCNT0 za as 0,524288s ISR (TIMER1_OVF_vect){ blikaj ^= 1; // neguj premennu blikaj } int main(){ DDRD |= (1 << PD7); // PD7 ako vstupn

DDRB &= ~(1 << PB0); // PB0 (ICP1) ako vstupny PORTB |= (1 << PB0); //PB0 (ICP1) do log.1 //preddelika 1024 (128us) TCCR1B |= (1 << CS12) | (1 << CS10); // preruenie na udalost Input Capture TIMSK |= (1 << TICIE1);

// nastavenie kalibracneho bajtu int. RC oscilatora OSCCAL = 0xA5; sei(); // povol globalne preruenia while(1){ // nekonen sluka

//preddelika /0 1024 (128us) TCCR0 |= (1 << CS02) | (1 << CS00); //preddelika /1 64 (8us) TCCR1B |= (1 << CS11) | (1 << CS10);

// ak sa stlailo tlaidlo zablikaj LED if(namerane) {

24

TAE/ASOVAE
// preruenie na udalost Input Capture TIMSK |= (1 << TOIE0) |(1 << TOIE1);

// nastavenie kalibr. bajtu interneho RC oscilatora OSCCAL = 0xA5; sei(); // povol globalne preruenia while(1); return 0; }

Aktulny stav taa/asovaa 2 sa uklad do 8 bitovho registra TCNT2. Tento ta/asova 2 m hlavne vyuitie ako RTC - zdroj relneho asu. Ke potrebujeme preruenie na udalos preteenia TCNT2 kad sekundu tak preddeliku nastavme na 128, pripojme na piny TOSC1 a TOSC2 extern osciltor 32,768 kHz a preruenie nastane kad sekundu pretoe 32,768 kHz / (128 * 256) = 1s

Popis registrov : TCCR2 (Timer/Counter 2 control register):

Youtube video: Vyuitie taa/asovaa 0 a 1

Obr 5.11 - register TCCR2

ta/asova 2 (vi datasheet obvodu Bity CS22,CS21,CS20 slia na vber vber preddeliky. Ostatn bity slia na nastavenie PWM. ATmega 8 na strane 102)
Vlastnosti: 8 bitov Pracuje ako ta/asova 0 Monos taktovania asynchrnne z externho krytlu 32,768 kHz pripojenho na piny TOSC1 a TOSC2. Vyuitie ako RTC (hodiny) Monos generovania PWM signlu alebo frek- Obr 5.12 - Volba preddeliky taa/asovaa 2 vencie ASSR2 (Asynchronous Status Register):

Obr 5.13 - register ASSR2 AS2 (Asynchronous Timer/Counter 2) pri zpise log. 0 na tento bit je ta/asova taktovan z frekvencie hodn. Pri zpise log. 1 je taktovan z externho krytlu 32,768 kHz pripojenho na piny TOSC1 a TOSC2. TIMSK (Timer/counter Interrupt Mask Register):

Obr 5.10 - blokov schma taa/asovaa 2

Obr 5.14 - register TIMSK OCIE2 (Timer/counter 2 Output compare Interrupt) povolenie preruenia pri zhode registrov TCNT2 a OCR2 TOIE2 (Timer/counter 2 Overflow Interrupt) povolenie preruenia pri preteen registra TCNT2

25

TAE/ASOVAE - PWM

tae/asovae - PWM
vod k impulzne-rkovej modulci (PWM) prvky by vak takto pulzy asi nepreili, preto v tchVznam PWM na rozdiel od spojitej regulcie je hlavne v eliminovan strt na regultore. Pri PWM regulujeme dodvan vkon do zae pomocou striedy. Strieda je pomer asu zopnutia ku celkovej peride spnacieho prvku. to prpadoch treba na vstup zaradi RC filter ktor vstupne naptie vyhlad na hodnotu naptia dan vekosou striedy. Tto regulcia m v sasnej dobe vek vyuitie v elektronike. Vyuvame ju hlavne na regulciu iaroviek, motorov, v spnanch zdrojoch alebo dokonca v audio technike ako zosilova triedy D.

Generovanie PWM pomocou AVR mikrokontrolra


Obr 6.0 - PWM signl D = (t_on /t_p) D- strieda T_on as zopnutia T_p - perida

Pri prci s PWM vyuvame registre TCCR1A a TCCR1B taa/asovaa 1, pomocou ktorch nastavme reim PWM, pracovn frekvenciu a sprvanie vstupnch pinov OC1A a OC1B. Popis registrov (vi datasheet obvodu ATmega8 na strane 96): TCCR1A (Timer/counter 1 control register A) -Vyuva sa na nastavenie PWM:

Pre lepie porozumenie uvediem prklad: Nech mme napjacie naptie 12V a iarovku s parametrami 6V/1A. Pri klasickej spojitej regulci by sme na regultore (tranzistore) museli vytvori byObr 6.1 - Register TCCR1A tok naptia 6V pri prde 1A ,o by spsobilo tepeln stratu na tranzistore 6W. Efektivita tejto regulcie by bola teda 50%, teda rovn polovica energie by sa pre- COM1A1, COM1A0 slia na nastavenie sprvania vstupnho pinu OC1A menila na teplo. COM1B1, COM1B0 slia na nastavenie sprvania vstupnho pinu OC1B Pri PWM regulci vytvorme striedu D=0,5, teda tranzistor bude zopnut polovicu asu. Straty na tranzistore bud najvyie pri zopnan a rozopnan tran- Nastavenie tchto bitov m odlin funkciu v zviszistora. Pri zopnutom tranzistore nm bude tiec prd, losti od nastavenia reimu PWM. ale tranzistor bude v saturci, take sa na om vytvor mal bytok naptia, tm pdom bude aj vkonov Normlny reim: strata mal. Pomocou PWM teda meme dosiahn vysok innos regulcie (obvykle nad 90%). Pozn.: Pri takomto zapojen vak nebude na vstupe kontantn naptie 6V! Na vstupe bude urit as Obr 6.2 - Sprvanie vstupnch pinov pri norm. reime periody napjacie naptie 12V ale iarovka sa neprepli vaka jej tepelnej zotrvanosti. Polovodiov

26

TAE/ASOVAE - PWM
Pri normlnom reime (nie v reimoch PWM), meme nastavi sprvanie pinov OC1A a OC1B pri zhode porovnvacieho registra OCR1n s registrom TCNT1 nasledovne: (0,0)Piny OC1A a OC1B s odpojen od taa (0,1) Zmena log. rovne pri zhode registrov (1,0) Nastav vstup OC1A/OC1B do log.0 pri zhode registrov (1,1) Nastav vstup OC1A/OC1B do log.1 pri zhode registrov Reim rchlej PWM (Fast PWM): as dekrementcie registra TCNT1 (1,1) Nastav vstup OC1A/OC1B do log.1 pri zhode registrov poas inkrementcie a log. 0 poas dekrementcie registra TCNT1 FOC1A, FOCA1B pri zapsan log.1 vyvol compare match udalos (FOC1A na OC1A a FOC1A na OC1B) s tm rozdielom e na tuto udalos reaguje len Waveform Generation jednotka, ktor riadi vstupn OCx piny, take sa nenastav flag OCFx a nevyvol sa preruenie a takisto sa nevykon vynulovanie hodnoty taa v CTC mde. WGM11,10 a WGM13,12 s registra TCCR1B (Waveform generation mode): Z tabuky vidno, e ta/asova 1 na ATmega8 doke pracova v 15 reimoch v zvislosti od nastavenia bitov WGM. Z toho s 3 zkladn reimy PWM (Fast PWM, Phase correct PWM a Phase and Frequency correct PWM) a jeden reim pre generovanie frekvencie CTC.

Obr 6.3 - Sprvanie vstupnch pinov Fast PWM (0,0) Piny OC1A a OC1B s odpojen od taa (0,1) Zmena log. rovne na pine 0C1A pri reime 15, OC1B odpojen. V ostatnch reimoch s OC1A a OC1B odpojen od taa (1,0) Nastav vstup OC1A/OC1B do log.0 pri zhode registrov a log.1 pri BOTTOM hodnote. (1,1) Nastav vstup OC1A/OC1B do log.1 pri zhode registrov a log 0 pri BOTTOM hodnote. Reim Phase correct a Phase and Frequency correct PWM:

Obr 6.5 - PWM reimy MCU

Reimy (vi datasheet obvodu ATmega8 na strane 87)


Obr 6.4 - Sprvanie vstupnch pinov pri Phase correct a frequency correct PWM 1) CTC reim (Clear timer on compare match) Je charakterizovan tm, e obsah taa TCTN1 je vynulovan ,ak jeho hodnota dosiahne hodnotu uloen (0,0) Piny OC1A a OC1B s odpojen od taa v OCR1A (reim 4), alebo ICR1 (reim 12). Hodnota (0,1) Zmena log. rovne na pine 0C1A pri reime v OCR1A, alebo ICR1 udva TOP, teda najvyiu hod9 a 14, OC1B odpojen od taa. V ostatnch re- notu taa. imoch s OC1A a OC1B odpojen (1,0) Nastav vstup OC1A/OC1B do log.0 pri zhode registrov poas inkrementcie a log. 1 po-

27

TAE/ASOVAE - PWM
int main(){ DDRB |= (1 << PB1); // OC1A ako vstupn

// REZIM 4 (CTC), nastavenie zmeny log. rovne // pri zhode OCR1A a TCNT1 TCCR1A |= (1 << COM1A0);

Obr 6.6 - asov diagram CTC reimu

iados o preruenie me by generovan vdy, ke obsah taa dosiahne hodnotu TOP definovan obsahom OCR1A, alebo ICR1. Ak je preruenie povoleOSCCAL = 0xA5; n, potom v rmci obslunej rutiny me by zmene- // nastavenie kalibr. bajtu interneho RC oscilatora n prslun hodnota TOP. Vstupn frekvenciu vypotame poda vzahu:
return 0; } sei(); // povol globalne preruenia while(1); // nekonen sluka

// preddelika 8 pri 8 MHz = (1us) TCCR1B |= (1 << WGM12) | (1 << CS11); OCR1A |= 499; //povol preruenie pri zhode OCR1A a TCNT1 TIMSK |= (1 << OCIE1A);

, kde fclk je frekvencia hodn, N je preddelika a OCRnA je hodnota porovnvacieho registra. Prklady Prklad .1: Striedaj 5 perid s frekvenciou 1000 Hz a 500 Hz. Vyuijeme CTC reim. Poda vzorca vypotame, e hodnota OCR1A registra bude 499 pre frekvenciu 1000Hz a 249 pre 2000Hz, pri nastavenej preddelike 8 a frekvenci hodn 8 MHz. V preruen na udalos zhody OCR1A a TCNT1 registra po 5 peridach striedame hodnoty OCR1A registra, m striedame aj frekvencie 1000 a 2000Hz. Zdrojov kd:
#include <avr/io.h> #include <avr/interrupt.h> // pocet period danej frekvencie volatile unsigned char n; //preteenie TCNT1 ISR (TIMER1_COMPA_vect){ // 5 period (dve zmeny) if(n == 10){ // zmen hodnotu OCR1A po 5 period OCR1A = ((OCR1A == 499) ? 249 : 499); n=0; } n++; }

Vstupn priebeh: Obr 6.7 - Vstupn priebeh signlu s prkladu .1 2) Reim " rchla PWM" (Fast Pulse Width Modulation) Reimy z tabuky: 5, 6, 7, 14 alebo 15. Generuje impulzn rkovo modulovan signl (PWM). V tomto reime sa obsah taa zvyuje od hodnoty BOTTOM do hodnoty TOP. V neinvertujcom reime sa vstup OC1x nastav pri zhode obsahov taa TCNT1 a OCR1x a vynuluje sa pri dosiahnut hodnoty TOP. Pri invertujcom reime je to obrtene (vi as registre).

28

TAE/ASOVAE - PWM
Prklad .1: Plynule rozsvecovanie iarovky Pouit je 8-bitov PWM. Zmena striedy sa realizuje v nekonenej sluke v 10ms intervaloch. Zdrojov kd:
#include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> int main(){

Obr 6.8 - asov diagram Fast PWM reimu Rozlenie rchlej PWM me by pevn, 8, 9, alebo 10 bitov, prpadne definovan obsahom ICR1, alebo OCR1A. Minimlne povolen rozlenie je 2 bity (ICR1, alebo OCR1A je nastaven na hodnotu 0x0003). Maximlne rozlenie je 16 bitov (ICR1, alebo OCR1A je nastaven na hodnotu MAX). Rozlenie PWM je dan nasledujcim vzahom:

DDRB |= (1 << PB1);

// OC1A ako vstupn

// REZIM 5 - Fast PWM 8bit, TCCR1A |= (1 << COM1A1) | (1 << WGM10); // preddelika 8 pri 8 MHz = (1us) TCCR1B |= (1 << WGM12) | (1 << CS11); OCR1A = 0;

// nastavenie kalibr. bajtu interneho RC oscilatora OSCCAL = 0xA5; sei(); // povol globalne preruenia while(1){ // nekonen sluka // rozsvecuj ziarovku zmenou striedy OCR1A++; if(OCR1A >= 255) OCR1A=0; _delay_ms(10); } return 0; }

V reime rchlej PWM sa ta inkrementuje pokia jeho hodnota nenadobudne jednu z definovanch hodnt 0x00FF, 0x01FF, alebo 0x03FF (reimy 5, 6, alebo 7), hodnotu v ICR1 (reim 14), alebo hodnotu v OCR1A (reim 15). V nasledujcom hodinovom cykle po dosiahnut definovanej hodnoty sa jeho obsah vynuluje. Prznak preteenia sa nastav, ke obsah taa dosiahne hodnotu TOP. Ak je obsluha preruenia povolen, potom pomocou obslunho programu preruenia meme zmeni hodnotu TOP, prpadne porovnvaciu hodnotu.

Youtube video: PWM - plynul rozsvecovanie iarovky - link

Prklad .2: Ovldanie jasu iarovky pomocou 2 tlaidiel Vyuili sme vedomosti z kapitoly venujcej sa externmu prerueniu. Dve tlaidl s pouit ako zdroj externho preruenia piny (INT0 a INT1). Prvm tlaFrekvenciu PWM meme uri na zklade nasleduj- idlom pridvame hodnotu striedy, druhm uberme. ceho vzahu: Pouit je 8-bitov PWM. Zdrojov kd , kde fclk je frekvencia hodn, N je preddelika a TOP je max. hodnota taa/asovaa.
#include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> ISR(INT0_vect){ if(OCR1A < 245) OCR1A+=10; //pridaj striedu }

29

TAE/ASOVAE - PWM
ISR(INT1_vect){ if(OCR1A > 10) OCR1A-=10; // uber striedu

Zdrojov kd:

int main(){ DDRB |= (1 << PB1);

// OC1A ako vstupn

#include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <math.h> #define sample_rate 32.768e-6 volatile unsigned char i; volatile unsigned char sine[256]; // vygeneruje pole s hodnotami sinus void generate_sin(int freq){ for(unsigned char x=0; x<255;x++){ sine[x] = 128*(sin(2.0*M_PI*x*sample_rate*freq) + 1); } } //preteenie nastane za as 32,768us ISR(TIMER1_OVF_vect){ //generuj sinus OCR1A = sine[i]; i++; } int main(){ // generuj sinus o frekvencii 1000Hz generate_sin(1000); DDRB |= (1 << PB1); // OC1A ako vstupn

// REZIM 5 - Fast PWM 8bit, TCCR1A |= (1 << COM1A1) | (1 << WGM10); // preddelika 8 pri 8 MHz = (1us) TCCR1B |= (1 << WGM12) | (1 << CS11); // PD2,PD3 ako vstupn (ext. preruenia) DDRD &= ~((1 << PD2) | (1 << PD3)); // Zapnutie internho pull-up rezistora PORTD |= (1 << PD2) | (1 << PD3); MCUCR |= (1 << ISC01); // doben hrana INT0 MCUCR |= (1 << ISC11); // doben hrana INT1 // povol preruenia od INT1 a INT0 GICR |= (1 << INT1) | (1 << INT0);

// nastavenie kalibr. bajtu interneho RC oscilatora OSCCAL = 0xA5; sei(); // povol globalne preruenia while(1); return 0; }

Youtube video: Ovldanie jasu iarovky pomocou dvoch tlaidiel Prklad .3: Generovanie snusu Na zaiatku vygenerujeme pole hodnt cez funkciu generate_sin(); kde vstupnm parametrom je elan frekvencia. Snusovka sa rozkskuje na asti o dke 32.768us, o je vzorkovacia frekvencia a k tmto astiam snusovky sa pridel hodnota striedy. Potom cez preruenie na udalos preteenia TCNT1 sa postupne tieto hodnoty nahrvaj do registra OCR1. Aby sme dostali snusov priebeh musme na vstup OC1A pripoji dolnopriepustn RC filter, vypotan pribline na dvojnsobn frekvenciu zadanho signlu f= 1/(2*pi*R*C). S rastcou frekvenciou kles poet vzoriek na peridu. Pri frekvencii 1000Hz je to zhruba 30 vzoriek na peridu. V prklade som generoval frekvenciu 1000Hz, teda hodnoty prvkov mi vyli R=1kOhm, C=82nF

// REZIM 5 - Fast PWM 8bit, sample rate bude 32,768us TCCR1A |= (1 << COM1A1) | (1 << COM1A0) | (1 << WGM10); // preddelika 1 pri 8 MHz = (128ns) TCCR1B |= (1 << WGM12) | (1 << CS10); TIMSK |= (1 << TOIE1); //preruenie na preteenie

OSCCAL = 0xA5; // nastavenie kalibr. bajtu interneho RC oscilatora sei(); // povol globalne preruenia while(1); return 0; }

Vstupn priebeh: Horn priebeh je PWM signl na pine OC1A a spodn priebeh je snus zskan z PWM cez dolnopriepustn RC filter.

30

TAE/ASOVAE - PWM
ne rozlenie je 16 bitov (ICR1, alebo OCR1A je nastaven na hodnotu MAX). Rozlenie PWM je dan nasledujcim vzahom:

Obr 6.9 - vstupn priebeh PWM signlu s prkladu . 3 3) fzovo korektn PWM (Phase correct PWM) Reimy 1,2,3,10,11. V tomto reime sa hodnota taa zvyuje (inkrementuje) od hodnoty BOTTOM (0x0000) a po hodnotu TOP a potom sa nsledne dekrementuje po hodnotu BOTTOM. V neinvertujcom vstupnom porovnvacom reime je vstup OC1x vynulovan v prpade rovnosti obsahov TCNT1 a OCR1x pri potan smerom nahor a nastavuje sa pri potan smerom nadol. V invertujcom reime je situcia opan. Maximlna dosiahnuten zkladn frekvencia fzovo korektnej PWM je niia ne pri rchlej PWM.

Ak je obsluha preruenia povolen preruenie me v zvislosti od nastavenia nasta pri hodnote TOP alebo BOTTOM. V obslunom programe preruenia meme potom zmeni hodnotu TOP, prpadne porovnvaciu hodnotu. Pri definovan novej TOP hodnoty je potrebn zabezpei, aby bola via, alebo rovn ne hodnoty v porovnvacch registroch. Frekvenciu fzovo korektnej PWM meme uri na zklade nasledujceho vzahu:

, kde N je preddelika, TOP je max. hodnota taa/ asovaa a fclk je frekvencia hodn. 4) fzovo a frekvenne korektn PWM (Phase and frequency correct PWM) S to reimy 8 a 9. V tomto reime sa hodnota taa inkrementuje od hodnoty BOTTOM (0x0000) a po hodnotu TOP a potom sa nsledne dekrementuje po hodnotu BOTTOM. V neinvertujcom reime je pri potan smerom nahor vstup OC1x nulovan v prpade rovnosti obsahov TCNT1 a OCR1x. Pri dekrementci sa vstup nastav v prpade zhody do log.1 V invertujcom reime je situcia opan.

Obr 6.10 - asov diagram reimu fzovo korektnej PWM Tento reim je asto pouvan pri riaden motorov. Rozlenie PWM je pevn 8, 9, alebo 10 bitov, prpadne definovan obsahom registrov ICR1, alebo OCR1A. Najmenie pouiten rozlenie je 2 bity (ICR1, alebo OCR1A je nastaven na hodnotu 0x0003). Maximl- Obr 6.11 - asov diagram fz. a frek. korektnej PWM

31

TAE/ASOVAE - PWM
Maximlna dosiahnuten zkladn frekvencia fzovo a frekvenne korektnej PWM je niia ne pri rchlej PWM. Tento reim je asto pouvan pri riaden motorov. Rozlenie PWM je definovan obsahom registrov ICR1, alebo OCR1A. Najmenie pouiten rozlenie je 2 bity. Vtedy je ICR1, alebo OCR1A nastaven na hodnotu 0x0003. Maximlne rozlenie je 16 bitov, ak ICR1, alebo OCR1A je nastaven na hodnotu MAX. Rozlenie PWM je dan nasledujcim vzahom: krementuje sa, take as treba nsobi dvoma. Zdrojov kd:
#include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> int i; //preteenie nastane za as 2048us ISR(TIMER1_OVF_vect){ OCR1A = i; i+=10; if(i>1024) i=0; } int main(){

V reime fzovo a frekvenne korektnej PWM je obsah taa inkrementovan a do okamiku, v ktorom nedosiahne jednu z hodnt nastavench v registri ICR1 (reim 8), alebo v registri OCR1A (reim 9). Ak ta dosiahne hodnotu TOP zmen smer potania. Obsah taa bude rovn hodnote TOP prve jeden hodinov cyklus. Na definovanie hodnoty TOP pouit register OCR1A, alebo ICR1. Prznaky preruenia mu by vyuit na generovanie preruen v asovch okamikoch, v ktorch obsah TCNT1 dosiahne hodnotu TOP, alebo BOTTOM.

DDRB |= (1 << PB1);

// OC1A ako vstupn

// REZIM 3 - Phase and Freq. correct PWM - 10bit TCCR1A |= (1 << COM1A1) | (1 << COM1A0) | (1 << WGM10) | (1 << WGM11); // preddelika 8 pri 8 MHz = (1us) TCCR1B |= (1 << CS11);

TIMSK |= (1 << TOIE1); //preruenie na preteenie OSCCAL = 0xA5; // nastavenie kalibr. bajtu interneho RC oscilatora sei(); // povol globalne preruenia while(1); }

Frekvenciu fzovo a frekvenne korektnej PWM meme uri na zklade nasledujceho vzahu: return 0;

Vstupn priebeh: , kde fclk je frekvencia hodn, N je preddelika a TOP je max. hodnota taa. Prklady Prklad .1: Generujte PWM signl pomocou reimu 3 (fzovo aj frekvenne korektn PWM) Jedn sa o 10-bitov PWM, take TOP hodnota bude 1024. Obsah porovnvacieho registra OCR1A nesmie presiahnu teda tto hodnotu. Pri frekvenci hodn a preddelike 8 bude TCNT1 inkrementovan za as 1us. Preteenie nastane za as 2048us, pretoe z max. hodnoty neprejde ta/asova do hodnoty 0 ale de-

Dodatok

Na zver dodm ,e ATmega8 doke generova PWM aj pomocou taa/asovaa 2, princp ostva rovnak avak nastavenie registrov je odlin.

32

PRCA SO ZNAKOVM LCD DISPLEJOM

Prca so znakovm LCD displ.


Pripojenie znakovho LCD displeja k MCU
Pin .6 (E) dtovy pin (Enable), zapnutie/vypnutie LCD displeja Znakov LCD displej obsahuje obvod (nazvan radi), ktor nm uahuje prcu s displejom. Obsahuje Piny . 7-14 (DB0-DB7) obojsmern dtov linka komunikan rozhranie, preddefinovan sadu znakov at. Nm potom sta posla cez komunikan rozhra- Pin . 15 Anda (+) podsvietenia LCD displeja nie niekoko prkazov na vypsanie znakov na displej. Pin . 16 Katda (-) podsvietenia LCD displeja Najastejie pouvanm radiom na znakov LCD displeje sa stal legendrny HD47780. Prca s displejom pomocou MCU Nakoko na internete existuje mnostvo kninc pre Schma zapojenia LCD displeja: prcu zo znakovmi displejmi, teda jeho ovldanie Dtov linky meme zapoji na ktorkovek PORT ovea jednoduchie ako by ste mono akali :) mikropotaa. Prepojenie potom definujeme v hla- Kninica ktor pouvam obsahuje dva sbory lcd.c a vikovom sbore kninice. lcd.h, ktor obsahuje funkcie na jednoduch ovldanie LCD displeja. Tieto sbory si mete stiahnu s nasledovnho linku: http://svetelektro.com/Pictures/Microprocesory/ avr/6/lcd.zip Pre vyuvanie tejto kninice v naom projekte treba spravi nasledovn: 1. Vytvori nov projekt (vi 1. kapitola) alebo otvori existujci projekt v AVR studio 4. 2. Do adresra kde sa nachdza n projekt skoprujeme sbory lcd.c a lcd.h 3. Tieto sbory je treba prida aj do nho projektu v AVR studio 4. Klikneme pravm tlaidlom na Obr 7.0 - Pripojenie displeja s radiom HD47780 ku poloku 'Source Files" a zvolme monos "Add MCU existing source files" a vyberieme sbor lcd.c. Obdobnm spsobom pridme aj hlavikov sbor Popis pinov displeja: lcd.h poloku "Header files" Pin .1 (VSS) GND Pin .2 (VDD) napjacie naptie v rozsahu 3,3 a 5V Pin .3 (VO) na tento pin pripjame trimer ktorm nastavujeme kontrast displeja. Pin .4 (RS) dtov pin (Register select), uruje i chceme cez dtov vodie prena intrukcie alebo dta Pin .5 (R/W) nastavujeme nm i chceme do Obr 7.1 - Pridanie sborov do projektu displeja zapisova alebo z neho ta. Zvyajne vyuvame len zpis, preto tento pin pripjame na 4. Nakoniec pridme hlavikov sbor do hlavnho GND. programu pomocou direktvy #include "lcd.h"

33

PRCA SO ZNAKOVM LCD DISPLEJOM


Nastavenie hlavikovho sboru lcd.h: Sli na nastavenie prce s LCD displejom. V mnohch prpadoch sta nastavi len poet znakov na riadok, poet riadkov a rozloenie pinov na ovldanie displeja. Pokia mte LCD displej 2x16 znakov a je zapojen poda hore uvedenej schmy, netreba v tomto sbore ni nastavova. Prklady Prklad .1 - prv text: Vpis textu na displej do dvoch riadkov Zdrojov kd:
#include <avr/io.h> #include "lcd.h" int main(){ return 0; } lcd_init(LCD_DISP_ON); // inicializacia displeja lcd_puts("Hello World\nSvetelektro.com"); //vypis text

Obr 7.2 - Nastavenie hlavikovho sboru lcd.h

Obr 7.3 - Nastavenie hlavikovho sboru lcd.h Kninica obsahuje nasledovn funkcie na prcu s LCD displejom: lcd_init(uint8_t dispAttr); - inicializcia LCD displeja, ako parameter funkcie mono zvoli nasledovn monosti: LCD_DISP_OFF - displej vypnut LCD_DISP_ON displej zapnut, kurzor vypnut LCD_DISP_ON_CURSOR displej zapnut, kurzor zapnut LCD_DISP_ON_CURSOR_BLINK displej zapnut, kurzor blik lcd_clrscr(void); - vymazanie LCD displeja lcd_home(void); - nastav kurzor na domovsk pozciu lcd_gotoxy(uint8_t x, uint8_t y); - nastavenie kurzora na zadan pozciu x a y displeja (indexovanie je od 0) lcd_putc(char c); - zobraz znak lcd_puts(const char *s); - zobraz reazec znakov lcd_puts_p(const char *progmem_s); - zobraz reazec znakov umiesten vo Flash pamti lcd_command(uint8_t cmd); - vyle prkaz na displej

Obr 7.4 - Ukka z prkladu . 1 Prklad .2 vyuitie funkcie gotoxy(x,y); Pomocou funkcie gotoxy(x,y); posu text na vhodn pozciu Zdrojov kd
#include <avr/io.h> #include "lcd.h" int main(){ return 0; } lcd_init(LCD_DISP_ON); //inicializacia displeja lcd_gotoxy(4,0); // chod na poziciu x=4, y=0 lcd_puts("Posunute"); // vypis text

34

PRCA SO ZNAKOVM LCD DISPLEJOM


Funkcia sprintf m nasledovne parametre sprintf ( char * str, const char * format, ... ); , funguje podobne ako printf, s tm rozdieom e vsledok zape do textovho reazca. char * str Ukazovate na pole znakov const char * format zpis reazca Problm nastane pokia chceme vypsa desatinn slo na displej pomocou funkcie sprintf(); Preto treba upravi parametre projektu, aby sme s nimi mohli pracova. V menu teda vyberieme: Project -> Configuration Options prejdeme na zloku Libraries kde pridme sbory libprintf_flt.a a libm.a

Obr 7.5 - Ukka z prkladu . 2 Vpis sel na displej: Pokia chceme zobrazi slo na displeji, musme ho skonvertova na reazec znakov. Pokia ide o cel sla vyuvame funkciu itoa() alebo sprintf(). Funkcia itoa ma nasledovn parametre itoa(int value, char *string, int radix); int value premenn typu int v ktorej sa nachdza slo ktor chceme skonvertova char *string ukazovate na reazec znakov do ktorho sa zape nae slo int radix zklad sla, urme v akej sstave m by vsledn slo Prklad .1 prca s slami pomocou funkcie itoa();
#include <avr/io.h> #include <stdlib.h> #include "lcd.h" int main(){ char text[16]; //pole znakov pre vypis na displej int cele = 1234;

Obr 7.6 - Pridanie kninc na prcu s desatinnmi slami Potom prejdeme do zloky "Custom options" , kde zvolme "Linker Options", a pridme prepnae -Wl,-u,vfprintf

lcd_init(LCD_DISP_ON); // inicializacia displeja // konvertuj cele cislo na znaky pri zaklade 10 itoa(cele,text,10); return 0; } lcd_puts(text); // vypis znaky na displej

35

PRCA SO ZNAKOVM LCD DISPLEJOM

Obr 7.8 - Ukka z prkladu . 2 Obr 7.7 - pridanie prepnaa na prcu s desatinnmi slami Po tejto operci mete pracova s desatinnmi slami typu float alebo double. Prklad .2 prca s desatinnmi slami pomocou funkcie sprintf() Zdrojov kd #include <avr/io.h>
#include <stdlib.h> #include <stdio.h> #include "lcd.h" int main(){ float pi = 3.14; int cele = 1234; char text[32]; //pole znakov pre vypis na displej lcd_init(LCD_DISP_ON); // inicializacia displeja

sprintf(text,"Cele cislo:%d\nDesatinne:%.2f ",cele,pi); lcd_puts(text); while(1); return 0; }

36

AD PREVODNKY

AD prevodnky
Analgovo-digitlny prevodnk alebo analgovo- s- Chybu prevodnka mono vyjadri v zlokch: licov prevodnk (ADC z anglickho Analog-to-Di- Chyba ofsetu (Offset error): je rovnak pre cel rozsah gital Converter) je elektronick zariadenie na prevod AD prevodnka, vznik posunutm nuly. analgovho signlu na digitlny signl. Prevod analgovho signlu na digitlny je vyuvan pomerne asto, kee signly sa skoro vlune analyzuj a spracovvaj slicovo. Prkladom konkrtnych aplikci analgovo-digitlneho prevodu s napr. meranie naptia, prdu, neelektrickch velin...

Zkladn parametre AD prevodnkov

Rozliovacia schopnos (Resolution): Obr 8.0 - Chyba offsetu AD prevodnka Je dan potom rozlitench rovn analgovho signlu. Mikrokontrolr ATmega8 m 10-bitov AD Chyba zosilnenia(Gain Error): Zvis od hodnoty prevodnk to znamen ,e jeho rozliovacia schopnos analgovho signlu. je 2^10 = 1024 rovn. Rozsah prevodnka: Je dan minimlnou a maximlnou hodnotou analgovej veliiny. Oznauje sa zva symbolom FS (Full Scale). Rozsah AD prevodnka u Atmega8 me by 0-Vcc. Krok kvantovania: Alebo citlivos AD prevodnka je najmenia rozliten vekos analgovej veliiny, tj. rozdiel susednch hodnt analgovej veliiny pri ktorch sa zmen vstupn digitlny daj. Oznauje sa ako LSB (Least Significant Bit) Chyba kvantovania: Chyba kvantovania predstavuje teoreticky maximlny rozdiel medzi hodnotou analgovej veliiny a jej maximlnou hodnotou zodpovedajcou danmu digitlnemu daju. Obyajne je to LSB Rchlos prevodu (Conversion Time): Rchlos prevodu je dan potom prevodov, ktor je schopn prevodnk uskutoni za jednotku asu, ale- Obr 8.2 - Chyba nelinrnosti AD prevodnka bo asom za ktor vykon prevodnk jeden prevod. U ATmega8 me by as prevodu v zvislosti od preddeliky a zdroja hodn v rozsahu 13-260us. Obr 8.1 - Chyba zosilnenia AD prevodnka Chyba nelinrnosti (Non linearity error): Je spsoben vtedy, ak zvislos vstupnho analgovho signlu nie je linerne zvisl od vstupnho kdovho slova.

37

AD PREVODNKY AD prevodnk mikrokontrolra ATmega8


Popis registrov AD prevodnka (vi strana 199 v datasheete obvodu ATmega8) Register ADMUX (ADC multiplexer selection register) :

Zkladn vlastnosti: 10-bitov rozlenie Absoltna presnos +-2 LSB Integrlna nelinearita 0.5 LSB as prevodu 65 260us (do 15 ksps) 6 vstupnch kanlov 2 alie vstupn kanly, len v puzdrch TQFP a MLF Vstupn rozsah 0 a Vcc Voliten 2,56V intern referenn naptie Opakovac, prpadne jednorazov reim Preruenie po skonen prevodu Spiaci reim, potlaenie umu
IRQ ADC prevod skonen dajov zbernica

Obr 8.4 - Register ADMUX Bity REFS1 a REFS0 - vber zdroja referennho naptia pre A/D prevodnk

Obr 8.5 - Voba referencie AD prevodnka


15

ADIE

ADIF

AREF AVcc
REFS1 REFS0

ADC multiplexor (ADMUX)


ADLAR MUX0 MUX1 MUX2 MUX3

ADC riadiacia stavov register (ADCSRA)


ADPS2 ADPS1 ADPS0 ADEN ADSC ADFR ADIF

ADC datov register (ADCH/ ADCL)


(90)

Uref

Int.ref.
GND BREF ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADC1 ADC0

10-bit DAC

riadenie

+ MUX

S-H kompartor

Vstup ADC MUX

(0, 0) Referenn naptie je priveden na pin AREF (povolen rozsah 2,0V - AVcc), intern referencia je vypnut (0,1) Referenciu predstavuje napjacie naptie na pine AVcc (vntorne sa piny AVcc a AREF prepoja). Na pin AREF pripjame blokovac kondenztor (1,0) rezervovan (1,1) Vntorn referencia 2,56V s pripojenm blokovacm kondenztorom na AREF pin. Pozor, presnos vntornej referencie m toleranciu a +-10%.

Obr 8.3 - Blokov schma AD prevodnka

ADLAR - zarovnanie vsledku, ADC Left Adjust Result Vpoet vstupnej digitlnej hodnoty pre AD pre- Pomocou obsahu bitu ADLAR je mon zvoli zarovvodnk: nanie vsledku prevodu v registroch ADCL a ADCH. ADC = (Vin * 2^n)/Vref Ak hodnota bitu ADLAR je log.1, potom vsledok (Vref - naptie referencie, Vin - vstupn naptie) prevodu je zarovnan nasledovne: hornch 8 bitov v Pri Vin = 2,5V, Vref = 5V a rozlen AD prevodnka registri ADCH a dva spodn bity v registri ADCL, 10-bitov bude teda vstupn digitlna hodnota: bity 7 a 6. V opanom prpade je spodnch 8 bitov ADC = (2,5V * 2^10)/5 = 512. vsledku v registri ADCL a dva najvyie bity v registri ADCH, v bitoch 0 a 1. Vyuva sa to vtedy, ak nm Citlivos AD prevodnka vypotame ako: dostauje rozsah AD prevodnka iba na 8 bitov, teda v LSB = Vref/(2^n) tom prpade zvolme ADLAR=1 a pretame len vrch(Vref naptie referencie, n rozlenie AD prevod.) n register ADCH. Pri Vref= 5V a rozlen AD prevodnka 10-bitov bude teda citlivos: LSB = 5/(2^10) = 4,9mV/bit

38

AD PREVODNKY
ADLAR = 0 - ADSC: tart prevodu, Start Conversion ADC Ak prevodnk pracuje v jednorazovom reime pred kadm prevodom mus by do bitu ADCS zapsan log.1. Po ukonen prevodu sa pred vynulovanm bitu ADCS vsledok prevodu zape do dajovch registrov ADC.

Obr 8.6 - Nastavenie ADLAR = 0 ADLAR = 1

- ADFR: vber opakovacieho reimu, ADC free run select Obr 8.7 - Nastavenie ADLAR = 1 Ak nastavme bit ADFR na log.1 prevodnk pracuje v opakovacom reime. Vynulovanm bitu ADFR ukon- Bity MUX3, MUX2, MUX1, MUX0 Vber kanla, me opakovac reim. Analog Channel Selection Hodnota uvedench bitov uruje, ktor z analgovch ADIF: prznak preruenia, ADC interrupt flag vstupnch kanlov je pripojen na vstup A/D prevod- Tento bit je nastaven na log.1 vtedy, ke prevod nka. skonil a dajov registre ADCH a ADCL s naplnen novm vsledkom. ADIE: povolenie preruenia,ADC interrupt enable Ak bit ADIE je nastaven na log. 1 a je povolen globlne preruenie vykon sa preruenie na akciu "dokonenie ADC prevodu". - ADPS2 ADPS0: nastavenie preddeliky, ADC prescaler select bits Uveden bity uruj deliaci pomer medzi hodinovou frekvenciou (clkCPU) a frekvenciou vstupnch hodinovch impulzov do ADC. Pre dosiahnutie presnosti vsledku na 10 bitov mus by frekvencia AD prevodnka 50-200kHz. Obr 8.8 - Vber vstupnho kanla Register ADCSRA (ADC Control and Status Register A) riadiaci a stavov register

Obr 8.9 - Register ADCSRA

Obr 8.10 - Voba preddeliky AD prevodnka

Registre ADCH a ADCL: - ADEN: povolenie innosti ADC, ADC enable - Vstupn registre, v ktorch sa nachdza vsledok Zpisom log.1 do bitu ADEN sa povouje innos pre- AD prevodu. Tieto dva registre spolone tvoria jeden vodnka. Nulovanm uvedenho bitu sa prevodnk 16-bitov register ADC. vypna. Ak bit ADEN vynulujeme v priebehu prevodu, potom prevodnk dokon prebiehajci prevod a vypne sa.

39

AD PREVODNKY Techniky na potlaenie umu:


Prklady: Prklad .1: vyuitie preruenia na akciu skonenia AD prevodu V prvom prpade nastavme AD prevodnk na free running mode s vyvolanm preruenia pri skonen prevodu. V preruen zapeme obsah registra ADC do globlnej premennej adc. V nekonenej sluke hlavnho programu prepotavame hodnotu adc na naptie a tieto dve hodnoty zobrazujeme na displeji. Zdrojov kd:
#include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include <stdlib.h> #include <stdio.h> #include "lcd.h" //globalna premenna adc volatile unsigned int adc; // preruenie na akciu skonenia AD prevodu ISR(ADC_vect){ adc=ADC; // zapis vysledok prevodu } int main(){ char text[32]; long u; ADMUX |= (1 << REFS0); //referencia 5V

Digitlne obvody vo vntri mikrokontrolra generuj elektromagnetick um, ktor me ma negatvny vplyv na presnos analgovch meran. Ak je presnos merania kritick, vplyv umu me by iastone redukovan nasledovnm postupom: 1. Analgov as mikrokontrolra a vetky analgov komponenty v aplikcii by mali ma pri nvrhu PCB vlastn analgov zem. Analgov zem je s digitlnou spojen na PCB v jednom bode. 2. Minimalizujme dku analgovch signlovch vodiov. Analgov signlov vodie umiestnime tak, aby prechdzali nad analgovou zemniacou plochou. Vedieme ich o najalej od digitlnych vodiov s rchlo sa meniacimi signlmi. 3. AVCC vvod spojme s napjanm digitlnej asti VCC cez filtran LC lnok. 4. Pouijeme funkciu potlaenia umu CPU. 5. Ak s piny 0-3 portu C s pouit ako digitlne vstupy nemenme ich pokia prebieha prevod, pretoe napjanie tchto pinov je spolon s napjanm AD prevodnka.

Prca s AD prevodnkom
Schma zapojenia ATmega8

// zapnutie AD prevodnika, Free runing, // preddelicka 128 pri frek. hodin 8MHz ADCSRA |= (1 << ADEN) | (1 << ADSC) | (1 << ADFR) | (1 << ADIE) | (1 <<ADPS2) | (1 <<ADPS1) | (1 <<ADPS0);

Obr 8.11 - Schma zapojenia MCU na prcu s AD prevodnkom Na Obr 8.11 je tandardn zapojenie mikrokontrolra pre prcu s AD prevodnkom. Tto schmu budeme vyuva v nasledovnch prkladoch. LC len na pine AVCC sli na potlaenie umu, pre n prpad sta pripoji pin AVCC priamo na VCC napjanie. o sa tka displeja, mono ho pripoji na ubovon piny mikrokontrolra okrem PORTC, pretoe ten budeme vyuva ako vstup pre AD prevodnk. Piny treba nsledne definova v hlavikovom sbore lcd.h (vi predchdzajca kapitola).

sei(); //povol globalne prerusenia

lcd_init(LCD_DISP_ON); while(1){ // vypocet napatia v mV u = ((long)adc*5000/1024); sprintf(text,"ADC:%d \nU:%ldmV",adc,u); lcd_clrscr(); lcd_gotoxy(0,0); lcd_puts(text); _delay_ms(500); } }

40

AD PREVODNKY
Prklad . 2: Vytvorenie funkcie na tanie kanla s AD prevodnka Vytvoren funkcia: unsigned int Read_ADC(unsigned char channel); m parameter channel, kde napeme slo kanla, ktor chceme poui ako vstup pre AD prevodnk (vi Obr 8.8 - ADMUX). Nvratovou hodnotou tejto funkcie je vsledok AD prevodu. Na zistenie skonenia prevodu vyuvame prznak na bite ADSC v registri ADCSRA. Tto hodnotu v nekonenej sluke spolu s prepotanm naptm zobrazujeme na displeji. Pozn: Pokia by sme chceli zobrazova na displeji naptie ako desatinn slo, treba nastavi kompiler, aby prcu s desatinnmi slami umooval vi predol kapitola Zdrojov kd:
#include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include <stdlib.h> #include <stdio.h> #include "lcd.h" unsigned int Read_ADC(unsigned char channel){ } // vloz cislo kanala, vymaskuj nepouzite bity ADMUX &= 0xF0; ADMUX |= channel & 0x0F; // start conversion ADCSRA |= (1 << ADSC); // cakaj na priznak skoncenia konverzie while(ADCSRA & (1 << ADSC)); // navratova hodnota - vysledok ad prevodu return ADC; sei(); // povol globalne prerusenia

lcd_init(LCD_DISP_ON); while(1){ adc = Read_ADC(0); // vypocet napatia v mV u = ((long)adc*5000/1024); sprintf(text,"ADC:%d \nU:%dmV",adc,u); lcd_clrscr(); lcd_gotoxy(0,0); lcd_puts(text); _delay_ms(500); } }

Youtube video: Skka AD prevodnka

int main(){ char text[32]; unsigned int u,adc; ADMUX |= (1 << REFS0); //referencia 5V

// povolenie AD prevodnika, Interrupt flag //128 pri frekvencii hodin 8MHz ADCSRA |= (1 << ADEN) | (1 << ADIF) | (1 <<ADPS2) | (1 <<ADPS1) | (1 <<ADPS0);

41

ROZHRANIE USART

Rozhranie USART
V nasledujcich kapitolch bud vysvetlen tandar- Parity bit sli ako kontroln suma pri prenose dy uren na obojsmern prenos dt. V tejto kapitodt le sa bliie pozrieme na univerzlnu asynchrnnu/ Stop bity (1 alebo 2) ukonenie prenosu, stav synchrnnu sriov linku alebo skrtene USART. linky je v log. 1 USART patr k zkladnej vbave takmer vetkch mi- Stav neinnosti ak sa iadne dta po linke neokropotaov rady AVR, to znamen e je hardvrovo dosielaj ostva v log. 1. implementovan ako perifria mikropotaa.

Popis asynchrnnej/synchrnnej sriovej linky

Sriov linka je znma u mnoho rokov. Na potai sa vyskytuje pod tandardom RS-232 a je vyveden z potaa pomocou DB-9 konektora. Rozhranie RS-232 vak nememe priamo pripoji s rozhranm Obr 10.0 - Dtov rmec UART USART na mikropotai, pretoe RS-232 ma odline definovan napov rovne logickch hodnt. V dnenej dobe sa u oraz menej vyskytuje sriov lin- Blokov schma USART ka na potaoch i notebookoch, pretoe je nahrdzan rozhranm USB. Na to aby sme mohli prena dta z mikropotaa cez USART do potaa potrebujeme prevodnk na rozhranie RS-232 alebo USB. Nvod na jednoduch prevodnk na USB njdete v tomto lnku: http://svetelektro.com/clanky/jednoduchy-prevodnik-z-usb-na-uart-a-rs232-503.html Dta z mikropotaa mono teda prena bu asynchrnne alebo synchrnne. Rozdiel je v tom, e pri synchrnnom prenose potrebujeme al vodi, ktor bude synchronizova prenos dt hodinovm signlom. Pri synchrnnom prenose meme dosahova vyie rchlosti v porovnan s asynchrnnym. Avak asynchrnny prenos dt sa vyuva ovea astejie, najm z toho dvodu ,e rozhranie RS-232 na potai doke komunikova len asynchrnne. Pri asynchrnnom prenose je dtov rmec definovaObr 10.1 - Blokov schma perifrie USART MCU n nasledovne: tart bit zaiatok prenosu, sli na zosynchronizovanie vysielaa a prjimaa, stav linky je v log. 0 Dtove bity me ich by 5 a 9, zana sa bitom najniej vhy (LSB)

42

ROZHRANIE USART
Jednotka USART pozostva z troch zkladnch blokov. S to: genertor hodinovho signlu, vysiela a prijma. Genertor hodinovho signlu je zloen z genertora prenosovej rchlosti a synchronizanch obvodov pre extern vstup hodinovho signlu, ktor je vyuvan v prpade, ak jednotka pracuje v synchrnnom "SLAVE" reime. Vvod XCK sa vyuva len ak jednotka pracuje v synchrnnom prenosovom reime. Vysiela je zloen z vyrovnvacieho registra, sriovho posuvnho registra, genertora parity a riadiacich obvodov pre prenos rznych formtov dajov. Vyrovnvac register pre zpis dovouje vysiela daje bez oneskorenia medzi jednotlivmi iastkovmi prenosmi. Prijma je vaka jednotkm obnovy dajov a hodinovho signlu najzloitejou asou modulu USART. Jednotky obnovy sa vyuvaj pri asynchrnnom prjme dt. Prijma obsahuje tie obvod na kontrolu parity, riadiacu jednotku, posuvn register a dvojrovov prijmac vyrovnvac register (UDR). Prijma podporuje vetky formty prenosu dt vysielaa a me detekova chybu prjmu, preteenie dajov a chybu parity. Riadiaci a stavov register A, UCSRA - USART Control and Status Register A: - Nastavuje a informuje o stave USART

Obr 10.3 - Register USCRA Bit 7 RXC: USART Recieve Complete, Ukonen prjem znaku Tento prznakov bit je nastaven na hodnotu log.1, ak v prijmac zsobnk obsahuje nepretan dta. Bit RXC je vynulovan, ak prijmac zsobnk je przdny. Ak sa zake innos prijmaa, potom sa vynuluje zsobnk a bit RXC bude obsahova hodnotu log.0. Prznakov bit RXC me by vyuit na generovanie preruenia. Bit 6 TXC: USART Transmit Complete, ukonen vysielanie znaku Tento prznakov bit sa nastav na hodnotu log.1, ke rmec vloen do vysielacieho posuvnho registra je kompletne vyslan a nov daje nie s zapsan do vysielacieho vyrovnvacieho registra (UDR). TXC prznak sa automaticky vynuluje, ke sa vykon prslun obsluha preruenia, alebo zpisom log.1 do tejto V/V lokcie. Prznak TXC me by vyuit na generovanie odpovedajceho preruenia.

Popis registrov

Modul USART mikropotaa Atmega8 obsahuje tyri 8-bitov registre: Bit 5 UDRE: USART Data Register Empty, dajov dajov register UDR, register przdny riadiaci a stavov register A, UCSRA Prznakov bit UDRE indikuje, e vysielac vyrov riadiaci a stavov register B, UCSRB nvac register je pripraven prija nov dta. Ak riadiaci a stavov register C, UCSRC bit UDRE m hodnotu log.1 vyrovnvac register je przdny a pripraven na zpis novho znaku. Prznak Jeden 16-bitov register: UDRE me by vyuit na generovanie odpovedaj register prenosovej rchlosti UBRR. ceho preruenia. dajov register UDR: Bit 4 FE: Frame Error, chyba rmca - Sli na ukladanie prijatch dt cez USART a taktie Tento bit sa nastav na hodnotu log.1, ak znak v prina zpis dt ,ktor bud cez USART jmacom vyrovnvacom registri obsahoval chybu rmca (prv stop bit prijatho znaku bol rovn log.0). Hodnota bitu FE je platn pokia sa nepreta obsah prijmacieho vyrovnvacieho registra UDR. Bit FE je Obr 10.2 - Register UDR rovn nule, ak stop bit prijatho rmca m hodnotu jedna. Zpisom do registra UCSRA sa uveden bit vynuluje.

43

ROZHRANIE USART
ak bit RXCIE obsahuje hodnotu log.1, je globlne povolen obsluha preruen (bit I v SREG m hodnotu log.1) a sasne sa bit RXC v registri UCSRA nastav na hodnotu log.1.

Bit 3 DOR: Data OverRun, preteenie dt Tento bit sa nastav na hodnotu log.1, ak djde k preteeniu pri prjme dt. Preteenie je charakterizovan nasledovnmi podmienkami: Prijmac zsobnk je pln-(dva znaky), nov znak je v prijmacom posuvnom registri a je prijat al tart bit. Hodnota bitu DOR je platn pokia sa nepreta obsah prijmacieho vyrovnvacieho registra UDR. Zpisom do registra UCSRA sa uveden bit vynuluje.

Bit 6 TXCIE: TX Complete Interrupt Enable, povolenie preruenia od TXC Zpisom log.1 do bitu TXCIE povoujeme preruenie od prznaku TXC. Preruenie TXC bude generovan, ak bit TXCIE obsahuje hodnotu log.1, je globlne povolen obsluha preruen (bit I v SREG m hodnotu log.1) a sasne sa bit TXC v registri UCSRA nastav Bit 2 PE: Parity Error, chyba parity Bit PE sa nastav na hodnotu log.1, ak znak v prijma- na hodnotu log.1. com vyrovnvacom registri obsahoval chybu parity a Bit 5 UDRIE: USART Data Register Empty Interkontrola parity bola povolen (UPM1=1). Hodnota rupt Enable, povolenie preruenia od UDRE bitu PE je platn, pokia sa nepreta obsah prijmaci- Zpisom log.1 do bitu UDRIE sa povol preruenie od eho vyrovnvacieho registra UDR. Zpisom do regis- prznaku UDRE. Preruenie UDRE bude generovan, tra UCSRA sa uveden bit vynuluje. ak bit UDRIE obsahuje hodnotu log.1, je globlne poBit 1 U2X: Double the USART Transmission speed, dvojnsobn prenosov rchlos Bit U2X m vznam len pri asynchrnnom prenose. Ak je zvolen synchrnny prenos, do bitu U2X zapeme hodnotu log.0. Pri asynchrnnej komunikcii sa zpisom logickej jednotky do bitu U2X prenosov rchlos zdvojnsob. Bit 0 MPCM: Multi-processor Communication Mode Pomocou bitu MPCM povoujeme reim multiprocesorovej komunikcie. Ke bit MPCM obsahuje log.1, potom vetky prijman rmce, ktor neobsahuj informciu o adrese sa prijmaom USART ignoruj. Poznamenajme, e hodnota bitu MPCM nem vplyv na innos vysielaa modulu USART. volen obsluha preruen (bit I v SREG m hodnotu log.1) a sasne sa bit UDRE v registri UCSRA nastav na hodnotu log.1. Bit 4 RXEN: Receiver Enable, povolenie innosti prijmaa Zpis log.1 do bitu RXEN sa povol innos prijmaa jednotky USART. Reim V/V vvodu RxD sa nastav na vstup do prijmaa USART. Ak sa zake innos prijmaa (RXEN = 0 ), potom sa zni obsah prijmacieho zsobnka a prznakov FE, DOR a PE.

Bit 3 TXEN: Transmitter Enable, povolenie innosti vysielaa Zpis log.1 do bitu TXEN povoujeme innos vysielaa jednotky USART. Aktulny reim V/V vvodu TxD sa nastav na vstup z vysielaa USART. Ak sa zake innos prijmaa (TXEN = 0 ), potom sa vyRiadiaci a stavov register B, UCSRB - USART Cont- l vetky daje z posuvnho vysielacieho registra a z rol and Status Register B vyrovnvacieho registra, zake sa innos vysielaa a vvod TxD sa vrti do pvodnho reimu. Obr 10.4 - Register UCSRB Bit 2 UCSZ2: Character Size, dka znaku Bit UCSZ2 spolu s bitmi UCSZ1:0 v registri UCSRC uruje poet dajovch bitov prenanho znaku.

Bit 7 RXCIE: RX Complete Interrupt Enable, povolenie preruenia od RXC Bit 1 RXB8: Receive Data Bit 8, prijat dajov bit 8 Zpisom log.1 do bitu RXCIE povoujeme preruenie Ak je nastaven dka prenanch znakov na dev od prznaku RXC. Preruenie RXC bude generovan, bitov, potom v bite RXB8 je uchovan hodnota prija-

44

ROZHRANIE USART
tho deviateho dajovho bitu. Jeho hodnota mus by Bit 3 USBS: Stop Bit Selct, vber stop bitu pretan pred tanm obsahu registra UDR. Pomocou bitu USBS sa vol poet stop bitov, ktor s vloen do vysielanho rmca. Prijma modulu Bit 0 TXB8: Transmit Data Bit 8, vysielan dajov USART ignoruje nastavenie bitu USBS. Ak bit USBS bit 8 m hodnotu nula, potom vysielan rmec obsahuje Ak je nastaven dka prenanch znakov na dev bijeden stop bit. Ak bit USBS m hodnotu jedna, potom tov, potom TXB8 reprezentuje deviaty vysielan davysielan rmec bude obsahova dva stop bity. jov bit. Deviaty dajov bit mus by zapsan pred zpisom spodnch smych bitov do registra UDR. Bit 2:1 UCSZ1:0: Character Size, dka znaku Riadiaci a stavov register C, UCSRC - USART ContPomocou bitov UCSZ1:0 a bitu UCSZ2 v registri UCrol and Status Register C SRB je mon nastavi poet dtovch bitov (dku znaku) vo vysielanom a prijmanom rmci. Obr 10.5 - Register UCSRC Bit 7 URSEL: Register Select, vber registra Na zklade hodnoty bitu URSEL je mon voli medzi prstupom k registru UCSRC, alebo registru UBRRH. Pri tan UCSRC je hodnota tohto bitu log.1. Ak zapisujeme do registra UCSRC mus URSEL obsahova hodnotu log.1. UCSZ2 UCSZ1 UCSZ0 Dka znaku 0 0 0 5 bitov 0 0 1 6 bitov 0 1 0 7 bitov 0 1 1 8 bitov 1 0 0 Nevyuit 1 0 1 Nevyuit 1 1 0 Nevyuit 1 1 1 9 bitov Tab 10.1 - Nastavenie dky dtovej asti rmca

Bit 6 UMSEL: USART Mode Select, vber reimu USART Pomocou bitu UMSEL volme reim innosti jednotky USART. Ak bit UMSEL m hodnotu nula, potom USART pracuje v asynchrnnom prenosovom rei- Bit 0 UCPOL: Clock Polarity, polarita hodinovch me. Ak bit UMSEL m hodnotu jedna, potom USART impulzov pracuje v synchrnnom prenosovom reime. Bit UCPOL je vyuit len v prpade synchrnneho prenosovho reimu. Ak je pouvan asynchrnny Bit 5:4 UPM1:0: Parity Mode, reim parity Tieto bity povouj a nastavuj typ generovania a reim do bitu UCPOL zapisujeme nulu. Pomocou kontroly parity. Ak je generovanie a kontrola parity bitu UCPOL definujeme vzah medzi hodinovm sigpovolen, potom vysiela bude v kadom rmci gene- nlom a vzorkovanm vstupnho signlu, respektve rova a vysiela paritn bit. Prijma bude na zklade okamikom zmeny vstupnho signlu. prichdzajcich dt generova hodnotu paritnho bitu a porovnva ho s prichdzajcim paritnm bitom v UCPOL Zmena vysielanch Vzorkovanie prijmadt,(TxD vvod) nch dt, (RxD vvod) slade s nastavenm bitu UPM0. Pri chybe parity sa Vzostupn XCK hrana Zostupn XCK hrana 0 nastav prznak PE v registri UCSRA. Zostupn XCK hrana Vzostupn XCK hrana 1 Tab 10.2 - Nastavenie synchronizanej hrany XCK UPM1 UPM0 Reim parity 0 0 iadna 0 1 Nevyuit 1 0 Prna parita 1 1 Neprna parita Tab 10.0 - Nastavenie parity

45

ROZHRANIE USART
Registre prenosovej rchlosti, UBRRL a UBRRH - uvaj extern krytlov osciltory na frekvencich USART Baud Rate Registers 1,8432 MHz, 3,6864 MHz, 7,3728 MHz, 11,0592 MHz a 14,7456MHz. Pokia pouvame vntorn RC osciltor nezabudnime nastavi register OSCCAL, ktor kalibruje RC osciltor. Nastavenie registra UBRR a odchlky pri rznych prenosovch rchlostiach v zvislosti od frekvencie hodn sa dotate v datasheete ATmega8 od strany 153. Obr 10.6 - Registre UBRRL a UBRRH Bit 15 URSEL: Register Select, vber registra Na zklade hodnoty bitu URSEL je mon voli medzi prstupom k registru UCSRC, alebo k registru UBRRH. Pri tan UBRRH je hodnota tohto bitu log.0. Ak zapisujeme do registra UBRRH mus URSEL obsahova log 0. Bity 14:12 nevyuit (rezervovan) bity Pri zpise do UBRRH musia by tieto bity rovn nule.

Praktick realizcia prenosu dt cez UART

Zapojenie mikropotaa ATmega8 pre prenos dt cez UART Nato aby sme mohli otestova priloen programy musme najskr prepoji mikropota s potaom cez prevodnk. Prevodnk meme realizova bu na rozhranie RS-232 alebo USB. Zapojenie ilustruje aj nasledovn schma:

Bity 11:0 UBRR11:0: USART Baud Rate Register, register prenosovej rchlosti 12-bitov register UBRR obsahuje daj o prenosovej rchlosti jednotky USART. V registri UBRRH s obsiahnut tyri bity najvyej vhy a register UBRRL obsahuje osem bitov niej vhy. Zmena obsahu registra UBRR v priebehu prenosu spsob stratu prijmanch a vysielanch dt. Zpisom do registra UBRRL Obr 10.8 - Schma zapojenia MCU pre test USART sa bezprostredne zmen prenosov rchlos. Vpoet prenosovej rchlosti v Baudoch alebo v- Prca s kninicou na obsluhu sriovej linky poet obsahu registra UBRR na zklade prenosovej Pre jednoduchiu prcu s rozhranm UART na mikropotai ATmega8 som sa rozhodol v spoluprci s rchlosti kamartom luboss17 naprogramova kninicu na obsluhu sriovej linky. Pomocou nej si ukeme ako inicializova UART a ako prena dta. Kninicu uren pre mikropota ATmega8,16,32 si mete stiahnu z nasledovnho odkazu: http://svetelektro.com/Pictures/Microprocesory/ avr/8/uart.zip V AVR studio 4 si vytvorme nov projekt, nsledne vo vytvorenom adresri projektu pridme sbory kninice (uart.c, uart.h). Tieto sbory taktie pridme aj v naom projekte v AVR studio. Ak sa nm to podarilo meme otestova n prv program.

Obr 10.7 - Nastavenie prenosovej rchlosti USART Pozn.: ast problmy s nefunknosou UART na mikropotai bvaj spsoben odchlkou prenosovej rchlosti od iadanej, nakoko vpoet hodnoty UBRR nevde vdy cel slo. Na dosiahnutie tandartnch prenosovch rchlost bez odchlky sa po-

46

ROZHRANIE USART
Prklady Prklad .1: cyklick odosielanie reazca znakov Na zaiatku programu inicializujeme UART mikropotaa cez funkciu uart_init(); priom parametrom tejto funkcie je prenosov rchlos, ktor musme zada. tandardne sa pouva rchlos 9600 baudov, preto som tto rchlos zvolil aj ja v nasledovnom programe. Pre sprvne nastavenie prenosovej rchlosti musme ma korektne nastaven pracovn frekvenciu mikropotaa v nastaveniach projektu. Funkcia uart_init(); alej pomocou registra UCSRB povol prijma a vysiela a registrom UCSRC nastav parametre prenosu 8 dtovch bitov, 1 stop bit, parita vypnut. Po inicializovan UART-u meme zaa odosiela alebo prjima dta. Na zaiatok teda v programe odosielame v nekonenej sluke reazec znakov pomocou funkcie uart_puts(); Prklad . 2: vrtenie odoslanho reazca znakov V druhom programe budeme u posiela aj dta do mikropotaa. Dta s mikropotaom prjiman do buffera (zsobnka) s nastavenou dkou 128bajtov. Pri prjme novho znaku nastane preruenie a znaky sa ukladaj do poa priom sa ak na ukonovac znak "\r" alebo "\n". Ak ukonovac znak doraz reazec znakov sa ukon a nastav sa prznak informujci e prjem reazca znakov je ukonen. Pomocou funkcie uart_gets(); meme tieto dta vybra na spracovanie. Nvratovou hodnotou funkcie je prznak i bol prijat reazec znakov alebo nie. Do parametra funkcie zadme ukazovate na pole do ktorho sa m prijat reazec znakov uloi. Zdrojov kd:
#include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h>

Pozn. 1: na odoslanie jednho znaku sli funkcia #include "uart.h" uart_putc(); Pozn. 2.: Pri zpise reazca znakov pouvame vod- int main(){ zovky napr. uart_puts("Ahoj"); pri zpise jednho znaku apostrofy uart_putc('A'); char pole[128]; Zdrojov kd:
#include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include "uart.h" int main(){ // inicializacia uart na rychlost 9600bd uart_init(9600); while(1){ // posli retazec znakov uart_puts("Ahoj svet\n"); _delay_ms(1000); // cakaj 1s } return 0; }

// inicializacia uart na rychlost 9600bd uart_init(9600); // povol prerusenia sei(); // nekonecna slucka while(1){ //ak prisiel retazec znakov if(uart_gets(pole)){ // posli spat retazec znakov uart_puts(pole); } } return 0; }

Vstup:

Vstup:

Obr 10.9 - Vstup programu .1 v terminli

Obr 10.10 - Vstup programu .2 v terminli

47

ROZHRANIE USART
Program . 3: stavanie sel V tretom ukkovom programe si ukeme jednoduch program, ktor stava prijat sla cez sriov linku a nasp posiela vsledok stania. V nekonenom cykle sa testuje i priiel nov reazec znakov. Ak no, vykon sa funkcia zisti_cislo(); ktor prijat znak sla premen na slo. Ak slo je nenulov prita sa ku vsledku a nsledne sa vsledok pole nasp cez UART. Program pracuje len s jednocifernmi slami, ni vm vak nebrni mj ukkov program vylepi :) Zdrojov kd:
#include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include <stdio.h> #include "uart.h" unsigned char zisti_cislo(char *str){ unsigned char cislo; //zisti zo znaku cislo //len jednociferne cisla switch(str[0]){ case 0: cislo = 0;break; case 1: cislo = 1;break; case 2: cislo = 2;break; case 3: cislo = 3;break; case 4: cislo = 4;break; case 5: cislo = 5;break; case 6: cislo = 6;break; case 7: cislo = 7;break; case 8: cislo = 8;break; case 9: cislo = 9;break; default: cislo = 0; break; } return cislo; } int main(){ char pole[10],text[16]; unsigned char cislo=0,vysledok=0; // inicializacia uart na rychlost 9600bd uart_init(9600); // povol prerusenia sei(); // nekonecna slucka while(1){ //cakaj na cislo do{ // ak prislo cislo cez uart tak ho zisti if(uart_gets(pole)) cislo = zisti_cislo(pole); }while(cislo == 0); // pricitaj cislo ku vysledku vysledok += cislo; //zobraz vysledok sprintf(text,"Vysledok:%d",vysledok); // posli vysledok uart_puts(text); //nuluj premennu cislo=0; } } return 0;

Vstup:

Obr 10.11 - Vstup programu .3 v terminli

48

ROZHRANIE SPI

Rozhranie SPI
Popis rozhrania SPI (sriov perifrne roz- Priebeh komunikcie rozhrania SPI: Na zaiatku komunikcie nastav Master pin SS do hranie)
log. 0 na zariaden, s ktorm chce komunikova. Najastejie sa pouva na komunikciu mikropota Nsledne zane generova hodinov signl SCK a s ostatnmi perifriami (AD-prevodnk, EEPROM, a v tej chvli pol obe zariadenia (Master aj Sladispleje a pod.). V systme vyuvajcom rozhranie ve) svoje dta. Master cez pin MOSI, Slave cez pin SPI me by zapojench dva alebo viac obvodov, priMISO. om jeden z nich je oznaovan ako Master (riadi ko Akonhle s dta vyslan me komunikcia alej munikciu), ostatn s oznaovan ako Slave. prebieha pokia Master dodva hodinov signl a Komunikcia prebieha pomocou tyroch vodiov hodnota SS je stle v log. 0. MOSI, MISO, SCK, SS nasledovne: Master ukon komunikciu uvedenm SS do sta Dtov vstup Master obvodu MOSI (Master Out, vu log. 1. Slave In), je pripojen na vstupy MOSI vetkch Polarita a fza hodinovho signlu obvodov Slave Dtov vstup Master obvodu MISO (Master In, Vzah medzi hodinovm signlom a dtami sa uruje Slave Out), je pripojen na vstupy MISO vet- pomocou dvoch konfiguranch bitov CPOL a CPHA. Ich vznam je nasledovn: kch obvodov Slave Hodinov signl SCK, generovan Master obvo- CPOL = 0, hodnota hodinovho signlu v stave neinnosti je log. 0 dom, je pripojen na vstupy SCK vetkch obvo CPOL = 1, hodnota hodinovho signlu v stave dov Slave neinnosti je log. 1 Kad obvod Slave m vstup SS (Slave select) ale CPHA = 0, dta s snman nbenou hranou hobo oznaovan aj ako CS (Chip Select). Pokia je dinovho signlu vstup SS v neaktvnom stave (log. 1), rozhranie CPHA = 1, dta s snman dobenou hranou hoSPI danho obvodu je neaktvne a jeho vstup dinovho signlu MISO je v stave vysokej impedancie. Vstupy SS jednotlivch obvodov s samostatnmi vodimi 1) CPHA = 0 pripojen k obvodu Master. Pomocou tchto vodiov teda mono jednoducho vybera obvod, s ktorm mme v danom okamihu komunikova. Ukka komunikcie MCU s viacermi perifriami pomocou rozhrania SPI:

Obr 11.0 - Komunikcia prostrednctvom SPI

Obr 11.1 - Polarita a fza hodinovho signlu

49

ROZHRANIE SPI
CPHA = 1 Parametre: Obojsmern (Full-duplex) synchrnny prenos prostrednctvom troch vodiov. Reim "MASTER" alebo "SLAVE" Prenos zana LSB, alebo MSB Sedem programovatench prenosovch rchlost Prznak preruenia pri ukonen prenosu Nastavenie prznaku pri kolzii Aktivcia procesora z "Idle" reimu Dvojnsobn rchlos (Ck/2)

V jednoduchosti systm pozostva z dvoch posuvnch registrov (jeden pre vysielanie, druh pre prjem) a genertora hodinovho signlu. Systm SPI sa vyznauje jednoduchou vyrovnvacou pamou v smere vysielania a dvojitou pri prijman dt. To znamen, e bity, ktor s vysielan nememe zapisova do SPI dtovho registra pred tm, ne je kompletne vyslan Obr 11.2 - Polarita a fza hodinovho signlu predchdzajci bajt. Pri prjme dajov meme predchdzajci bajt ta v priebehu prjmu nasledujceho Pozn.: Sprvne nastavenie bitov CPOL a CPHA bva bajtu. Predchdzajci bajt musme preta pred tm zva uveden v datasheete obvodu s ktorm chce- ne je kompletne prijat al bajt. me komunikova. Preto si vdy overte toto nastavenie, V reime Slave riadiace obvody vzorkuj prichdzajaby ste sa vyhli prpadnm problmom. ci hodinov signl na vstupe SCK. Frekvencia hodinovho signlu SPI nesmie prekroi hodnotu fOSC/4.

Rozhranie SPI mikropotaa ATmega8

Funkcia pinu SS mikropotaa a) v Master mde: Ak je pin nastaven ako vstupn nepreber automaticky v reime Master riadenie na vodii SS. Toto riadenie mus by realizovan pomocou uvateskho programu poas komunikcie. Ak je pin SS nastaven ako vstupn v reime Master, musme ho udriava v log. 1 pokia poadujeme Master md. Pri priveden pinu SS do stavu log. 0 sa rozhranie SPI prepne do Slave modu a ak na prijatie dt. b) v Slave mde: Ak je rozhranie SPI nastaven na reim SLAVE, potom pin SS bude vdy vstupn. Pokia privedieme pin SS do stavu log. 0, aktivujeme SPI rozhranie. V opanom prpade je rozhranie SPI neaktvne a nie je mon prija iadne dta.

Obr 11.3 - Blokov schma SPI rozhrania MCU

50

ROZHRANIE SPI
Popis registrov Riadiaci register SPCR SPI control register - Riadiaci register SPCR je vyuit na riadenie innosti jednotky SPI. Bity 1, 0 SPR1, SPR0: Nastavenie genertora hodn, SPI Clock Rate Select 1 a 0 Ak SPI je v reime MASTER, potom pomocou obsahu bitov SPR1 a SPR0 je mon nastavi frekvenciu hodinovho signlu SCK. Vzah medzi signlom SCK a frekvenciou osciltora fosc je uveden v nasledujcej tabuke 11.0.

Obr 11.4 - Regisdter SPCR Bit 7 SPIE: Povolenie preruenia od SPI, SPI Interrupt Enable Ak bit SPIE obsahuje hodnotu log.1 a sasne s globlne povolen preruenia, potom pri nastaven bitu SPIF bude generovan iados o obsluhu preruenia.

SPI2X SPR1 SPR0 Frekvencia SCK 0 0 0 fosc/4 0 0 1 fosc/16 0 1 0 fosc/64 0 1 1 fosc/128 1 0 0 fosc/2 Bit 6 SPE: Povolenie innosti jednotky SPI, SPI Ena1 0 1 fosc/8 ble 1 0 fosc/32 Ak bit SPE obsahuje hodnotu log.1, potom je povole- 1 1 1 1 fosc/64 n innos jednotky SPI. Tab 11.0 - Nastavenie prenosovej rchlosti SPI Bit 5 DORD: Poradie dt, Data Order Ak bit DORD obsahuje hodnotu log.1, potom prenos Stavov register jednotky SPI SPSR dt zana od LSB (najmenej vznamnho bitu). Ak bit DORD obsahuje hodnotu log.0, potom prenos dt zana od MSB (najvznamnejieho bitu). Obr 11.5 - Register SPSR Bit 4 MSTR: Vber reimu MASTER/SLAVE, Master/Slave select Pomocou bitu MSTR volme reim jednotky SPI. Ak bit MSTR obsahuje hodnotu log.1 bude jednotka SPI v reime MASTER. V opanom prpade bude SPI v reime SLAVE. Ak je vvod /SS konfigurovan ako vstupn a je na priveden log. 0, priom je bit MSTR log.1, potom sa bit MSTR vynuluje a prznak SPIF sa nastav na hodnotu log.1. Bit 7 SPIF: Prznak preruenia od SPI, SPI Interrupt Flag Po skonen sriovho prenosu dt sa prznak SPI nastav na hodnotu log. 1. V prpade, e je povolen preruenie bude generovan aj iados o obsluhu preruenia. Aj v prpade, ak na vvod /SS, ktor je v reime MASTER konfigurovan ako vstup privedieme log. 0, sa nastav prznak SPIF. Prznakov bit SPIF je nulovan automaticky po skonen zodpovedajcej obsluBit 3 CPOL: Nastavenie polarity hodinovho sign- hy preruenia. Prznakov bit SPIF je tie nulovan tanm SPI stavovho registra, prpadne prstupom k lu, Clock Polarity Ak je bit CPOL nastaven na hodnotu log. 1 bude ho- SPI dtovmu registru. dinov signl SCK v stave neinnosti v log. 1 v opaBit 6 WCOL: Prznak kolzie pri zpise, Write Collinom prpade v log. 0. (vi obr. 11.1 a 11.2) sion Flag Bit 2 CPHA: Nastavenie fzy hodinovho signlu, Bit WCOL sa nastav na hodnotu log.1 ak do SPI dtovho registra sa zapisuje poas prenosu dt. Bit WCOL Clock Phase Ak je bit nastaven do log. 1, bud dta vzorkovan je nulovan tanm SPI stavovho registra, prpadne na doben hranu hodinovho signlu. V opanom prstupom do SPI dtovho registra. prpade na nben hranu. (vi obr. 11.1 a 11.2)

51

ROZHRANIE SPI
Bity 5. . .1: Nevyuit bity Kninicu uren pre mikropota ATmega8,16,32 si mete stiahnu tu: Bit 0 SPI2X: Bit dvojnsobnej rchlosti SPI, Double http://svetelektro.com/Pictures/Microprocesory/ SPI Speed Bit avr/9/clanok_spi.zip Ke bit SPI2X m hodnotu log.1, potom v prpade, ak jednotka SPI je v reime MASTER bude frekvencia V AVR studio 4 vytvorme nov projekt, nsledne vo hodinovho signlu SCK dvojnsobn. vytvorenom adresri projektu pridme sbory kninice (spi.c, spi.h). Tieto sbory taktie pridme aj do dajov register SPI SPDR nho projektu v AVR studio. Ak sa nm to podarilo meme otestova n prv program. Pre sprvnu innos nezabudnite sprvne nastavi bity CPOL a CPHA. Tieto bity mono nastavi vo funkci InitSPI(void), konkrtne zpisom do registra SPCR dajov register SPDR sa vyuva na prenos dt me- (vi popis registrov vyie). V hlavikovom sbore sa dzi poom univerzlnych registrov a posuvnm regis- nachdzaj okrem defincie portov rozhrania aj maktrom SPI. Zpisom do registra SPDR inicializujeme r select(); a desect(); ktormi riadime pin SS. prenos dt. tanie registra spsob pretanie obsahu posuvnho registra SPI. Prklady Priklad . 1: Cez SPI rozhranie MCU zap do Slave zariadenia Praktick realizcia prenosu dt cez SPI Zapojenie mikropotaa ATmega8 pre prenos dt hodnotu 0x21h. Nsledne pretaj odpove slave zariadenia. cez SPI Obr 11.6 - Register SPDR Zdrojov kd:
#include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include "spi.h" int main(){ unsigned char data; //inicializacia SPI InitSPI(); //zapis dat SELECT(); // vyber SS Slave zariadenia WriteByteSPI(0x21); //zapis data cez SPI // zrus vyber SS Slave zariadenia DESELECT(); //citanie dat SELECT(); // vyber SS Slave zariadenia data = ReadByteSPI(); //citaj data cez SPI // zrus vyber SS Slave zariadenia DESELECT(); return 0; }

Obr 11.7 - Schma zapojenia MCU pre test SPI

Obvod pripojme cez rozhranie SPI s mikropotaom pomocou 4 vodiov SS, MOSI, MISO, SCK (vi popis na zaiatku kapitoly). Pokia chceme pripoji viacero obvodov cez SPI ku mikropotau, vyuijeme alie vone piny mikropotaa pre riadiace signly SS pre alie zariadenia. Prca s kninicou na obsluhu rozhrania SPI Pre jednoduchiu prcu s rozhranm SPI na mikropotai ATmega8 som sa rozhodol naprogramova kninicu na jeho obsluhu. Pomocou nej si ukeme ako inicializova SPI a ako prena dta.

52

ROZHRANIE TWI

Rozhranie TWI
Popis rozhrania I2C
Rozhranie I2C bolo vyvinut firmou Philips pre komunikciu zariaden na krtke vzdialenosti, typicky na doske plonch spojov. Rozhranie I2C je u mikropotaov AVR nazvan ako dvojvodiov sriov rozhranie (TWI).

Prenos dt a formt rmca (sbor dajov prenan v jednom bloku)

Kad dajov bit prenesen prostrednctvom TWI zbernice je sprevdzan hodinovm impulzom na vodii SCL. Napov rove na dtovom vodii, SDA mus by poas vysokej rovne SCK stabiln, (vi Dvojvodiov sriov rozhranie (TWI) je idelne roz- Obr 12.1). Vnimkou je len generovanie tartovacej a hranie pre mnoh aplikcie mikropotaov. Protokol ukonovacej podmienky. rozhrania TWI dovouje uvateovi vzjomne prepoji a 128 rznych zariaden pomocou dvojvodiovej obojsmernej zbernice. Jeden vodi sli na prenos hodinovho signlu (SCL), druh na prenos dt (SDA). Vetky extern komponenty pozostvaj z dvoch pull-up odporov (typicky hodnoty 4k7). Vetky zariadenia pripojen na zbernicu maj samostatn adresy a obsahuj mechanizmus pripjania na zbernicu, ktoObr 12.1 - Vzorkovanie dt na TWI zbernici r je sasou TWI protokolu. Zariadenie typu MASTER inicializuje a ukonuje prenos dt. Prenos je iniciovan zariadenm MASTER, ktor na zbernicu generuje podmienku tartu (START). Prenos ukonuje MASTER pomocou ukonovacej podmienky (STOP). Medzi podmienkami START a STOP je zbernica obsaden a iadne in Obr 12.0 - Pripojenie zariaden na rozhranie TWI zariadenie typu MASTER neme prevzia riadenie zbernice. V pecilnom prpade sa meme stretnAko je uveden na Obr 12.0 obidva vodie zbernice s s generovanm novej podmienky START medzi pripojen na naptie Vcc prostrednctvom "pull-up" podmienkami START a STOP. Tento prpad sa nazodporov zva hodnoty 4k7. Vstupn obvody TWI va opakovan START a vyuva sa v prpadoch, ke kompatibilnch zariaden s typu "open-drain", teda MASTER chce iniciova nov prenos, bez opustenia pracuj s otvorenm kolektorom. Z toho vyplva, e riadenia zbernice. Po opakovanom tarte zbernica rove naptia zodpovedajca log.0 sa vyskytne na ostva obsaden a po nasledujcu podmienku STOP. vodii TWI zbernice vtedy, ak jeden, alebo viac zariaAko je znzornen na Obr. 12.2, START a STOP podden bude generova na svojom vstupe napov romienky s charakterizovan zmenou rovne na SDA ve log.0. V prpade, e vetky TWI zariadenia bud vodii poas doby ,ke na SCL vodii je vysok roma vstupy v stave vysokej impedancie, bude vaka ve naptia. "pull-up" odporom rove naptia na prslunom vodii zodpoveda log.1. Poet spolupracujcich zariaden je obmedzen kapacitou zbernice (max 400pF) a tie 7-bitovm adresnm priestorom. Detailn pecifikciu elektrickch parametrov zbernice TWI je mon njs v datasheete MCU ATmega8 na strane 238. Obr 12.2 - Vyslanie tart a Stop podmienky

53

ROZHRANIE TWI
Adresn bloky prenan prostrednctvom zbernice TWI maj 9 bitov (vi Obr 12.3). Pozostvaj zo: siedmych adresnch bitov jednho riadiaceho bitu - TANIE/ZPIS (R/W) bitu potvrdenia - (ACK) Ak R/W bit m hodnotu log.1, bude vykonan opercia tania, inak sa vykon opercia zpisu. Ak ubovon zariadenie typu SLAVE rozpozn svoju adresu v deviatom takte hodn generuje na SDA vodi rove log.0. Ak je adresovan zariadenie SLAVE zaneprzdnen a neme odpoveda na poiadavku zariadenia MASTER v deviatom cykle hodn (cyklus ACK) bude rove na vodii SDA odpoveda log.1. Potom zariadenie typu MASTER me vysla podmienku STOP, alebo opakovan START na iniciovanie novho prenosu. Adresn blok (paket) pozostva teda z adresy a tacieho/zpisovho bitu, ktor sa oznauje SLA+R, alebo SLA+W. MSB adresa sa vysiela ako prv. V priebehu nvrhu me uvate vone prideova adresy jednotlivm zariadeniam, ale adresa 0000000b je rezervovan pre veobecn vzvy. Ke zariadenie typu MASTER vyle veobecn vzvu, vetky zariadenia bud v cykle ACK generova na SDA rove log.0. Veobecn vzva sa pouva v prpade, ak zariadenie MASTER chce vetkm zariadeniam SLAVE vysla t ist sprvu. V prpade, e vo veobecnej vzve je bit R/W rovn log.0, potom nasledujci dtov paket bude prijman vetkmi zariadeniami SLAVE, ktor reagovali na veobecn vzvu. Poznamenajme, e veobecn vzva s R/W bitom rovnm log.1 nem prakticky vznam. V tomto prpade by zaalo sasne vysiela viacero zariaden rzne daje. prenosu dt zariadenie typu MASTER generuje hodiny a podmienky START a STOP, priom prijma je zodpovedn za generovanie potvrdenia prjmu ACK. Ako nhle prijma ponech vodi SDA poas deviateho cyklu hodn v stave vysokej rovne (NACK), tto skutonos je interpretovan ako neschopnos prijma alie dta.

Obr 12.4 - Dtov paket odoslan cez TWI Veobecne je prenos zloen z podmienky START a SLA+R/W (adresa prijmaa + R/W bit), jeden, alebo viac dajovch paketov a z podmienky STOP. Nie je povolen prenos przdnej sprvy ( podmienka START a bezprostredne za ou podmienka STOP). Poznamenajme, e zariadenie SLAVE me poda potreby predi nzku rove na vodii SCL. Tto skutonos je mon vyui v prpade ,ak rchlos SCL dan zariadenm MASTER je pre dan prijma prli vysok. Predenie asu nzkej rovne SCL nem vplyv na as trvania vysokej rovne. Dsledkom uvedenho je ,e zariadenie SLAVE me meni prenosov rchlos na zbernici TWI.

Modul TWI MCU ATmega8 obsahuje niekoko funknch blokov poda Obr. 12.5. Vetky registre znzornen hrubou iarou s prstupn prostrednctvom dajovej zbernice procesora. Vvody SDA a SCL spolupracuj s internmi asami MCU. Vstupn budiace obvody obsahuj obmedzova strmosti hrn signlu ( SRC), poda pecifikcie rozhrania zbernice TWI. Vstupy obsahuj obvody potlaenia piiek signlu (SF), ktor s kratie ne 50 Obr 12.3 - Adresn paket odoslan cez TWI ns. Intern "pull-up" odpory mu by pouit nastavenm prslunch bitov registra PORTC, v opanom Vetky dtov pakety prenan prostrednctvom prpade treba poui extern "pull-up" rezistory. zbernice TWI maj dev bitov (vi obr 12.4). Obsa- V prpade, e MCU pracuje v reime MASTER, jedhuj 8 dtovch bitov a jeden potvrdzovac bit. Poas

Rozhranie TWI mikropotaa ATmega8

54

ROZHRANIE TWI
notka generovania prenosovej rchlosti riadi peridu hodinovho signlu SCL. Frekvencia signlu SCL je uren obsahom bitov preddeliky v registri TWSR a obsahom registra TWBR. Ak MCU pracuje v reime SLAVE prenosov rchlos nezvis od nastavenia registrov TWSR a TWBR, mus by vak minimlne 16 krt niia ne je frekvencia hodn CPU. MASTER uvedie sa do aktvneho reimu. Riadiaca jednotka monitoruje TWI zbernicu a generuje odozvu v slade s nastavenm riadiaceho registra TWCR. Ak sa na zbernici vyskytne tak udalos, ktor vyaduje zsah aplikanho programu nastav sa prznak preruenia TWINT v registri TWCR. V nasledujcom hodinovom cykle sa prepe obsah stavovho registra TWSR, pomocou ktorho je mon Frekvencia generovanho signlu SCL je dan nasle- identifikova druh udalosti. Register TWSR obsahudovnm vzahom: je relevantn informciu len po nastaven prznaku TWIN. Inak obsah registra TWSR pomocou pecilneho stavovho kdu informuje CPU, e relevantn informcia nie je prstupn. Po cel as nastavenia prznaku TWINT je vodi SCL prostrednctvom v, kde TWBR je hodnota uchovan v registri TWBR stupu dran na nzkej rovni. To dovouje aplikaa TWPS je hodnota uchovan v prslunch bitoch nmu programu reagova na vzniknut udalos pred preddeliky v registri TWSR. povolenm alieho prenosu prostrednctvom TWI zbernice. Jednotka rozhrania TWI obsahuje dajov a adresn posuvn register (TWDR), obvody riadenia a gene- TWIN prznak je nastaven v nasledujcich prparovania START/STOP podmienok a vberov a de- doch: tekn obvody. Register TWDR obsahuje bajt dt/ad- Po tom, o TWI vyslala podmienku START, alebo resy, ktor m by vyslan, prpadne bajt prijatch dt/ opakovan START. adresy. Ako doplnok k registru TWDR sa vyuva bit Po tom, o TWI vyslala SLA+R/W. (N)ACK, ktor bude vysielan, alebo bol prijat. Ten- Po tom, o TWI vyslala adresn bajt. to bit nie je priamo prstupn uvateskmu progra- Po tom, o TWI vypadla z procesu arbitre (vmu, iba prostrednctvom registra TWICR. Obvody ber zariadenia typu MASTER). riadenia START/STOP podmienok generuj a dete- Po tom, o bola adresovan (vlastnou SLAVE adkuj podmienky START, opakovan START a STOP. resou, alebo veobecnou vzvou). Obvody riadenia START/STOP podmienok s schop- Po tom, o prijala bajt dt. n rozpozna podmienky START a STOP aj v prpade, Po tom, o prijala STOP, alebo opakovan START e MCU je v niektorom z spornch reimov. Ak je pokia bola adresovan ako SLAVE. zariadenie adresovan potom aktivuj MCU. Po tom, ke bola identifikovan chyba zbernice Ak TWI chce vysiela dta v reime MASTER vbero(neprpustn START a STOP podmienky). v a detekn obvody neustle monitoruj prenos dt na zbernici. Ak v procese vberu je zariadenie nespen potom vberov a detekn obvody informuj riadiacu jednotku TWI. Jednotka vyhodnotenia adries kontroluje prijman adresn bajty a porovnva ich zhodu s obsahom 7-bitovho adresnho registra TWAR. Ak bit TWGCE v registri TWAR je nastaven na hodnotu log.1, potom prijat adresn bajt je porovnvan s adresou urenou pre veobecn vzvu. Ako u bolo spomenut, jednotka vyhodnotenia adries je schopn vyhodnocova adresy aj v prpade, e MCU je v spornom reime. V prpade, e MCU je adresovan zariadenm typu

55

ROZHRANIE TWI
ven bitu TWINT bude CPU pokraova vo vkone programu na adrese preruovacieho vektora TWI. Pokia je bit TWINT nastaven na hodnotu log.1 vstup SCL je na nzkej rovni. Bit TWINT mus by vynulovan pomocou programu, zpisom log.1. Poznamenajme, e nulovanie prznaku TWINT povol innos na zbernici TWI. Preto obsahy vetkch registrov (stavov, dtov a adresn) musia by pretan/zapsan pred vynulovanm prznakovho bitu TWINT. Bit 6 Povolenie potvrdzovania, TWI Enable Acknowledge Bit Bit TWEA riadi generovanie potvrdenia prjmu impulzom ACK. Ak bit TWEA je nastaven na hodnotu Obr 12.5 - Blokov schma TWI rozhrania log.1, potom je impulz ACK generovan na zbernicu TWI pri splnen nasledujcich podmienok: Popis registrov Ak zariadenie je v reime SLAVE a prijalo vlastn Register prenosovej rchlosti TWBR adresu. Po prijat veobecnej vzvy, za predpokladu, e bit TWGCE v registri TWAR je nastaven na hodnotu log.1. Obr 12.6 - Register TWBR Po prijat dtovho bajte v reime MASTER prijma, alebo SLAVE prijma. Bity 7 a 0 - Bity registra prenosovej rchlosti TWI, Zpisom log.0 do bitu TWEA bude zariadenie virtuTWI Bit Rate Register Pomocou obsahu registra TWBR sa uruje deliaci po- lne, doasne odpojen od zbernice TWI. Rozpoznamer genertora prenosovej rchlosti. Genertor pre- nie adresy me znova nastavi bit TWEA na hodnotu nosovej rchlosti je deli frekvencie sliaci na gene- log.1. rovanie hodinovho signlu SCL, v prpade, e MCU pracuje v reime MASTER. Prenosov rchlos je ur- Bit 5 Bit podmienky START, TWI START Condition Bit en vzahom uvedenm na predchdzajcej strane. Ak zariadenie chce na zbernici zauja postavenie MASTER, potom aplikan program zape do bitu Riadiaci register TWI TWCR TWSTA log.1. Obvodov prostriedky jednotky TWI kontroluj zbernicu a ak je zbernica von generuj podmienku START. Ak nie je zbernica uvonen TWI Obr 12.7 - Register TWCR jednotka ak pokia sa na zbernici nevyskytne podmienka STOP a nsledne generuje podmienku START. Riadiaci register TWCR je vyuit na riadenie innos- Po vyslan podmienky START bit TWSTA mus by ti jednotky TWI. vynulovan programom Bit 7 Prznak preruenia od TWI, TWI Interrupt Flag Bit TWINT sa automaticky nastav, ke TWI jednotka ukon prve prebiehajcu lohu a vyaduje odozvu (zsah) aplikanho programu. Ak s globlne povolen preruenia a sasne je bit TWIE v registri TWCR nastaven na hodnotu log.1, potom pri nastaBit 4 Bit podmienky STOP, TWI Stop Condition Bit Ak TWI jednotka je v reime MASER, potom zpisom log.1 do bitu TWSTO bude na TWI zbernicu generovan podmienka STOP. Po vyslan podmienky STOP sa bit TWSTO automaticky vynuluje. V reime SLAVE sa nastavenie bitu TWSTO pouva na zotavenie po podmienke ERROR. V tomto prpade sa ne-

56

ROZHRANIE TWI
generuje STOP podmienka, ale zariadenie sa vrti do neadresovanho reimu SLAVE. Jeho vstupy bud v stave vysokej impedancie. TWPS1 TWPS0 0 0 0 1 0 Bit 3 Prznak kolzie pri zpise, TWI Write Collision 1 1 1 Flag Bit TWWC sa nastav, ke sa pokame zapsa dta Tab.12.1 Hodnoty deliaceho pomeru do TWI dajovho registra TWDR, a prznak TWINT m hodnotu log.0. Tento prznak je nulovan zpisom dajov register TWI TWDR do registra TWDR, ke bit TWINT m hodnotu log.1. Bit 2 Bit povolenia TWI, TWI Enable Bit Bit TWEN povouje innos jednotky TWI. Ke do bitu TWEN zapeme hodnotu log.1 jednotka TWI preber riadenie V/V vvodov, prirad im funkciu SCL a SDA, povol innos obmedzovaa strmosti hrn signlu a filtra. Ak do bitu TWEN zapeme hodnotu log.0 jednotka TWI sa vypna a prenos sa ukon. Bit 1 Nevyuit bit, Reserved Bit Obr 12.9 - Register TWDR Deliaci pomer 1 4 16 64

Ak je jednotka TWI vo vysielacom reime, potom register TWDR obsahuje nasledujci bajt, ktor bude vysielan. Ak je jednotka TWI v reime prjmu, potom register TWDR obsahuje posledn prijat bajt. Do registra TWDR sa neme zapisova, pokia sa ete posva vysielan bajt. Ak sa nastavil prznak TWINT je mon pristupova k registru TWDR. PoznameBit 0 Povolenie preruenia od TWI, TWI Interrupt najme, e k registru TWDR nememe pristupova pred prvm vskytom preruenia. daje v registri Enable Ak bit TWIE je nastaven na hodnotu log.1 a sasne TWDR ostvaj stabiln pokia prznak TWINT m s globlne povolen preruenia TWI jednotka bude hodnotu log.1. Pokia s daje posvan z registra generova iados o preruenie vdy, ak bude nastave- TWDR na zbernicu, tak aktulne daje zo zbernice s posvan do registra. Register TWDR preto vdy n prznak TWINT. obsahuje posledn bajt, ktor bol na zbernici, s vnimkou prechodu z spornho reimu po preruen Stavov register TWI TWSR od jednotky TWI. V tomto prpade je obsah registra TWDR nedefinovan. Bit potvrdenia prjmu ACK je nastavovan automaticky, vlastn CPU neme k nemu pristupova. Obr 12.8 - Register TWSR Bity 7:0 - Bity dajovho registra, TWI Data Register Bity 7..3 TWS, Stav TWI, TWI Status Tchto 5 bitov charakterizuje stav jednotky TWI i sa- Tieto bity tvoria nasledujci dajov bajt, ktor m by vyslan, alebo posledn dajov bajt, ktor bol motnej zbernice. prijat z dvojvodiovej (TWI) zbernice. Bit 2 Nevyuit bit, Reserved Bit Bity 1..0 TWPS, Bity preddeliky, TWI Prescaler Bits Obsah bitov TWPS uruje pouit deliaci pomer preddeliky poda tabuky 12.1. Adresov register TWI TWAR

Obr 12.10 - Register TWAR

57

ROZHRANIE TWI
Register TWAR obsahuje 7-bitov adresu, na ktor bude TWI reagova vdy, ak bude v reime SLAVE vysiela, alebo prijma. V reime MASTER nie je potrebn. V systmoch s viacermi zariadeniami typu MASTER mus by register TWAR nastaven v tch zariadeniach, ktor mu by adresovan ako zariadenia SLAVE druhmi zariadeniami typu MASTER. Bit TWGCE je vyuit na povolenie rozpoznvania veobecnej vzvy (adresa 0x00). Bity 7:1 - Bity adresovho registra, TWI (Slave) AdreObr 12.11 - asov diagram prenosu dt cez TWI ss Register Tieto bity obsahuj adresu TWI jednotky v reime 1. V prvom kroku je potrebn vysla podmienku SLAVE. START. Aplikcia to zaist zpisom definovanej hodnoty do registra TWCR. Takto iniciuje jedBit 0 Povolenie rozpoznania veobecnej vzvy, TWI notku TWI na prenos START podmienky. TmGeneral Call Recognition Enable Bit to zpisom sa prznak TWINT nastav na hodAk bit TWGCE je nastaven na hodnotu log.1, potom notu log.1. Zpisom log.1 do TWINT sa prznak je povolen rozpoznvanie veobecnej vzvy vyskyTWINT vynuluje. Jednotka TWI nezahji vlastn tujcej sa na TW sriovej zbernici. prenos pokia TWINT obsahuje hodnotu log.1. Bezprostredne po vynulovan bitu TWINT jedPrenos dajov prostrednctvom TWI notka zahji vlastn prenos podmienky START. Jednotka AVR TWI je bajtovo orientovan s plnm 2. Po vyslan START podmienky sa prznak TWINT vyuitm preruen. Preruenia s generovan po vetv registri TWCR nastav na hodnotu log.1 a obnokch udalostiach na zbernici. Pretoe jednotka TWI v sa obsah TWSR, ktor indikuje e podmienka vyuva preruovac systm, CPU me v priebehu bola spene vyslan. prenosu jednho bajtu vykonva aplikan program. 3. Aplikan program testuje obsah TWSR a zisuje Ak nie je povolen preruenie od TWI jednotky, pri podmienka START bola spene vyslan. Ak padne s globlne zakzan preruenia, CPU mus obsah TWSR nezodpoved spenmu vyslaniu programovmi prostriedkami testova nastavenie prSTART podmienky potom aplikcia mus reagoznaku TWINT. Prznak TWINT sa nastav vdy po va naprklad volanm chybovej rutiny. V prpade, ukonen opercie na zbernici. TWI jednotka potom e obsah TWSR odpoved spenmu vyslaniu oakva odozvu od aplikanho programu. V tompodmienky START, potom aplikcia napln registo prpade stavov register TWSR obsahuje hodnoter TWDR hodnotou SLA+W a do registra TWRC tu, ktor charakterizuje aktulny stav TWI zbernice. zape definovan hodnotu, ktor informuje TWI Aplikan program na zklade tohoto stavu rozhodjednotku, e m zahji prenos SLA+W z registra ne ako sa bude jednotka TWI chova v nasledujcom TWDR. Zpisom hodnoty log.1 do bitu TWINT zbernicovom cykle. Sprvanie jednotky TWI uruje sa nuluje prznak TWINT. Bezprostredne po vyaplikan program prostrednctvom vhodnho nanulovan bitu TWINT jednotka zahji vlastn stavenia registrov TWCR a TWDR. Na nasledujcom prenos adresovacieho paketu. obrzku je znzornen spoluprca aplikanho pro- 4. Ak bol adresovac paket spene prenesen nastagramu s jednotkou TWI. V uvedenom prklade zariav sa prznak TWINT v registri TWCR a sasne denie typu "MASTER" prena jeden bajt do zariadesa obnov obsah registra TWSR tak, aby odpovenia typu "SLAVE". dal spenmu prenosu adresy. Obsah registra obsahuje aj informciu i adresovan zariadenie potvrdilo, alebo nepotvrdilo prjem paketu.

58

ROZHRANIE TWI
5. Aplikan program mus testova obsah TWSR a zisti, i bol adresovac paket spene prenesen a i bol potvrden jeho prjem. Ak obsah TWSR nezodpoved spenmu vyslaniu a potvrdeniu prjmu adresovacieho paketu, potom aplikcia mus reagova, naprklad volanm chybovej rutiny. V prpade, e obsah TWSR odpoved spenmu vyslaniu adresovacieho paketu, potom aplikcia napln register TWDR hodnotou dtovho bajtu. Do registra TWRC zape definovan hodnotu, ktor informuje TWI jednotku, e m zahji prenos dtovho bajtu z registra TWDR. Zpisom hodnoty log.1 TWIN sa nuluje prznak TWINT. Bezprostredne po vynulovan bitu TWINT jednotka zahji vlastn prenos dajovho paketu. 6. Po prenose dajovho paketu sa nastav prznak TWINT v registri TWCR a sasne sa obnov obsah registra TWSR tak, aby odpovedal spenmu prenosu dtovho paketu. Obsah registra obsahuje aj informciu i adresovan zariadenie potvrdilo, alebo nepotvrdilo prjem paketu. 7. Aplikan program testuje obsah TWSR a zisuje, i bol dtov paket spene prenesen a i bol potvrden jeho prjem. Ak obsah TWSR nezodpoved spenmu vyslaniu a potvrdeniu prjmu dtovho paketu, potom aplikcia mus reagova, naprklad volanm chybovej rutiny. V prpade, e obsah TWSR odpoved spenmu vyslaniu dtovho paketu, potom aplikcia zape do registra TWRC definovan hodnotu, ktor informuje TWI jednotku, e m zahji prenos podmienky STOP. Zpisom hodnoty log.1 TWINT sa nuluje prznak TWINT. Bezprostredne po vynulovan bitu TWINT jednotka zahji vlastn prenos STOP podmienky. Poznamenajme, e po prenose podmienky STOP sa u prznak TWINT nenastav. boli relevantn pre nasledujci zbernicov cyklus. Po obnoven obsahu TWI registrov aplikan program zape vhodn obsah do TWCR registra. Zpisom logickej jednotky do bitu TWINT sa prznak TWINT vynuluje. Jednotka TWI zahji operciu odpovedajcu obsahu registra TWCR.

Praktick realizcia prenosu dt cez TWI

Zapojenie mikropotaa ATmega8 pre prenos dt cez TWI

Obr 12.12 - Schma zapojenia MCU pre test TWI V praktickej asti si ukeme ako ta a zapisova dta zo Slave zariadenia pripojenho ku mikropotau, ktor bude v reime Master. Nae Slave zariadenie (napr. EEPROM pam, senzor, displej a pod) pripojme pomocou vodiov SDA a SCL ku mikropotau. Na linky SDA a SCL pripojme "pull-up" rezistor s hodnotou 4k7. Prca s kninicou na obsluhu rozhrania TWI Pre jednoduchiu prcu s rozhranm TWI na mikropotai ATmega8 mete poui kninicu i2cmaster, ktor naprogramoval kolega luboss17.

Kninicu uren pre mikropota ATmega8 si mete stiahnu tu: http://svetelektro.com/Pictures/Microprocesory/ Uveden prklad mal za lohu poukza na zkladn avr/10/twi.zip princpy prenosu prostrednctvom zbernice TWI. V AVR studio 4 vytvorme nov projekt, nsledne vo Tieto princpy je mon zhrn nasledovne: vytvorenom adresri projektu prekoprujeme sbory Ak jednotka TWI ukon ubovoln operciu a kninice (i2c_master.c, i2c_master.h). Tieto sbory oakva odozvu aplikcie nastav prznak TWINT. taktie pridme aj do nho projektu v AVR Studio. Pokia prznak TWINT je nastaven, bude na vodii SCL TWI zbernice rove logickej nuly. Pokia TWINT m hodnotu log.0, mus uvate obnovi obsah registrov TWI jednotky, tak, aby

59

ROZHRANIE TWI
Pred pouitm kninice je vhodn nastavi v hlaviko- Prklady vom sbore i2c_master.h frekvenciu prenosu kon- Prklad . 1: tanta SCL_CLOCK (do 400 kHz). Zap do Slave zariadenia s adresou 0x55h hodnotu 0x33h. Nsledne pretaj 4 bajty dt z tohto zariadeKninica obsahuje vetky potrebn funkcie pre prcu nia. s rozhranm TWI v reime Master. Na zaiatku nho programu musme najskr TWI Zdrojov kd: rozhranie inicializova pomocou funkcie: #include <avr/io.h> void i2c_init(void);
#include <avr/interrupt.h> #include "i2c_master.h" int main(void){ unsigned char a,b,c,d; // inicializacia i2c rozhrania i2c_init(); // zapis data 0x33h na Slave adresu zariadenia 0x55 i2c_start(0x55,I2C_WRITE); i2c_write(0x33); i2c_stop(); // citaj 4 bajty zo Slave zariadenia i2c_start(0x55,I2C_READ); unsigned char a = i2c_read_Ack(); unsigned char b = i2c_read_Ack(); unsigned char c = i2c_read_Ack(); unsigned char d = i2c_read_Ack(); i2c_stop(); }

Nsledne meme vysla tart podmienku pomocou funkcie: unsigned char i2c_start(unsigned char address, unsigned char dir); , kde prv parameter je adresa zariadenia (u posunut o bit doava t.j. posledn bit je von) a druh parameter je riadenie smeru prenosu, kde meme vyui definovan kontanty I2C_READ alebo I2C_WRITE. Po bezchybnom priebehu zpis vrti tto funkcia nulu. Po nespenom tarte vrti 1 a ak SLAVE nepotvrd dta Ack bitom vrti 2. Dta na zbernicu vyleme funkciou (po tart podmienke s adresou a I2C_WRITE): unsigned char i2c_write(unsigned char data); , kde parametrom funkcie je vysielan bajt. Po spenom vyslan bajtu vrti funkcia 0 ak nie vrti 1. Bajt zo zbernice pretame funkciou: unsigned char i2c_read_nAck(void); V prpade, e chceme naraz prija viac bajtov za sebou pouijeme funkciu: unsigned char i2c_read_Ack(void); , to znamen, e za prijatm bajtom MASTER generuje ACK bit a ak na al bajt priom pri poslednom bajte pouijeme funkciu: unsigned char i2c_read_nAck(void); Stop podmienka sa vykonva funkciou: unsigned char i2c_stop(void); po spenom priebehu vrti 0 po nespenom vrti 1.

60

REIMY SPNKU MCU

Reimy spnku MCU


Reimy spnku
SM2 SM1 SM0 sporn reim Reimy so znenou spotrebou umouj vypn pr- 0 0 0 Idle ve nepouvan perifrie mikrokontrolra a tm zni 0 0 1 ADC noise reduction spotrebu zariadenia. Mikrokontrolr ponka viacero 1 0 Power-down reimov so znenou spotrebou a tak umouje uva- 0 1 1 Power-save teovi redukova spotrebu energie v zvislosti na poi- 0 adavkch aplikcie. 1 0 0 Rezervovan Reimy spnku vyuijeme hlavne v aplikcich, pri 1 0 1 Rezervovan ktorch je mikrokontrolr napjan z batrie. Tam 1 1 0 Standby(1) meme vyuitm vhodnho reimu spnku nieko- (1) Standby reim je mon vyui len s externm konsobne zvi vdr batrie. krytlom, alebo rezontorom Tab 13.0 Reimy spnku MCU

Popis registrov

Ak chceme vyui ubovon z piatich spornch reimov, potom bit SE v MCUCR registri mus by nastaven na hodnotu 1. Vkonom intrukcie SLEEP prejde MCU do zvolenho spornho reimu. Hodnoty bitov SM2, SM1 a SM0 v registri MCUCR definuj, ktor z piatich monch reimov bude aktivovan. Ak sa v priebehu spornho reimu vyskytne povolen preruenie MCU prejde do aktvneho stavu. V tomto prpade MCU bude na 4 hodinov cykly zastaven a po nbehovom ase sa realizuje prslun obsluha preruenia. Po obsluhe preruenia bude MCU pokraova vo vkone programu, intrukciou nasledujcou za intrukciou SLEEP. Obsah pola univerzlnych registrov a pamte SRAM ostva nezmenen. Register MCUCR obsahuje riadiace bity pre riadenie spotreby.

Popis reimov spnku

Idle mode, reim neinnosti Ak bity SM2..0 s nastaven na hodnotu 000, potom realizcia intrukcie SLEEP spsob, e MCU prejde do reimu neinnosti. V tomto reime je zastaven innos CPU, ale SPI, USART, analgov kompartor, ADC, TWSI, tae/asovae, watchdog a preruovac systm pokrauj v innosti. Je zrejm, e v tomto reime je zastaven hodinov signl clkCPU a clkFLASH. Z reimu neinnosti sa MCU dostane na zklade vskytu iadosti o preruenie od povolench internch a externch zdrojov preruenia.

ADC noise reduction mode, reim redukcie umu Ak s bity SM0..2 nastaven na hodnotu 001, potom realizcia intrukcie SLEEP spsob, e MCU prejde Register MCUCR: do reimu redukcie umu. Tento reim zastav CPU a niektor I/O obvody. V reime redukcie umu bud zastaven nasledovn hodinov signly: clkIO, clkCPU a clkFLASH. Toto spsob znenie rovne umu Obr 13.0 - Registe MCUCR generovanho digitlnymi obvodmi a zvi sa presnos A/D prevodu. Z reimu redukcie umu sa MCU Bit 7 SE: Sleep Enable Ak bit SE je nastaven na hodnotu 1, potom je povole- dostane na zklade vskytu iadosti o preruenie od n vykonanie intrukcie SLEEP. Vhodn je nastavi bit nasledovnch povolench zdrojov: koniec ADC prevodu, extern retart, watchdog retart, Brown-out SE prve pred intrukciou SLEEP. retart, TWSI zhoda adresy, ta/asova2, SPM a EEPROM pripraven a extern preruenia na rove Bity 6, 4 SM2 . . 0 Sleep Mode Select 2, 1 a 0 Pomocou bitov SM2, SM1 a SM2 je mon zvoli je- INT0 a INT1. den z piatich spornch reimov MCU poda Tab. 1

61

REIMY SPNKU MCU


Power-down mode, reim zo znenou spotrebou Ak s bity SM0..2 nastaven na hodnotu 010, potom realizcia intrukcie SLEEP spsob, e MCU prejde do reimu so znenou spotrebou. V tomto reime je zastaven extern osciltor. Extern preruenia, TWSI a watch-dog pokrauj v innosti. Z reimu so znenou spotrebou sa MCU dostane na zklade vskytu iadosti o preruenie od nasledovnch povolench zdrojov: extern retart, watchdog retart, Brown-out retart, TWSI zhoda adresy a extern preruenia na rove INT0 a INT1. V tomto reime s pozastaven genertory hodinovch signlov a v innosti zostvaj len asynchrnne pracujce moduly. Power-save mode, reim s spornou spotrebou Ak s bity SM0..2 nastaven na hodnotu 011, potom realizcia intrukcie SLEEP spsob, e MCU prejde do reimu s spornou spotrebou. Tento reim je identick s predchdzajcim reimom so znenou spotrebou s nasledovnou vnimkou: Ak ta/asova 2 pracuje asynchrnne (bit AS2 v ASSR je nastaven), bude v tomto reime aktvny a v prpade vskytu iadosti o preruenie prejde MCU do aktvneho stavu. Ak nie je povolen asynchrnna innos taa/asovaa2 odpora sa pouva reim so znenou spotrebou. V tomto reime s pozastaven vetky hodinov signly s vnimkou clkASY. Standby mode, pohotovostn reim Ak s bity SM0..2 nastaven na hodnotu 110 a CPU vyuva ako zdroj hodinovho signlu genertor s externm krytlom/rezontorom, potom realizcia intrukcie SLEEP spsob, e MCU prejde do pohotovostnho reimu. Tento reim je identick s reimom so znenou spotrebou s vnimkou, e osciltor zostva v innosti. Z tohto reimu MCU prechdza do aktvneho reimu v priebehu 6 hodinovch perid.

Minimalizcia spotreby

Pri minimalizovan spotreby mikropotaa sa sname v maximlnej miere vyui monosti reimov spnku, ktor nm mikropota ponka. Niektor perifrie mikropotaa vak potrebuj osobitn nastavenie, ak poadujeme zni spotrebu do maximlnej monej miery. alie monosti znenia spotreby teda s: Vypn AD prevodnk (bit ADEN v ADCSRA) Vypn Analgov kompartor (bit ACD v registri ACSR) Vypn Brown-out Detect (nastavenie BODEN v poistkch) Vypn Watch-dog timer (bit WDE v registri WDTCR) Na spotrebu mikropotaa nielen v reimoch spnku m najv vplyv frekvencia hodinovho signlu a pracovn naptie. Preto sa sname voli kompromis medzi vkonom a spotrebou mikropotaa. V tabuke . 13.1 som meranm zisoval spotrebu mikropotaa ATmega8 v rznych reimoch innosti. Ako zdroj hodn som vyuval intern RC osciltor s rznou frekvenciou. Poas merania bol vypnut Brown-out detektor, AD prevodnk, Watchdog-timer a Analgov kompartor. Najv vplyv na spotrebu vo vetkch reimoch innosti mal AD prevodnk, ktor odoberal po zapnut prd 0,3mA. Reim spnku Naptie Osciltor Spotreba Bez spnku 5V 1MHz 3,4mA Bez spnku 5V 8MHz 11,4mA Bez spnku 3,3V 1MHz 1,63mA Bez spnku 3,3V 8MHz 5,3mA Idle 5V 1MHz 2,5mA Idle 5V 8MHz 6,8mA Idle 3,3V 1MHz 0,6mA Idle 3,3V 8MHz 2,9mA Power Down 5V 8MHz 0,7uA Power Save 5V 8MHz 0,7uA Tab. 13.1 - Meranie spotreby MCU ATMega8 v rznych reimoch innosti

Obr 13.1 - Popis jednotlivch reimov spnku

62

REIMY SPNKU MCU


Vidme teda, e najmeniu spotrebu dosiahneme s reimami Power Down alebo Power Save.
MCUCR |= (1 << ISC01); sei(); //nastav sleep mod set_sleep_mode(SLEEP_MODE_IDLE); sleep_mode();

Praktick realizcia reimov spnku u mikropotaa

Priamo na prcu s reimami spnku sli kninica //po prebudeni (avr/sleep.h), ktor som vyuval aj v nasledovnch _delay_ms(2000); prkladoch. PORTB |= (1 << PB0); Pomocou funkcie set_sleep_mode(<mode>); nastavme cez parameter funkcie poadovan reim spnku return 0; } a funkciou sleep_mode (void); dan reim spnku aktivujeme. ISR(INT0_vect) { Schma zapojenia:
}

Youtube video: Test Idle reimu spnku Prklad . 2: Nastav extern preruenie generovan nzkou rovou signlu, prejdi do reimu spnku Power Down. Po zobuden rozsvie po 2sec LED. Pozn.: Pri reimoch spnku ,okrem reimu Idle, je mon poui extern preruenie jedine v reime, ke je generovan nzkou rovou signlu. Preto po zobuden musme zakza extern preruenia, nakoko inak by mikropota po zobuden neustle generoval preruenia pokia by bol stav nzkej rovne signlu. Zdrojov kd:
#include <avr/interrupt.h> #include <avr/io.h> #include <util/delay.h> #include <avr/sleep.h> int main(void){ // nastavenie vyst. portu pre LED DDRB |= (1 << PB0); PORTB &= ~(1 << PB0); // nastavenie ext. prerusenia, nizka uroven napatia DDRD &= ~(1 << PD2); PORTD |= (1 << PD2); GICR |= (1 << INT0); sei(); // nastav rezim spanku set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_mode();

Obr 13.2 - Schma zapojenia MCU pre test reimov spnku Prklady: Prklad . 1: Nastav extern preruenie generovan dobenou hranou signlu a prejdi do reimu spnku Idle md. Po zobuden rozsvie po 2sec LED. Zdrojov kd:
#include <avr/interrupt.h> #include <avr/io.h> #include <util/delay.h> #include <avr/sleep.h> int main(void){ //nastavenie vyst. portu pre LED DDRB |= (1 << PB0); PORTB &= ~(1 << PB0); // nastavenie ext. prerusenia, dobezna hrana signalu DDRD &= ~(1 << PD2); PORTD |= (1 << PD2); GICR |= (1 << INT0);

63

REIMY SPNKU MCU


// zrus externe prerusenia cli(); //pockaj 2s a potom rozsviet LED _delay_ms(2000); PORTB |= (1 << PB0); return 0; } ISR(INT0_vect) { }

Youtube video: Test reimu Power-down

64

POUIT LITERATRA

Pouit literatra
DOC. ING. JURAJ MIEK PHD.: "MIKROKONTROLERY ATMEL AVR, ATMEGA8, POPIS, PROGRAMOVANIE, APLIKACIE", ilinsk univerzita 2004 ATMEL: "KATALGOV LIST OBVODU ATMEGA8", [ONLINE] http://www.atmel.com/images/doc2486.pdf WIKIPEDIA: " SERIAL PERIPHERAL INTERFACE BUS" [ONLINE] http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus WIKIPEDIA: " IMPULZOV RKOV MODULCIA" [ONLINE] http://sk.wikipedia.org/wiki/PWM WINAVR.SCIENCEPROG.COM: "PRCA S DESATINNMI SLAMI POMOCOU FUNKCIE SPRINTF V PROGRAME AVR STUDIO 4" [ONLINE] http://winavr.scienceprog.com/avr-gcc-tutorial/using-sprintf-function-for-float-numbers-in-avr-gcc.html

65

66

67

2012 Bc. Ondrej Zvodsk

68

You might also like