bascom avr začetni tečaj delovno gradivo
TRANSCRIPT
Gregor MAČEK, Vilko SUSTIČ, Jure MIKELN
Bascom AVR začetni tečaj, marec 2008
Bascom AVR začetni tečaj
Delovno gradivo
2 Bascom AVR začetni tečaj, marec 2008
Bascom AVR začetni tečaj, marec 2008 3
Uvod
Jure Mikeln
Uvod v publikacijo
Priče smo silnemu napredku na vseh področjih tehničnih znanosti. Novodobne tehnične znanosti se
imajo temu napredku zahvaliti predvsem razvoju procesorske moči osebnih računalnikov, kar je
omogočilo razvoj novih zmogljivih programskih orodij. Elektroniki poznamo veliko programskih
orodij, brez katerih si sodobnega dela ne znamo več predstavljati. Podobno velja tudi za moderne
elektronske komponente, izmed katerih bi poudaril mikrokontrolerje, ki so v zadnjih 15 letih tudi
naredili ogromen korak naprej. Ta napredek se vidi na cenovnem, predvsem pa na tehničnem
področju. Tako danes za nekaj evrov dobimo izredno zmogljiv ARM mikrokontroler (32-bitni
mikrokontroler), ki ima izredno zmogljivo periferijo, kot so analogni/digitalni in digitalno/analogni
(A/D in D/A) pretvorniki, Ethernet, CAN ter USB vmesniki, krmilniki za motorje, moduli za realno uro
in podobno. Pri tem pa ne zamešajmo izrazov: v PC-ju ne deluje mikrokontroler, pač pa zmogljiv
procesor (64-bitni), ki signale po vodilu pošilja na razne enote, kot so video, spominska, krmilnik trdih
diskov itd. Razlika med procesorjem in mikrokontrolerjem je v tem, da procesor nima vgrajene
periferije.
V tečaju, ki je pred vami, se z ARM mikrokontrolerji ne bomo spoznavali, pač pa smo pripravili
osnovne informacije, ki naj bi jih poznal začetnik - programer, da bi lahko suvereno začel programirati
mikrokontrolerje družine AVR. Takšen mikrokontroler bo brez težav poganjal motorje, vklapljal ter
izklapljal releje, sprejemal signale z različnih senzorjev in tipk, signale obdeloval ter s pomočjo LCD-
prikazovalnika prikazoval podatke in sodeloval z drugimi mikrokontrolerji ter tako predstavljal
mikrokontrolerski sistem tudi za večje zahteve. Po potrebi bo alarmiral oskrbovalce sistema bodisi
zvočno, bodisi preko mobilnih telefonov ali radijskih postaj.
AVR mikrokontrolerji
AVR mikrokontrolerji so eni izmed popularnih mikrokontrolerjev, ki so dobavljivi že približno 10 let.
Mikrokontroler si predstavljajmo kot “črno škatlo“, ki ima vhodne in izhodne priključke.
Mikrokontroler brez programa je mrtev in kot tak res neuporaben. Zaživi le, ko se v njem vpisani
program prične izvajati. Jasno pa je, da je za to potrebna tudi napajalna napetost. Mikrokontrolerje
dandanes uporabljamo v praktično vsaki napravi, bodisi da je to igrača ali zahteven industrijski PLC
krmilnik. V vseh teh napravah je vsaj en mikrokontroler, vemo pa, da v sodobnih avtomobilih deluje
več mikrokontrolerjev.
Obstaja več vrst mikrokontrolerjev, od 1, 4, 8 pa tja do 32-bitnih. Danes se največ uporabljajo 8 in 32-
bitni, redko pa še kakšni drugi. Mikrokontrolerji, o katerih bo govora v seriji člankov so 8-bitni. AVR
4 Bascom AVR začetni tečaj, marec 2008
mikrokontroler vsebuje ALU (arithmetical logical unit) enoto, več vhodno/izhodnih (V/I, v tuji
literaturi je uveljavljen izraz I/O – input/output port) vrat ali portov, FLASH spomin in še več enot, o
katerih bo govora kasneje. V FLASH spomin s pomočjo programatorja naložimo naš program, ki ga v
zaporednih korakih izvaja ALU. V/I porti so večinoma dvosmerni s tem, da moramo s programom
definirati ali bo posamezni pin vhodni ali izhodni. Mikrokontroler za svoje delovanje potrebuje
napajalno napetost in večinoma tudi kvarčni kristal oziroma keramični resonator, ki ALU-ju daje t.i.
taktni signal, s katerim ALU izvaja programsko kodo. V kolikor ALU nima takta se njeno delovanje
ustavi in se spet nadaljuje, ko obnovimo taktni signal. V določenih primerih pa tudi kvarčni kristal ali
resonator nista potrebna, saj imajo AVR mikrokontrolerji vgrajen t.i. RC oscilator, ki daje takt ALU-ju
in s tem omogoča delovanje mikrokontrolerja. Izbor med RC oscilatorjem ali zunanjim kvarčnim
kristalom oz. resonatorjem definiramo med postopkom programiranja.
Notranja blok shema mikrokontrolerja ATTiny2313
Bascom AVR začetni tečaj, marec 2008 5
Kot vidite je v notranjosti mikrokontrolerja veliko blokov, o katerih ne bomo izgubljali besed.
Zaenkrat naj bo mikrokontroler za nas črna škatla z vhodi in izhodi, ki jo bomo sprogramirali z našim
programom.
Program v mikrokontrolerju se odvija glede na ukaze t.i. strojne kode, ki ALU-ju določa, kaj bo
naredila. Ker ALU deluje z binarno matematiko je ukaz v strojni kodi sestavljen iz ničel in enic – pač v
binarni kodi. V začetkih mikrokontrolerjev so programerji za programiranje uporabljali strojno kodo,
vendar so kmalu ugotovili, da je to izredno nepraktično. Zato so pričeli uporabljati zbirnik (v tuji
literaturi se uporablja izraz assembler), dandanes pa vedno bolj posegamo po višjih programerskih
jezikih, kot so C, različne vrste „visual basic“ programov ter basic programov, ki programsko kodo
napisano v basic-u prevedejo v strojno kodo.
Med basic programe spada tudi programski jezik Bascom, ki se je v Evropi, pa tudi v Sloveniji lepo
uveljavil. Zavedamo se, da ima Bascom (kot tudi drugi višji programski jeziki) svoje prednosti in
slabosti, vendar trdno stojim za stališčem, da je Bascom idealno programsko orodje za začetnike v
programiranju, kar bo pokazano v nadaljevanju.
© Dovoljeno kopiranje publikacije ali dela le-te, pri čemer navedite tudi vir in avtorje!
6 Bascom AVR začetni tečaj, marec 2008
Bascom AVR
Jure Mikeln
Predstavitev razvojnega okolja Bascom-AVR
Bascom trenutno obstaja v dveh verzijah: Bascom-AVR in Bascom-8051. Končnica nam nakazuje, za
katero vrsto mikrokontrolerjev je namenjen prevajalnik. Mi bomo seveda uporabljali Bascom-AVR, ki
si ga lahko brezplačno snamete s spletne strani www.mcselec.com. Z navedene spletne strani si
snemite DEMO verzijo, ki je popolnoma delujoča verzija z omejitvijo velikosti programske kode, ki jo
lahko prevedemo. Kot programerji – začetniki nam bo DEMO verzija popolnoma zadostovala, saj
bodo naši programi kratki in ne bodo dosegali omejitve DEMO verzije.
Bascom je identičen večini programov, ki tečejo v MS Oknih (Windows), zato tukaj ne bi izgubljali
besed. Ker je Bascom-AVR programsko orodje je prav, da se spoznamo z vrstami števil - spremenljivk,
ki jih lahko uporabljamo v naših programih. Na voljo so nam spremenljivke Bit (1 bit), Byte (8 bitov =
1 byte), Integer (2 byte, vrednost spremenljivke je lahko od -32,768 do +32,767), Word (2 byte,
vrednost spremenljivke je lahko od 0 do 65535), Long (4 byte, vrednost spremenljivke je lahko od -
2147483648 do 2147483647, Single (32 bitov, vrednost spremenljivke je lahko od 1.5 x 10^–45 do 3.4
x 10^38), Double (64 bitov, vrednost spremenljivke je lahko od 5.0 x 10^–324 do 1.7 x 10^308) in
String (do 264 byte, spremenljivke so tipa byte z dodatnim byte-om vrednosti nič na koncu).
Spremenljivke lahko imajo poljubna imena, ki jih ponavadi izberemo tako, da so med programiranjem
prepoznavna. Načeloma lahko spremenljivke poimenujmo X1, X2, X3 itd., vendar bomo med
programiranjem lažje razumeli program, če bomo spremenljivko, ki ponazarja vklop/izklop npr. releja
poimenovali Rele. Vsekakor pa ne smemo uporabljati t.i. rezerviranih imen. Teh je preveč za ta
prispevek, zato si jih le oglejte v Help-u. Nekaj teh imen pa lahko naštejem za boljši občutek: OFF, ON,
OR, OUT, OUTPUT, LCASE, LCD, LCDAT, LEFT, LEFT, LEN, LINE in podobno.
Bascom AVR začetni tečaj, marec 2008 7
Shema vezave mikrokontrolerja
Preden bomo začeli s programiranjem, se podrobno spoznajmo še z izrazi bit in byte. Oba izraza smo
srečali že v osnovni šoli v predmetu matematika, kjer smo spoznavali binarni številski sistem, ki ima
samo dve števili: 0 in 1. Spremenljivka vrste bit ima tudi dve vrednosti 0 ali 1. Medtem ko ima število
vrste byte vrednosti med 0 do 255 (binarno: 00000000 do 11111111).
Zdaj ko smo spoznali nekaj osnov pa lahko že pričnemo s programiranjem. Za začetek si zapomnimo
enega najpogostejših ukazov: Do Loop. Ta ukaz pomeni, da se program, ki je napisan med Do in Loop
teoretično odvija v neskončnost. Prične se pri Do, ko pa med izvajanjem od ukaza do ukaza pride do
Loop se vrne na Do in tako naprej dokler ne izklopimo napajalne napetosti. Morda se bo komu to
zdelo nelogično, vendar vam bom pokazal, da se večina programov odvija v Do Loop zanki, izjemno
redki programski primeri so narejeni brez Do Loop zanke.
Prvi program
Prvi program bo izjemno enostaven. Na mikrokontroler bomo priključili LED-ice (enostavno povedano
so to polprevodniške lučke, ki se v primerjavi z lučkami z žarečo nitko izjemno malo grejejo in so tudi
fizično majhne), ki jih bomo z ustreznim programom vklapljali in izklapljali. LED-ice so zelo primerne
za krmiljenje z mikrokontrolerjem saj za normalno svetilnost potrebujejo le nekaj voltov napetosti in
8 Bascom AVR začetni tečaj, marec 2008
nekaj mA toka, kar mikrokontroler, ki ga bomo obravnavali, z lahkoto zagotovi. Pozorni bralci bodo
na shemi poleg mikrokontrolerja in LED-ic opazili tudi upore in resonator. Upor R1 služi za ustrezno
resetiranje mikrokontrolerja, resonator služi generiranju takta, ki ga za svoje delovanje potrebuje
ALU, ostali upori služijo omejitvi toka, ki teče skozi LED-ice. Vezju je še dodan konektor za
programiranje mikrokontrolerja in s tem je osnovni opis vezja zaključen.
Prvi primer programa, s katerim bomo vklapljali in izklapljali LEDice bo izgledal takole:
Dim Ledica As Bit Do Config Portd = Output Portd.0 = Ledica Ledica = Not Ledica Wait 1 Loop
V tem programu smo najprej definirali vrsto spremenljivke, ki jo bomo uporabili. Ker vklapljamo
oziroma izklapljamo samo eno LEDico, je dovolj, da imamo spremenljivko vrste Bit.
Sledi Do-Loop zanka, v kateri ni skoraj nič programa. Najprej je potrebno definirati ali je določen port
vhodni ali izhodni. V našem primeru je izhodni, zato smo ga tako tudi definirali. Nadalje smo definirali
na katerem V/I portu se nahaja ta LEDica. V principu lahko LEDico priključimo na kateri koli prosti
port mikrokontrolerja in to definiramo v programu – kar je s stališča izdelave vezja zelo praktično. Pri
zahtevnejih projektih je namreč težje narediti enostavno tiskano vezje, kot pa spremeniti program.
Sledi ukaz
Ledica = Not Ledica in Wait 1
Ta stavek negira vrednost spremenljivke Ledica: če je bila predhodno 1, bo zdaj 0 in obratno. Ukaz
Wait 1
je trivialen in pomeni, da mikrokontroler na tem mestu v programu počaka 1 sekundo. Enostaven
program bo povzročil, da bo LEDica utripala v 1 sekundnem taktu.
Bascom AVR začetni tečaj, marec 2008 9
Simulator v Bascom-u
V tem delu seminarja vam bomo prikazali uporabo Simulatorja v Bascomu. Bascom ima vgrajen
softverski simulator, ki nam pomaga pri razhroščevanju programa. Simulator je zgolj enostaven
pripomoček in ne 100% zanesljivo orodje, saj v simulatorju ne moremo dobro simulirati prekinitev,
časovnih zank in drugih zahtevnejših operacij. V simulatorju bomo lahko spremljali potek programa,
vpisovali vrednosti spremenljivk med izvajanjem simulatorja ter na podlagi tega spremljali odziv na
LCD simulatorju kot tudi na LEDicah.
Simulator je razdeljen na več oken. V glavnem oknu vidimo naš program oziroma le del programa, saj
za celoten program ni dovolj prostora v oknu. Nadalje vidimo okno, kjer so zavihki Variable, Locals,
Watch, uP, Interrupts. Nadalje je tukaj še okno Interrupts in okno z zavihkoma UART0/UART1.
Od teh oken bomo najbolj pogosto uporabljali okno s programom, okno z zavihki Variable ter okno z
UART zavihkoma.
V prvem oknu bomo spremljali potek izvajanja programa. Izvajanje programa lahko sprožimo na dva
načina: tekoče ali po korakih. Če izberemo tekoče izvajanje progama bomo izredno težko spremljali,
kaj se dogaja s programom, saj se bo program odvijal zelo hitro in tako bo spremljanje praktično
nemogoče. Zato ponavadi izberemo izvajanje po korakih (F8). Vsakič ko pritisnemo tipko F8 se bo
kazalec pri vrstici programa premaknil za eno vrstico naprej in izvedel napisan ukaz. Če želimo v tem
trenutku spremeniti vrednost določene sprejemljivke kliknemo v okno Variables in ročno vpišemo
ime sprejemljivke oziroma jo izberemo iz padajočega menija. Potrdimo z Enter in v oknu Value
vpišemo vrednost spremenljivke ter potrdimo z Enter. Nato lahko spet izvajamo program v
simulatorju po korakih. V kolikor pa se izkaže, da je izvajanje programa dolgo, lahko izberemo tekoče
izvajanje programa. V tem primeru si v oknu s programom označimo t.i. Break točke, kjer se izvajanje
simulatorja ustavi. break točke postavimo tako, da z desnim gumbom miške kliknemo pri odseku
programa, kjer želimo imeti Break točko in kliknemo Toggle Break point. Na isti način Break točko
tudi odstranimo.
10 Bascom AVR začetni tečaj, marec 2008
Simulator in UART
Simulator lahko s pridom uporabljamo pri simulaciji RS232 komunikacije. Za ta namen je pripravljeno
okno UART, v katerem se bo izpisovala vsebina (podatki), ki bi se sicer izpisovali na terminalu. V okno
UART lahko tudi vnesemo spremenljivke, ki jih sprejemamo po UART-u – recimo iz tipkovnice.
Simulator in LCD/LED
Simulator lahko prikazuje izpis na LCD-ju oziroma na LEDicah. Kliknemo na ikono LCD in odprlo se bo
okno, kot ga vidimo na sliki:
Okno LCD in LED simulatorja
Simulator bo stanje na LEDicah izpisoval tako, da logična 1 „vklopi“ LEDico. Ker vemo, da to ne
ustreza realnim mikrokontrolerjem je spodaj levo okno, kjer odkljukamo Invert in s tem preprečimo
to obnašanje simulatorja.
Bascom AVR začetni tečaj, marec 2008 11
Programiranje AVR mikrokontrolerjev
Jure Mikeln
Opis MiniPin razvojnega orodja in programiranje
MiniPin razvojno orodje ni nič drugega kot ploščica tiskanega vezja, na katerem so že prispajkani
določeni elektronski elementi, ki jih programer, ko programira mikrokontroler, s pridom uporablja.
MiniPin lahko uporabimo tako za 20 kot tudi 40-pin mikrokontrolerje družine 8051 in AVR. Ker v
našem nadaljevanju teče beseda o programiranju AVR-jev, se bomo osredotočili na AVR-je. Nadalje je
na MiniPin že predviden prostor za kvarčni kristal oziroma 3-pin keramični resonator, ki ga lahko
uporabimo namesto kvarčnega kristala. Na vezju najdemo 4x8 LEDic (ki so vezane tako, kot je
prikazano na Sliki 2), 4 tipke + 1 reset tipko, priključke za LED in LCD prikazovalnike, 1Wire elemente,
I2C spominske elemente, RS232, RS485 ter integriran regulator napetosti, s katerim napajalno
napetost mikrokontrolerja nastavimo na 5V ali na vedno bolj popularnih 3,3V. MiniPin ima tudi več
razširitvenih konektorjev, ki jih bomo spoznali sproti.
Fotografija MiniPin z označenimi elementi
12 Bascom AVR začetni tečaj, marec 2008
MiniPin napajamo z enosmerno ali izmenično napetostjo od 9-15V. V vezje vtaknemo mikrokontroler
ATTiny2313-20PU na mesto IC6, na mesto U1 vtaknemo 12 MHz kvarc ali resonator, stikalo S3
preklopimo v položaj AVR in že smo pripravljeni, da povežemo MiniPin s programatorjem in
sprogramiramo mikrokontroler.
Za programator lahko uporabimo Proggy programator ali pa si sami naredimo programator po
načrtu, ki ga vidite na sliki 4.
Shema Sample programatorja
Tako Proggy kot Sample programator povežemo na MiniPin na konektor K6. V Bascomu je potrebno
nastaviti (Options/Programmer) izbrani programator, kot vidite na sliki 5.
Bascom AVR začetni tečaj, marec 2008 13
Nastavitev programatorja
V nastavitvah LPT-address morate nastaviti ustrezen naslov, ki ga najdete v BIOS nastavitvah.
V koliko boste uporabljali Proggy svetujem, da najprej naložite program AVR Studio, kjer boste
nastavili Tools/ProgramAVR/Connect in nastavili program, kot kaže spodnja slika:
14 Bascom AVR začetni tečaj, marec 2008
Če se bo Proggy uspešno povezal s PC-jem, se bo odprlo naslednje okno:
Proggy je pripravljen za programiranje v AVR Studiu
Zdaj smo pa že res pri koncu nastavitev strojne in programske opreme. Program, ki smo ga napisali v
Bascom-u prevedemo (Compile ali tipka F7) in v primeru, da uporabljamo Sample programator
kliknemo ikono Program Chip ali pritisnemo F4. Če pa uporabljamo Proggy v
AVR Studiu pritisnemo tipko „...“ in izberemo datoteko s končnico HEX.+
Podobno dosežemo, če v Bascomu namesto Sample programatorja nastavimo STK500 in v oknu
SKT500EXE izberemo, kje se nahaja exe datoteka za STK500 program. Pred tem še odstranimo
kljukice pri Auto Program in Auto Verify ter postavimo kljukico na Upload Code and Data.
Bascom AVR začetni tečaj, marec 2008 15
Ne glede na uporabljeni programator nastavimo mikrokontroler, ki ga programiramo (ATTiny2313) in
kliknemo Program. S tem smo sprogramirali mikrokontroler!
Preden gremo na samo programiranje in Bascom se še malce ustavimo na t.i. Fuse in Lock bitih, ki
znajo pri začetnikih povzročiti kar nekaj težav. Fuse in Lock biti so posebni – recimo temu
konfiguracijski biti, ki (na žalost) niso nastavljivi iz programske kode pač pa jih nastavljamo ob
postopku programiranja.
Lock biti
Lock biti so – kar že samo ime pove, biti, ki zaklenejo mikrokontroler. Zakleniti mikrokontroler
pomeni, da ga ne morete prebrati, programirati oziroma niti programirati niti verificirati. S tem lahko
vsebino kontrolerja (program) zaščitimo pred kopiranjem. V enem delu Lock bitov so tudi biti, s
katerimi določamo t.i Bootloader s katerim se bomo ukvarjali v nadaljevalnem tečaju. Na kratko,
bootloader omogoči, da posodobimo program v mikrokontrolerju kar preko UART vmesnika, ne da bi
potrebovali programator.
Fuse biti
Fuse biti pa nastavljajo sledeče: WatchDog timer (Vklop/Izklop), Bootloader Flash prostor, Brown out
detektor (Vklop/Izklop) ter izbor oscilatorja mikrokontrolerja, ki je lahko zunanji, notranji RC ali
zunanji kvarčni z različnimi frekvencami.
16 Bascom AVR začetni tečaj, marec 2008
Priklop periferije na mikrokontroler
Jure Mikeln, Gregor Maček
Vezava tipke
Tipko lahko vežemo v t.i. pull-up vezavi (ko je tipka pritisnjena, je sklenjena proti masi, sicer pa preko
10k »pull up« upora proti VCC – vhod ima pri pritisnjeni tipki vrednost 0) ali pull-down vezavi (ko je
tipka pritisnjena, je sklenjena proti VCC, sicer pa preko 10k »pull down« upora proti masi – vhod ima
pri pritisnjeni tipki vrednost 1).
Omenjeni upori so namenjeni definiranju stanja spuščene tipke, saj se sicer lahko zgodi, da vhod
»zaplava« in menja stanja brez, da bi bilo karkoli pritisnjeno. Na zgornji sliki je narisana pull up vezava
(R1 na sliki je na primer tak pull up upor).
Bascom AVR začetni tečaj, marec 2008 17
Vezava LED diode
Tudi LED diodo lahko vežemo proti masi ali proti VCC (kot na zgornji sliki); v slednjem slučaju
bo LED prižgana, ko bo izhod na logični 0, ugasnjena pa, ko bo izhod na logični 1.
Če pa vežemo LED med izhod in maso, pa je LED prižgana, ko je izhod na logični 1, ugasnjena
pa, ko je izhod na logični 0.
AVR družina mikrokontrolerjev je sposobna na izhodu direktno poganjati največ 20mA toka,
ne glede na to ali vežemo breme proti masi ali proti VCC. Kontrolerji prejšnje, 8051 družine,
pa so lahko takšen tok zagotovili le pri vezavi bremena proti VCC, ne pa tudi proti masi.
V vsakem primeru moramo zaporedno z LED diodo vezati upor, s katerim omejimo tok skozi
diodo, saj lahko v nasprotnem primeru uničimo kontroler in/ali LED diodo.
18 Bascom AVR začetni tečaj, marec 2008
Vezava PFET in NFET tranzistorja
Mikrokontroler ima prešibke izhode za krmiljenje močnejših porabnikov - Rt (npr. relejev, žarnic itd.),
zato moramo njihov izhod „ojačiti“. To ponavadi naredimo s tranzistorjem, v zadnjem času so
popularni FET tranzistorji, zato bomo prikazali vezavo FET-ov. Pri programiranju bodimo pozorni:
NFET vklapljamo z logično 1, PFET pa z logično 0.
Bascom AVR začetni tečaj, marec 2008 19
Vezava LDC prikazovalnika
V tem seminarju bomo predstavili uporabo 2x16 LCD prikazovalnika, ki je nekako najbolj razširjen. Vsi
tekstovni zasloni, ne glede na velikost, se priklapljajo enako, potrebno pa je preveriti v dokumentaciji
posameznega zaslona, kje imajo pine za krmiljenje, saj razpored ni povsem standarden (predvsem kje
je pin 1, pini v nadaljevanju so navadno po standardnem razporedu).
Če ima zaslon za priklop 16 pinov, sta pina 15 in 16 navadno uporabljena za priklop osvetlitve
zaslona.
Navadno tekstovni LCD uporabljamo v t.i. 4 bitnem načinu, kjer imamo med kontrolerjem in
zaslonom 6 linij: 4 data linije, enable in reset. Obstaja pa tudi 8 bitni način naslavljanja, kjer imamo 8
data linij ter enable in reset (torej skupno 10 linij).
20 Bascom AVR začetni tečaj, marec 2008
Krmiljenje DC motorja
DC motor lahko krmilimo zgolj preko tranzistorja (vklop/izklop), če pa želimo nadzorovati tudi smer
vrtenja pa ga najlažje krmilimo preko namenskega vezja L272M. Omenjeno integrirno vezje omogoča
krmiljenje izhoda z maksimalnim tokom 1A, pred preobremenitvijo pa je zaščiten tudi s posebnim
vezjem, ki izklopi izhod, če se vezje pregreje.
Bascom AVR začetni tečaj, marec 2008 21
Uporaba izhodov
Gregor Maček
Mikrokontrolerji imajo različno število vhodov in izhodov. Navadno je v portu, ki ga označujemo s črko, 8 vhodov/izhodov (lahko tudi manj). Tako imamo, na primer, v portu A pine 0 do 7, ki jih potemtakem deklariramo kot PA.0, PA.1 ... PA.7. Posamezen pin ima lahko zgolj funkcijo logičnega vhoda ali izhoda (0/1), lahko pa taisti pin omogoča še druge funkcije. Dodatne funkcije pinov vidimo v datasheetu posameznega mikroprocesorja – tu si kot primer oglejmo pinout Mega128:
Za informacije o dodatnih funkcijah posameznih pinov imamo v datasheetu vsak register posebej detajlno opisan. Ko pišemo program, moramo najprej konfigurirati posamezne porte/pine tako, da prevajalnik ve, ali bomo posamezni pin/port uporabili kot vhod ali kot izhod. Izhode konfiguriramo z ukazom CONFIG: Config Porta = Output 'Lahko nastavimo cel register kot output Config Portb.0 = Output 'Lahko pa tudi zgolj posamezni pin iz registra Config Portb.1 = Output
22 Bascom AVR začetni tečaj, marec 2008
Z ukazom SET postavimo izhod na 1 (izhod na logični 1; +5V), z RESET pa na 0 (izhod na logični 0 - GND). Naredimo enostavno zanko, kjer bo LED dioda na portu A.0 utripala: Do 'Začetek zanke Set Porta.0 'Vklopim LED Wait 1 'Počakam sekundo (ukaz wait; lahko tudi waitms ali waitus, max. vrednost pri posameznem ukazu je 255!) Reset Porta.0 'Izklopim LED Wait 1 'Počakam sekundo Loop 'Se vrnem na začetek zanke
Direktno naslavljanje V določenih primerih je nastavljanje porta po posameznih pinih zamudno. In tudi nepotrebno... Uporabimo lahko namreč ukaz za direktno naslavljanje &B: Do Porta = &B00000000 'Biti od 0-7 v portu A so izklopljeni Wait 1 Porta = &B11111111 'Biti od 0-7 v portu A so vklopljeni Wait 1 Loop
Sedaj lahko naredimo enostavni light-show s poljubnim zaporedjem utripanja in poljubno hitrostjo, na primer: Do Porta = &B01010101 Waitms 250 'Maksimalna vrednost za wait/waitms-/waitus je 255 Waitms 250 'zato za čas 500ms uporabimo 2 ukaza waitms 250 Porta = &B10101010 Waitms 250 Waitms 250 Loop
Bascom AVR začetni tečaj, marec 2008 23
Uporaba vhodov
Gregor Maček
Najprej moramo v programu konfigurirati posamezne porte/pine tako, da prevajalnik ve, ali bomo
posamezni pin/port uporabili kot vhod ali kot izhod. Vhode tako kot izhode konfiguriramo z ukazom
CONFIG:
Config Porta = Input 'Lahko nastavimo cel port kot output
Config Portb.0 = Input 'Lahko pa tudi zgolj posamezni pin iz porta
Da bomo lahko gledali spremembe, potrebujemo tudi kakšen izhod...
Config Portc = Output
Branje vhoda z ukazom IF-Then
Najenostavneje beremo stanje vhoda z IF stavkom. Naredimo program, ki prižge LED na pinu C.0, če
pritisnemo tipko na pinu B.0
Do If Pinb.0 = 1 Then 'Pogojni stavek: če je pin B.0 na stanju 1 (+5V - tipka stisnjena), potem ... Set Portc.0 'prižgem LED diodo na C.0 ... Else '... sicer ... Reset Portc.0 'ugasnem LED diodo na C.0 End If 'Konec pogojnega stavka Loop
Slabost omenjene rešitve je, da tipka lahko pri pritisku/spustu odskakuje in v aplikacijah, kjer štejemo
število pritiskov itd. lahko dobimo napačen rezultat. Problem lahko rešimo tako, da po prvem
prebiranju tipke počakamo nekaj časa in nato še enkrat preverimo stanje tipke in šele če obe stanji
sovpadata, izvršimo dejanje.
Do If Pinb.0 = 1 Then Waitms 50 'malo počakamo If Pinb.0 = 1 Then 'ponovno preverimo stanje in če je tipka še vedno pritisnjena... . . . 'naredimo željeno operacijo End If End If Loop
24 Bascom AVR začetni tečaj, marec 2008
Branje vhoda z ukazom DEBOUNCE
Bascom pa omogoča taisto zadevo še enostavneje, s posebnim ukazom "debounce" – ta ukaz ob
pritisku tipke samodejno počaka prednastavljeno časovno periodo, nato stanje tipke preveri še
enkrat in vkolikor ugotovi, da je tipka dejansko pritisnjena, skoči na nastavljeni kazalec oz. v
podprogram (če je dodan še SUB parameter):
Config portb.0 = input 'Port b.0 konfiguriramo kot vhod Config portc.0 = output 'Port c.0 konfiguriramo kot izhod Config Debounce = 40 'Najprej konfiguriramo čas, po katerem je pritisk tipke veljeven; v tem primeru 40ms
Main: 'Kazalec glavne zanke Do 'Zanka za preverjanje pritisnjene tipke Debounce Pinb.0 , 1 , Program 'Sintaksa: pin, stanje za aktiviranje, 'podprogram, kamor naj skočim ob 'izvršenem pogoju Loop Program: 'Podprogram, kamor skočim ob pritisku na tipko Set Portc.0 'Prižgem in ugasnem LED na C.0 Wait 1 Reset Portc.0 Goto Main 'Vrnem se nazaj v glavno zanko
V programih se GOTO ukaza skušamo izogibati, saj potek programa z več GOTO ukazi postane zelo
nepregleden; rajši uporabimo skok podprogram, iz katerega se z ukazom RETURN vrnemo tja, s kjer
smo skočili:
Config portb.0 = input 'Port b.0 konfiguriramo kot vhod Config portc.0 = output 'Port c.0 konfiguriramo kot izhod Config Debounce = 40 'Najprej konfiguriramo čas, po katerem je pritisk tipke veljeven; v tem primeru 40ms Do 'Zanka za preverjanje pritisnjene tipke Debounce Pinb.0 , 1 , Program , Sub Loop Program: 'Podprogram, kamor skočim ob pritisku na tipko Set Portc.0 'Prižgem in ugasnem LED na C.0 Wait 1 Reset Portc.0 Return 'Vrnem se nazaj v glavno zanko
Bascom AVR začetni tečaj, marec 2008 25
Uporaba tekstovnega LCD zaslona
Gregor Maček
Konfiguracija zaslona
Zaslon moramo najprej konfigurirati - Bascomu povedati, katere pine uporabljati. To storimo v
Options - Compiler – LCD. Navadno moramo nastaviti le tip - velikost LCDja ter katere priključke
uporabljamo. Ostale nastavitve pustimo takšne, kot so.
V samem začetku programa zaslon "pobrišemo" z ukazom CLS in izklopimo kurzor (če ga ne rabimo):
Cls 'Pobrišemo zaslon Cursor Off 'Izklopimo prikaz kurzorja
Sedaj lahko na zaslon izpišemo enostaven tekst. To storimo z ukazom LCD
Izpis na zaslon – ukaz LCD Lcd "Testiranje"
Če sedaj pošljemo še en tekst, se začne pisati tam, kjer se je pisanje prvega nehalo:
Lcd "Nadaljujem"
Tega navadno ne želimo. Zato lahko, če želimo izpisati nov zaslon, le-tega najprej pobrišemo in nato
zapišemo
Cls Lcd "Nadaljujem 2"
Pozicioniranje teksta na zaslon – ukaz LOCATE
ali pa povemo, na kateri poziciji zaslona želimo pisati z ukazom LOCATE Y , X. Če želimo npr. izpisati
tekst "test" na 3. polju v 2. vrstici, to storimo tako:
Cls Locate 2 , 3 Lcd "test"
26 Bascom AVR začetni tečaj, marec 2008
Lahko uporabljamo tudi ukaze LOWERLINE, THIRDLINE in FOURTHLINE, s katerimi se
pomaknemo v izbrano vrstico - npr.
Cls Lcd "1. vrstica" Lowerline Lcd "2. vrstica"
Seveda lahko uporabimo prej omenjene ukaze glede na velikost LCD zaslona, ki ga uporabljamo (ne
moremo npr. uporabljati ukaza THIRDLINE pri dvovrstičnem zaslonu).
V samih programih se nam dostikrat pojavi problem, ker se določen tekst na zaslonu ne izpiše.
Najpogosteje je vzrok temu program, ki teče v zanki in v kateri imamo tudi ukaz CLS, ki zaslon izbriše.
Ker zanka teče zelo hitro, izpisanega teksta ne vidimo, saj je prej izbrisan. Pri vsakem brisanju zaslona
(CLS) zaslon tudi utripne, zato se ukaza CLS v zanki poskusimo čimbolj izogibati in raje tekste in
spremenljivke zgolj prepisujmo (uporabimo tudi ukaz LOCATE).
Sedaj smo prikazovali statično vsebino - v narekovajih. Pri prikazu spremenljivk je zadeva podobna, le
da spremenljivko ne napišemo v "narekovaje"
Dim A As Byte A = 0 Cls Do Incr A 'povečam A za 1 (isto kot bi napisal A = A + 1) Locate 1 , 1 Lcd A Wait 1 Loop Until A = 30
Premik teksta po zaslonu v levo ali desno – ukaz SHIFTLCD
Z ukazoma SHIFTLCD lahko vsebino zaslona premikamo po zaslonu levo/desno
A = 1 'spremenljivka za premikanje Cls Lcd “Tekst na LCD” For A = 1 To 10 Shiftlcd Left 'premikamo v levo .... 'Shiftlcd Right '... ali desno ... Wait 1 'vsako sekundo za 1 znak Next
Bascom AVR začetni tečaj, marec 2008 27
Kreiranje lastnih znakov
V kolikor želimo kreirati kakšen poseben znak, ki ni v ASCII tabeli, to lahko storimo z Bascom orodjem
LCD designer: Tools -> LCD Designer Še prej se postavimo v prazno vrstico programa, kjer bo nato
vnešena koda za nov znak; najbolje, da je to v začetku programa (poleg konfiguracije zaslona). Odpre
se nam okno, kjer lahko s klikanjem naredimo željen znak. Ko kliknemo OK, se nam v izbrano vrstico
izpiše naslednja koda: (variira glede na narejeni karakter)
Deflcdchar ?,16,16,8,8,4,4,3,3' replace ? with number (0-7)
Vprašaj moramo zamenjati za številko od 0 do 7 (kreiramo lahko 8 svojih znakov),
torej naredimo npr.
Deflcdchar 1 , 32 , 7 , 5 , 7 , 32 , 32 , 32 , 32 'znak za stopinje
Prikaz takšnega znaka v programu naredimo z ukazom LCD CHR(?), torej:
Lcd Chr(1)
Izpis v tekstu pač naredimo povsem navadno, kot izpis na LCD:
Lcd "Temp je 12" : Lcd Chr(1) : Lcd " Celzija"
Zgornji program izpiše: Temp je 12° Celzija
Pri čemer smo znak za stopinje naredili sami.
Vloga dvopičja je ista kot da bi pisali vsako postavko v novo vrstico, le pregledneje je tako.
Inicializacija zaslona med delovanjem programa – ukaz INITLCD Vkolikor naredimo aplikacijo, kjer LCD priklopimo zgolj občasno (npr. ko želimo preveriti določene
parametre), nam le-ta pri »on-line« priključitvi ne bo deloval. Vzrok temu je to, da zaslon ni
inicializiran, kar se zgodi ob zagonu programa (Bascom prevede kodo tako, da v začetek programa
postavi tudi inicializacijo samega displaya tudi, če INITLCD ne uporabomo).
Če pa v program vključimo omenjeno funkcijo, se zaslon inicializira tudi tekom delovanja programa
in ga potemtakem lahko priključimo med delovanjem same aplikacije.
28 Bascom AVR začetni tečaj, marec 2008
Komunikacija – UART pošiljanje
Gregor Maček
Za komunikacijo s perifernimi napravami (GSM modem, GPS ...) največkrat uporabljamo UART
vmesnik. UART je kratica za universal asynchronous receiver/transmitter - torej univerzalni asinhroni
prenos (pošiljanje/sprejem) podatkov. Več o samem standardu lahko zveste na Internetu.
RS-232 protokol
S pretvorniki (npr. MAX232, MAX485) lahko napetosti prilagodimo aplikaciji, ki jo delamo. Za kratke
razdalje lahko uporabljamo kar direkten priklop UART <-> UART, vkolikor pa imamo vmes daljše kable
ali v okolju motnje, uporabimo napetostni pretvornik.
Kot primer uporabimo MAX232, s katerim dosežemo nivoje, potrebne za RS232 komunikacijo
(Reccomended Standard 232), ki navadno uporablja +/-22V napetostne nivoje. Ker prenašamo višje
napetosti je tudi vpliv motenj na samo komunikacijo manjši. RS232 je tudi vmesnik, ki ga imamo
največkrat na razvojni plošči...
Bascom AVR začetni tečaj, marec 2008 29
AVR mikroprocesorji imajo navadno 1 UART vmesnik (TX/RX), določeni večji modeli pa tudi po več (2
ali celo 4). Mi se bomo tokrat omejili le na en vmesnik, prav nič bistveno bolj pa ni komplicirana
uporaba dveh ali več.
Komunikacijske nastavitve v Bascomu
V Bascomu moramo najprej nastaviti parametre komunikacije. To storimo v Options -> Compiler ->
Communication.Tu izberemo hitrost, s katero želimo komunicirati (baudrate) in nastavimo frekvenco
procesorja. Vkolikor uporabljamo interni oscilator (1/4/8 MHz) nastavimo to vrednost, če pa
uporabljamo kristal, pa nastavimo frekvenco kristala. Če se malo igramo z nastavitvami, vidimo da je
faktor napake najmanjši (oz. ga sploh ni) pri frekvenci kristala 11,059MHz. Vkolikor uporabljamo
drugo frekvenco, je vedno neka napaka (ki se seveda veča z višanjem hitrosti prenosa), a vrednosti
pod 5% so največkrat sprejemljive. Vse omenjene nastavitve lahko vpišemo tudi direktno v program
in tako vpisane imajo prednost pred nastavitvami, izbranimi v meniju. Ravno tako lahko v sam
program vključimo ostale informacije (o procesorju, pinih LCDja itd.) Primer:
$regfile = "m16def.dat" $crystal = 8000000 $baud = 19200 $hwstack = 32 $swstack = 8 $framesize = 24
Torej, ko smo opravili nastavitve komunikacije, poskusimo nekaj poslati na UART oziroma RS-232
izhod (na razvojni plošči je že MAX232, ki poskrbi za pretvorbo napetostnih nivojev). To storimo z
enostavnim ukazom PRINT.
Pošiljanje podatkov – PRINT
Da bomo imeli kje spremljati komunikacijo, bomo RS232 vmesnik na razvojni plošči morali povezati z
RS232 vmesnikom na računalniku. Kabel mora biti t.i. crossover – TX pin (izhod) mora biti povezan z
RX pinom(vhod) računalnika in obratno. Potem lahko komuniciramo z uporabo HyperTerminala (del
Windows XP) oz. uporabimo naprednejši program kot je npr. Brayev terminal. Slednji je priporočljiv
tudi zato, ker HyperTerminal ne pokaže vsega, kar se dogaja na ravni protokola (CR, LF ...).
Do Print "Posiljam podatke preko RS232 vmesnika" Wait 3 Loop
Zgornji program vsake 3 sekunde pošlje omenjeno sporočilo na RS232 port in v kolikor imamo
računalnik pravilno nastavljen (izbran pravilni port in hitrost) ter pravilno narejeno povezavo se le to
prikaže v oknu programa.
30 Bascom AVR začetni tečaj, marec 2008
Prazno vrstico enostavno kreiramo s praznim ukazom PRINT, torej:
Do Print "test" Print 'prazna vrstica Print "test2" Wait 3 Loop
Če želimo več vrednosti poslati v eni vrstici (brez CR), kot ločilo uporabimo podpičje:
Do Print "test " ; "naprej " ; "v eni " ; "vrstici" Wait 3 Loop
Isto kot pri izpisu na LCD za fiksne vrednosti uporabimo narekovaje, pri pošiljanju spremenljivk pa le-
te izpustimo.
Pošiljanje podatkov v binarni in šesdesetiški obliki
Če želimo izpisati šesdesetiško ali binarno vrednost spremenljivke, to storimo z ukazoma PRINT HEX
oz. PRINT BIN:
Dim A As Byte A = 20 Do Print Bin(A) 'pošljem A kot binarno vrednost Wait 3 Print Hex(A) 'pošljem A kot šesdesetiško vrednost Wait 3 Loop
Bascom AVR začetni tečaj, marec 2008 31
Komunikacija – UART sprejemanje
Gregor Maček
Sprejem podatkov z ukazoma INKEY, WAITKEY
Podatke na UART lahko sprejemamo na različne načine, odvisno seveda od tega, za kakšne podatke
gre.
Dim A As Byte Do A = Inkey() 'čakam na ASCII vrednost na UARTu If A > 0 Then 'če smo nekaj dobili… Print "Dobili smo " ; A ; " (ASCII vrednost)" '… to izpišemo Print "Dejansko pa je to " ; Chr(a) 'in še dejanski znak! End If Loop
Podoben ukaz kot INKEY je tudi WAITKEY, s to razliko, da se v primeru uporabe WAITKEY program na
tem mestu ustavi in stoji, dokler nekaj ne prejmemo.
Sprejem podatkov z ukazom INPUT
Tega ukaza se največkrat poslužimo, če želimo narediti komunikacijo med Hyperterminalom in našo
aplikacijo z namenom spreminjanja parametrov sistema itd. Program
Dim A As Word Dim C As Integer Dim S As String * 15 Do Input "Vpisite spremenljivko A: " , A Print "Spremenljivka A je: " ; A
Wait 3
Input "Vpisite tekst S" , S Print "Napisali ste tekst: " ; S Wait 3 Loop
32 Bascom AVR začetni tečaj, marec 2008
Multipleksiranje – 7 segmentni LED
Vilko Sustič
Svetleča dioda sveti, če teče skozi njo tok v prevodni smeri. Običajno tok sklenemo in prekinjamo na
strani katode, tako da potencial katode damo na 0V, med tem ko je anoda vezana na stalni vir
energije +5V.
POZOR, na slikah ni narisan upor, ki se veže v serijo z diodami, za omejitev toka, kajti 5V je
previsoka napetost za diodo in bi jo prežgala. Sheme v tem dokumentu obravnavajte samo za
razlago delovanja.
Tok pa lahko prekinjamo tudi na strani anode, ali na obeh straneh
Na strani anode si pomagamo s PNP tranzistorjem, ki ga odpremo z tokom skozi bazo, ki ga ustvarimo
tako, da damo drugo stran upora na nizek potencial 0V . Da bo dioda svetila morata torej biti oba
izhoda iz mikroprocesorja na nizkem potencialu.
Ta koncept uporabimo, kadar želimo upravljati z velikim številom diod:
Bascom AVR začetni tečaj, marec 2008 33
Uporabili smo 8 + 4 = 12 izhodov mikroprocesorja, in upravljamo z 8 x 4 = 32 diodami. Lahko
prižgemo katerokoli diodo, če le pravilno vzbujamo izhode s katerimi krmilimo potenciale na diodah.
Problem postane, kadar bi radi, da bi svetilo več diod hkrati. To se da samo takrat, če so diode, ki naj
bi hkrati svetile bodisi v isti vrstici, bodisi v isti koloni.
Oglejmo si vezje Minipin plošče. Na njej so štirje 7-segmentni prikazovalniki, od katerih ima vsak 8
diod in vse imajo skupno anodo, prav tako, kot ima 8 diod vezano skupaj anode na zgornji sliki.
Katode so speljane ven, vsaka za en segment in ena za diodo, ki predstavlja
decimalno piko. Vsaka dioda ima tudi svoje ime, pravzaprav črko:
.
Iz sheme lahko vidimo, kam so vezane katode posameznih diod in naredimo sledečo tabelo:
Dioda Port 0 1 2 3 4 5 6 7 8 9
A Portb.7 x x x x x x x x
B Portb.1 x x x x x x x
34 Bascom AVR začetni tečaj, marec 2008
C Portb.5 x x x x x x x x
D Portb.4 x x x x x x x
E Portb.2 x x x x x
F Portb.3 x x x x x x x
G Portb.0 x x x x x x x
Dp Portb.6
Nič pa ne bo narobe, če se o tem prepričamo. Naredimo si program, ki bo dajal na 0V ciklično vsak
portpin posebej, in istočasno bomo odprli tok skozi enega od tranzistorjev:
Reset Portd.7
Do
For I = 0 To 7
Portb = 255
Portb.i = 0
Wait 3
Next
Loop
Seveda moramo jumperje na Minipin plošči tudi pravilno postaviti, sicer ne bo nič videti. In potem
poženemo program vaja2.bas:
Config Portb = Output ' dodamo/vklopimo 7seg displey na PD.7 Config Portd.7 = Output Reset Portd.7 Do Dim I As Byte For I = 0 To 7 Portb = 255 Portb.i = 0 Wait 3 Next Loop 'Zgraditi moramo tabelo za prevajanje - lookup tabelo. 'Kako ? Obrezložim na primeru: 'Želimo prikazati recimo številko 1 'Da bo vidna številka ena, morata goreti diodi, ki odgovarjata pinom 1 in 5 'Odgovarjajoča pina morata biti na 0 ostali na 1 torej: 'Torej če so pini 7 6 5 4 3 2 1 0 ' 1 1 0 1 1 1 0 1 ' ali heksa D D &HDD ' 'Tako dobljene konstante, ki izvirajo iz samega vezja sestavim v tabelo. 'Zaporedje se mora začeti z kombinacijo, ki odgovarja ničli, in nato po ena 'naprej:
Bascom AVR začetni tečaj, marec 2008 35
' 'Minipin7seg: 0 1 2 3 4 5 6 7 'Data &H41 , &HDD , &H64 , &H4C , &HD8 , &H4A , &H42 , &H5D 8 9 A B C D E F 'Data &H40 , &H58 , &H50 , &HC2 , &H63 , &HC4 , &H62 , &H72
To, kar vidimo, mora odgovarjati načrtu. Vendar ne odgovarja, ker sem pri prenašanju načrta v
tabelo namerno naredil napako, prosim popravite jo.
Če vežete v vašem projektu diode drugače, boste pač tudi krmilili malo drugače.
In sedaj moramo doseči, da na 7-segmentnem prikazovalniku ne bo svetila samo ena dioda, temveč,
da bodo svetile vse tiste diode, ki bodo skupaj optično pričarale vsebino, ki jo želimo prikazati. Če
želimo prikazati enojko, morata svetiti diodi B in C, če hočemo prikazati trojko, potem morajo svetiti
diode A,F,G,E,D. in tako naprej za vse znake, ki jih želimo prikazati. Kako to naredimo?
Za vsako vrednost spremenljivke, ki jo želimo prikazati, se pravi od 0 do 9, no morda do 15, naredimo
bajt, ki ima odgovarjajoče bite na 0, ostale bite na 1.
Razložim na primeru enice:
Pri enici naj svetita samo diodi B in C, ki sta vezani na Portb.1 in Portb.5
Portb ima osem bitov ki so numerirani tako :
7 6 5 4 3 2 1 0 in vsebina le teh za enico bodi:
1 1 0 1 1 1 0 1 kar heksadecimalno zapišemo kot
D D
Tako moramo priti do vsej 10 (ali 15) konstant in jih postavimo v vrsto:
Minipin7seg:
' 0 1 2 3 4 5 6 7
Data &H41 , &HDD , &H64 , &H4C , &HD8 , &H4A , &H42 , &H5D
' 8 9 A B C D E F
Data &H40 , &H58 , &H50 , &HC2 , &H63 , &HC4 , &H62 , &H72
In potem z lookup ukazom potegnemo iz te vrste tistega, ki odgovarja spremenljivki:
Portb = Lookup(i , Minipin7seg)
Preverimo to s programom vaja3.bas:
Dim I As Byte
Dim J As Byte
Dim K As Byte
36 Bascom AVR začetni tečaj, marec 2008
Dim L As Byte
Dim S As String * 16
Config Portb = Output
'dodamo 7seg displey na PD.7
Config Portd.7 = Output
Reset Portd.7
Do
For I = 0 To 15
Portb = Lookup(i , Minipin7seg)
' lookup ukaz potegne iz tabele tisto vrednost, ki odgovarja po
' zaporedju
' vrednosti argumenta lookup ukaza, torej spremenljivki i
Wait 2
Next
Loop
Minipin7seg:
' 0 1 2 3 4 5 6 7
Data &H41 , &HDD , &H64 , &H4C , &HD8 , &H40 , &H42 , &H5D
' 8 9 A B C D E F
Data &H40 , &H58 , &H50 , &HC2 , &H63 , &HC4 , &H62 , &H72
S programom preverimo, ali smo tabelo pravilno sestavili. V tabeli je namerna napaka, in prosim
popravite jo!
Potem, ko smo popravili tabelo, gremo naprej, želimo prikazati kaj več, kot samo eno mesto!
Na vsa 4 mesta prikazovalnika bomo dali neko vsebino:
Vaja4.bas:
Dim I As Byte
Dim J As Byte
Dim K As Byte
Dim L As Byte
Dim S As String * 16
Config Portb = Output
'dodamo 7seg displey na PD.7
Config Portd = Output
Bascom AVR začetni tečaj, marec 2008 37
Do
For I = 0 To 3
Portb = Lookup(i , Minipin7seg)
Portd = 255
If I = 0 Then Reset Portd.4
If I = 1 Then Reset Portd.5
If I = 2 Then Reset Portd.7
If I = 3 Then Reset Portd.3
Wait 1
'Eksperimentiraj Z Različnimi Zakasnitvami
Waitms 5
Next
Loop
Minipin7seg:
' 0 1 2 3 4 5 6 7
Data &H41 , &HDD , &H64 , &H4C , &HD8 , &H4A , &H42 , &H5D
' 8 9 A B C D E F
Data &H40 , &H58 , &H50 , &HC2 , &H63 , &HC4 , &H62 , &H72
Sedaj se prikazovalniki prikazujejo eden po eden po vrsti. Če zakasnitveni čas primerno zmanjšamo,
bo oko videlo, kot da delajo vsi hkrati, in to vztrajnost očesa uporabimo pri kot rečemo
mulitpleksiranemu krmiljenju 7-segmentnih prikazovalnikov.
Vendar prikazati moramo neko vsebino! Prikažimo vsebino spremenljivke I!
' V zanki iz spremenljivke i napolnimo spremenljivke tis, sto, des in eni
' in le te prikažemo:
Eni = I Mod 10
Des = I Mod 100
Des = Des / 10
Sto = I Mod 1000
Sto = Sto / 100
Tis = I / 1000
For K = 0 To 3
Portb = Lookup(i , Minipin7seg)
Portd = 255
If K = 0 Then ' vsak displej posebej vklopimo
Reset Portd.4
' in za vsako mesto vzamemo svojo vrednost za prikaz:
Portb = Lookup(tis , Minipin7seg)
End If
If K = 1 Then
Reset Portd.5
Portb = Lookup(sto , Minipin7seg)
End If
38 Bascom AVR začetni tečaj, marec 2008
If K = 2 Then
Reset Portd.7
Portb = Lookup(des , Minipin7seg)
End If
If K = 3 Then
Reset Portd.3
Portb = Lookup(eni , Minipin7seg)
End If
'Wait 2 experimentiraj z različnimi zakasnitvami
Waitms 5
Next
In dodamo še preprosto spreminjanje vrednosti spremenljivke I .
Če pritisnemo tipko, se vrednost poveča za 1:
Tipka1 Alias Pind.0
Config Pind.0 = Input
Debounce Tipka1 , 0 , Dodaj
Goto Preskok2
Dodaj:
Incr I
Preskok2:
Opazimo, da s pritiskom na tipko malo zmotimo prikazovanje, svetloba prikazovalnikov utripne. Se da
to popraviti? Izboljšati? Odgovor je seveda ja.
A v ta namen si moramo pomagati z časovno prekinitvijo, timer interruptom. Mikroprocesor ima
napravo, časovnik ali angleško timer. Le ta sicer ne meri časa, temeč utripe kristala oziroma
oscilatorja, ki poganja mikroprocesor, kar je pravzaprav nekaj podobnega.
Bascom AVR začetni tečaj, marec 2008 39
Zaenkrat se ne bomo spuščali v veliko teorijo o tem, temveč si bomo pomagali s programom ki ga je
prijazno dal brezplačno na voljo gospod Ian Dobson. V okno ki izgleda tako:
Vtipkamo frekvenco kristala ali oscilatorja in želeni čas prekinitve in že nam ponudi bascom avr kodo,
ki jo iščemo:
40 Bascom AVR začetni tečaj, marec 2008
To kodo enostavno prenesemo v naš program. Seveda pa moramo sami napisati v časovno
prekinitveni podprogram, kaj naj naredi.
Naš prekinitveni podprogram naj prikaže eno dekado, in se vrne, drugič drugo in tako naprej.
' PREKINITVENI PODPROGRAM – Vaja 6
Timer0_isr:
Load Timer0 , Timer0reload
' V prekinitveni rutini vsakokrat prikažemo eno od 4 številk
' in to neodvisno od dela glavnega programa, zato ni utripanja, kadar
' glavni program dela kaj drugega
Dim Tis As Word 'Tisočice
Dim Sto As Word 'Stotice
Dim Des As Word 'Desetice
Dim Eni As Word 'Enice
'Iz spremenljivke i napolnimo spremenljivke tis, sto, des in eni
' in le te prikažemo:
Eni = I Mod 10
Des = I Mod 100
Des = Des / 10
Sto = I Mod 1000
Sto = Sto / 100
Tis = I / 1000
Incr K
If K > 3 Then K = 0
Portb = Lookup(i , Minipin7seg)
Portd = 255
If K = 0 Then
' vsak displej posebej vklopimo
Reset Portd.4
' in za vsak displej vzamemo svojo vrednost za prikaz
Portb = Lookup(tis , Minipin7seg)
End If
If K = 1 Then
Reset Portd.5
Portb = Lookup(sto , Minipin7seg)
End If
If K = 2 Then
Reset Portd.7
Portb = Lookup(des , Minipin7seg)
End If
If K = 3 Then
Reset Portd.3
Portb = Lookup(eni , Minipin7seg)
End If
Return
Glavni program sedaj se ne ukvarja več z prikazovanjem na 7 segmentne prikazovalnike, temveč se
ukvarja za bistvenimi zadevami, rezulat da v spremenljivko I, prikazovanje le te pa opravi
podprogram. Opazimo sedaj, da pritisk na tipko ne zaustavlja prikazovanja in svetloba ob pritisku na
tipko ne utripne.
Bascom AVR začetni tečaj, marec 2008 41
Prekinitve (Interrupti)
Vilko Sustič
Mikroprocesorji omogočajo prekinitve delovanja glavnega programa. Zakaj? Včasih je nujno
potrebno narediti kako malenkost takoj, in ne čakati, da bo mikroprocesor po programu zaključil
nekaj, za kar potrebuje še nekaj časa, kajti takrat zna biti prepozno. Zato je prekinitev vedno vezana
na mali podprogram, v katerem smo programirali, kaj je potrebno tako nujno narediti. Prekinitev je
povzročena lahko na različne načine, lahko je časovna prekinitev, ki nastopi, ko mine določen čas,
lahko je zunanja prekinitev, ki nastopi ob spremembi nivoja napetosti na kakem vhodu
mikroprocesorja (port-pinu), lahko se proži, ko UART zazna in prebere nek bajt, ki pride po
komunikacijski liniji v mikroprocesorski medspomin – buffer.
V splošnem velja, da se prekinitev izvede tako, da se najprej spravi vse bistvene podatke o dogajanju
v mikroprocesorju zaradi delovanja glavnega programa na odložišče (stack) in se šele potem požene
prekinitveni podprogram. Ko prekinitveni program zaključi svoje delo z ukazom Return, se potem iz
odložišča spet napolnijo vsi registri mikroprocesorja in glavni program nadaljuje svoje delo, kot da se
ni nič zgodilo. No, je pa preteklo nekaj časa, in že samo to dejstvo lahko slabo vpliva na delovanje
glavnega program, če recimo glavni program v tem času ni opazil kake bistvene spremembe, ki bi jo
bil moral upoštevati. Zato velja načelo: prekinitveni podprogram bodi v načelu čim bolj kratek, naj
odvzame čim manj časa glavnemu programu.
Prekinitev bomo uporabili tudi v kasnejšem programu za prikazovanje na 7-segmentnem
prikazovalniku. Pa nadaljujmo kar z časovno prekinitvijo ali timer-interruptom.
Časovnik ni pravzaprav nič drugega kot števec impulzov, ki prihajajo na vhod števca. Le ti so običajno
kar impulzi istega oscilatorja, ki poganja mikroprocesor, ali pa impulzi, ki prihajajo iz zunanjega vira
preko vhodov T0 ali T1 (PB0 ali PB1) To smo že uporabili pri prejšnjem poglavju o multipleksiranju.
Vaja1.bas program v novi varianti, ki prikazuje vsebino števca sekund na 7-segmentni prikazovalnik in
vsak pritisk na tipko zaustavi ali požene štetje. Ker merimo sekunde z ukazom wait 1 tisti čas, ko je
program v zanki, ki jo povzroči wait, ne zazna pritiska tipke.
42 Bascom AVR začetni tečaj, marec 2008
Vaja2.bas pa odtipava tipko s pomočjo externega interrupta. Definiramo:
Config Int0 = Falling
On Int0 Int0_int
Enable Int0
Sedaj ni problema z detektiranjem tipke, saj kadarkoli pritisnemo tipko, program takoj reagira. Toda
še vedno je problem tako natančnega štetja, kot tudi zaustavljanja štetja v trenutku, ko velja wait 1.
V vaja3.bas smo odpravili tudi to slabost. Da dokažemo, smo se odločili šteti kar stotinke sekunde in
imamo sedaj neke vrste uro štoparico. Za štetje časa smo zadolžili kar prekinitveni podprogram, ki je
dolžan prikazovati številke na 7-segmentni prikazovalnik.
Glavni program sedaj ne dela drugega, kot da popravi šteto vrednost. In sedaj ga lahko obremenimo
še z drugimi nalogami, ki ne bodo zaustavljane z raznimi wait ukazi.
V programu vaja4.bas smo iz te ure naredili merilnik odzivnega časa. Ko je števec na 0, tedaj gremo v
čakanje za neznano število sekund. To število dobimo z ukazom
J = Rnd(17)
Funkcija Rnd nam da slučajnostno število nekje med 0 in v funkciji omenjeno zgornjo mejo.
Ko preteče ta slučajnostni čas, se meritev začne, kar vidi testiranec tako, da začne teči prikaz na prikazovalniku. Sedaj mora čim hitreje pritisniti tipko in s tem ustaviti štetje, in odmerjeni čas si potem lahko na prikazovalniku ogleda.
Bascom AVR začetni tečaj, marec 2008 43
1-wire protokol in termometer DS1820
Vilko Sustič
Termometer spada v družino 1wire. To je Dallasov način povezovanja in napajanja elementov po eni
sami žici.
Ista žica lahko služi za napajanje, kot tudi za komunikacijo. Ko ne komuniciramo, je žica na high,
visoko, in napaja naprave, ki si energijo akumulirajo, tako da so napajane še tisti čas, ko signal na žici
utripa v ritmu komunikacije.
Naprave, ki jih je na žici lahko več, ločimo med seboj po unikatni identifikacijski oznaki, ki je vpisana v
ROM naprave, termometra na primer in jo moramo poznati, če priključimo na žico več kot eno
napravo.
44 Bascom AVR začetni tečaj, marec 2008
Časovni diagrami, ki se jih je potrebno držati, da je komunikacija uspešna, so dovolj zapleteni in
določeni:
A za programerja, ki programira v Bascomu, za vse to poskrbi Bascom sam. Drugače je za
programerja, ki programira v zbirniku, assemblerju. Programer v Bascomu mora samo toliko biti
previden, da ne zavira izvajanje programa s kakimi prekinitvenimi podprogramu, kajti to lahko
pokvari časovni potek komunikacije, kadar se ta izvaja v glavnem programu.
Merjenje temperature gre tako: Najprej zahtevamo, da DS1820 izmeri temperaturo in si rezultat
spravi v svoj pomnilnik.
1wreset
1wwrite &HCC 'skip ROM – velja za vse, ki ste na liniji
1wwrite &H44 'merite temperaturo
Wait 1 'dajem vam čas za merjenje
Ko DS1820 prejme tak ukaz, potrebuje energijo za delo, ki jo dobi tako, da mi držimo signal visok. Čas
je lahko različen, a največ časa, ki ga za to potrebuje je 750msec. Ko preteče ta čas, damo ukaz: daj
nam meritev.
1wreset 'reset
1wwrite &HCC 'skip ROM – velja za vse, a je samo eden na liniji
1wwrite &HBE 'dajte podatke
Podatek o temperaturi dobimo v polovičkah stopinje in ga daje v obliki dveh bajtov
Bascom AVR začetni tečaj, marec 2008 45
T = 1wread(2) 'Beremo podatke, prva dva bajta sta temperatura
' T je tipa integer
1wreset
T = T / 2 'Temperaturo dobimo v polovičkah stopinje
Program DS1820-1 je primer branja temperature, če je na liniji en sam termometer
Program DS1820-2 je izboljšan v toliko, da uporablja timer namesto wait za zagotavljanje potrebnega
časa za konverzijo rezultata v DS1820
Program DS1820-3 je izboljšan v toliko, da bere celotno vsebino, ki jo daje DS1820 in preverja
dobljeno vsebino po CRC8 Vsebina, ki jo dobimo je:
Če želimo imeti več termometrov, potem potrebujemo za vsak termometer njegovo identifikacijo.
Dobimo jo tako, da vsak termometer posebej priključimo, poženemo program DS1820-4 in
informacijo, ki jo dobimo, prenesemo v program, ki bo zahteval temperaturo od konkretnega
termometra.
Program DS1820-5 je primer branja temperature konkretnega termometra
Program DS1820-6 je primer branja temperature iz treh termometrov
Beri tudi Bascp, AVR Help 'Using the 1 WIRE protocol'
46 Bascom AVR začetni tečaj, marec 2008
Stack – odložišče
Vilko Sustič
Morda beseda odložišče ni najboljša, toda smatram, da primerno pomensko odgovarja, kar bomo
videli, ko si bomo ogledali stack - odložišče v funkciji.
V splošnem se programerji ne ukvarjamo dosti s tem orodjem, uporablja ga mikrokrmilnik sam,
(hardware stack) oziroma Bascom sam, (software stack). Nerodno je le to, da nam o tem dosti ne
pove, in če v ta namen določen prostor v pomnilniku (RAM-u) ni dovolj velik, se dogode
nepredvidljive zadeve in program običajno umre brez karkšnekoli diagnoze. Boste videli zakaj.
Najbolj tipična uporaba odložišča je, kadar kličemo v glavnem programu podprogram, ali tudi v
podprogramu še en podprogram. S klicem podprograma, glavni program, ali program višjega nivoja
preda upravo podprogramu. To lahko naredi večkrat na različnih mestih. Podprogram v splošnem ne
ve, od kod je bil klican. Ve pa, da je glavni program v samem klicu podprograma dal naslov predaje
na odložišče. Ko podprogram reče Return, dejansko skoči na naslov, ki ga najde na odložišču.
Odložišče ali stack si je potrebno predsavljati kot skladovnico, kjer vedno odlagamo na vrh
skladovnice in vedno jemljemo iz vrha, bajt po bajt. Če se pri tem zaporedju zmotimo, dobimo, ko
jemljemo podatke nazaj, napačne vsebine in program gre v maloro. Temu rečemo LIFO , kar je
kratica za Last in – first out, ali tisti ki zadnji pride, prvi odide.
Bascom AVR razlikuje tri delovna področja, ki so razvrščema na sam vrh pomnilnika, hwstack,
swstack in frame.
Bascom AVR začetni tečaj, marec 2008 47
Oglejmo si na programu stack-bas:
$regfile = "m162def.dat" $hwstack = 64 $swstack = 64 $framesize = 64 Dim Reg14 As Iram Byte At 14 Overlay Dim I As Byte Dim J As Byte Dim K As Byte Dim L As Byte Dim M As Word Declare Sub B Declare Sub Sestej(prvi As Byte , Drugi As Byte , Tretji As Byte) Declare Function Vsota(first As Byte , Second As Byte) As Byte I = &H11 J = &H12 K = &H13 L = &H14 M = &H1567 Print "Smo v glavnem programu" Print Hex(i) ; " " ; Hex(j) ; " " ; Hex(k) ; " " Gosub A Print "Smo v glavnem programu" Print Hex(i) ; " " ; Hex(j) ; " " ; Hex(k) ; " " Call B Print "Smo v glavnem programu" Call Sestej(i , J , K) Print "Smo v glavnem programu" K = Vsota(i , J) Print "Smo v glavnem programu" End A: Push R14 Reg14 = I : Push R14 Reg14 = J : Push R14 Print "Smo v podprogramu A" I = &H21 : J = &H22 Print Hex(i) ; " " ; Hex(j) Gosub Aa Print "Smo v podprogramu A" Print Hex(i)
48 Bascom AVR začetni tečaj, marec 2008
Pop r14 : j = Reg14 Pop r14 : I = Reg14 Pop r14 Return Aa: Print "Smo v podprogramu Aa" Gosub Aaa Print "Smo v podprogramu Aa" Return Aaa: Print "Smo v podprogramu AAA" Gosub Aa Return B : Print "Smo v podprogramu B" Return Sub B Print "smo v subrutini B" End Sub Sub Sestej(prvi As Byte , Drugi As Byte , Tretji As Byte) Local Aha1 As Byte Aha1 = 2 Tretji = Prvi + Drugi End Sub Function Vsota(first As Byte , Second As Byte) As Byte Local Bebe1 As Byte Bebe1 = 7 Vsota = First + Second End Function End
Bascom AVR začetni tečaj, marec 2008 49
Ko ga prevedemo si oglejmo poročilo prevajalnika (compilerja). Vedno je priporočljivo, da si
ogledamo poročilo (report) saj v njem dobimo zanimive podatke o našem programu. Poročilo o
našem programu je skrajšano sledeče:
Report : STACK Date : 02-13-2008 Time : 10:59:40 Compiler : BASCOM-AVR LIBRARY V 1.11.8.5 Processor : M162 SRAM : 400 hex EEPROM : 200 hex ROMSIZE : 4000 hex ROMIMAGE : 3F6 hex -> Will fit into ROM ROMIMAGE : 1014 dec FLASH USED : 6 % BAUD : 9600 Baud XTAL : 4000000 Hz BAUD error : 0.16% Stack start : 4FF hex Stack size : 40 hex S-Stacksize : 40 hex S-Stackstart : 4C0 hex Framesize : 40 hex Framestart : 47F hex Space left : 827 dec -------------------------------------------------------------------------------- Variable Type Address(hex) Address(dec) -------------------------------------------------------------------------------- HWSTACK Word 005D 93 SWSTACK Word 001C 28 FRAME Word 0004 4 ERR Bit 0006 6 REG14 000E 14 I Byte 0100 256 J Byte 0101 257 K Byte 0102 258 L Byte 0103 259 M Word 0104 260
Glede na to, da smo definirali:
$regfile = "m162def.dat" $hwstack = 64 $swstack = 64 $framesize = 64
50 Bascom AVR začetni tečaj, marec 2008
in ima mikrokrmilnik najvišji naslov H4FF smo s tem definirali
HWstack od &H4FF do &H4C0 SWstack od &H4BF do &H480 in Frame od &H47F do &H440
Delovanje program si bomo ogledali na simulatorju, ker tam lahko izvajamo instrukcijo po instrukcijo
in si ogledujemo, kaj se dogaja v mikroprocesorju.
Startamo simulator in vidimo nekaj takega:
Simulator krmilimo tako, da nam pokaže naš program in zraven še vsebino pomnilnika-rama.
Program poženemo počasi, korak po korak F8. Opazimo, da se nam pomnilnik pobriše na ničle šele,
ko naredimo prvi korak v program. To je programirano v Bascomu.
Ko ponovno pritisnemo na F8, vidimo, da se je izvedel ukaz I = &H11 in je vsebina naslov H100
postala H11.
Bascom AVR začetni tečaj, marec 2008 51
Pretaknimo na simulatorju okno tako, da nam pokaže IO vsebine. Izgledalo bo nekako tako:
Rad bi vas opozoril na SPL in SPH. To sta dva bajta, ki skupaj kažeta lokacijo v odložišču (stack-u) na
sledeče prosto mesto, angl. Stackpointer. V našem primeru je to naslov &H04FF
To pa je v tem primeru tudi končni naslov pomnilnika, saj toliko pomnilnika ima programirani
mikrokrmilnik.
52 Bascom AVR začetni tečaj, marec 2008
Sedaj pa previdno naprej, pritisnemo F8 še dvakrat in izvedemo še dve instrukciji:
To sta bila dva print ukaza in vsebina je vidna lepo na simulatorju. Opazimo pa še nekaj: vsebina
bajtov okoli naslova 04ff se je spremenila! Nekdo je uporabil stack! Ja, seveda, bascom sam pri
zahtevnih ukazih, kot so print tudi kliče svoje podprograme, in pri vsakem klicu se naslov povratka iz
podprograma spravi v stack. Oglejmo si sedaj spet Stackpoiner! (SPH in SPL v IO!) Le ta je lepo na
04FF, kot da se ni nič zgodilo. To je zato, ker smo spet v glavnem programu in uporabljeni bajti v
stacku so dani nazaj na razpolago, no niso pa brisani na 0, ker to nima pomena.
Če se vrnemo na okno pomnilnika, opazimo tudi, da je bascom spremenil tri bajte na naslovu &H440:
in to v &H31 (znak enojka) &H33 (znak trojka) in &H00 (konec niza). To so zadnji znaki, ki so izpisani v
oknu komunikacije in so bili zaukazani z ukazom Print. Kot vidimo je bascom uporabil tri bajte v
področju Frame kot delovni pomnilnik.
Bascom AVR začetni tečaj, marec 2008 53
In sedaj še enkrat pritisnimo F8!
Stackpointer sedaj kaže &H04FD, dva bajta niže! To je zato, ker se nahajamo v podprogramu A in je
tam spravljen naslov povratka v glavni program, ki ga bomo še rabili. Ko bomo rekli Return, se bo
od tam vzel naslov, kam se vrniti, in prostor v Stacku se bo sprostil.
Tako počasi analizirajte delovanje naprej, korak po korak, dokler ne pridete to konca programa.
54 Bascom AVR začetni tečaj, marec 2008
Zaključek mora biti sledeč:
Hwstack upravljam mikroprocesor na osnovi LIFO principa, vanj spravlja in jemlje informacije,
predvsem naslove, pri klicanju podprogramov in funkcij, lahko tudi implicitno (Print recimo).
Hwstack se polni od najvišjega naslova RAM-a navzdol, ne glede, ali je tam kaj programer pomotoma
pisal. Ko se naslovi spet uporabijo, se prostor sprosti. Če je programer na te naslove neprevidno
napisal kake podatke, bo mikroprocesor z veliko verjetnostjo smatral te podatke kot naslove, kam
nadaljevati program, in tako bo program se odvil v gozd in umrl.
V splošnem potrebuje mikroprocesor po dva bajta tega področja za vsak gosub ali klic podprograma
ali funkcije. Veliko več pa potrebuje, kadar se starta prekinitveni podprogram brez NOSAVE opcije.
Takrat se spravi na stack poleg naslova povratka tudi vsebina večine registrov, (vseh je 32!) NOSAVE
opcijo pa si lahko privoščite le, če potem sami v prekinitvenem podprogramu spravite na stack vse
tiste registre, ki jih uporabite. Ker pa Bascom programerji ne vemo, katere registre uporabi Bascom,
je tak nasvet brez smisla.
Software stack uporablja Bascom za naslove spremenljivk podanih kot paramater pri klicu
Subroutine ali Funkcije. Pa tudi za vsako v subrutini ali funkciji definirano lokalno spremenljivko.
Frame uporablja Bascom kot delovno področje in za lokalno v subroutini ali funkciji definirane
spremenljivke. Take spremenljivke so v področju Frame, njih naslovi v swstack.
Bascom AVR začetni tečaj, marec 2008 55
EEPROM – pisanje in branje
Gregor Maček
SRAM pomnilnik, v katerem se shranjujejo podatki s katerimi operiramo, ima to slabo lastnost, da se
ob izgubi napajanja izbriše. Če želimo določene podatke, parametre itn. shraniti tako, da ob izgubi
napajanja podatki ostanejo, jih shranimo pomnilnik EEPROM. EEPROM je kratica za Electrically
Erasable Programmable Read-Only Memory.
AVR mikroprocesorji imajo določeno količino EEPROM pomnilnika že znotraj samega procesorja, če
pa želimo pa lahko dodatni EEPROM povežemo s kontrolerjem preko I2C (ali drugega) protokola in
tako povečamo prostor, namenjen podatkom.
Da pa ne bo vse tako enostavno je potrebno omeniti neprijetno lastnost EEPROM pomnilnika,
pravzaprav dve. Prva je relativno počasno branje in predvsem pisanje (napram SRAM pomnilniku), ki
pa nam navadno ne povzroča večjih preglavic.
Večja težava je omejeno število prepisovanj pomnilnika, saj se po cca 10.000 – 100.000 zapisih mesto
v EEPROM pomnilniku »obrabi« do te mere, da zapisovanje in branje s tega mesta ni več mogoče.
Temu se izognemo s pametno narejenim programom, ki spremenljivke v EEPROM zapisuje le tedaj,
ko je to potrebno, sicer pa z njimi izvajamo operacije le v SRAMu.
Kot eno izmed možnih rešitev naj navedem rešitev napajanje mikroprocesorja tako, da je v napajalni
veji tudi dioda in visokokapacitativni kondenzator, z enim od vhodov pa vseskozi tipamo prisotnost
glavnega napajanja naprave. Vkolikor glavno napajanje izgine, zapišemo spremenljivke v EEPROM in
procesor zaustavimo (napajanje nikakor ne sme izginiti med samim pisanjem v EEPROM!) dokler se
glavno napajanje ne vrne. Tedaj vrednost spremenljivk iz EEPROM pomnilnika prepišemo nazaj
spremenljivkam v SRAMu in program se nadaljuje. Druga, elegantnejša (programska) metoda je, da
spremenljivke zapisujemo le tedaj, ko se res spremenijo, ne pa ob vsakem prehodu do-loop zanke.
56 Bascom AVR začetni tečaj, marec 2008
Zapisovanje v EEPROM in branje le-tega preko ERAM spremenljivk
Najenostavnejša varianta zapisovanja in branja pomnilnika EEPROM za začetnika je preko začasnih
t.i. ERAM (EEPROM RAM) spremenljivk. Postopek je sledeč:
1. Kot navadno kreiramo SRAM spremenljivko XXX (ime je lahko poljubno)
Dim XXX as Word
2. Kreiramo še dodatno EEPROM spremenljivko eXXX (ime je lahko poljubno). Tip spremenljivke
ERAM mora biti enak tipu spremenljivke SRAM!
Dim eXXX As ERAM Word
3. Ko želimo spremenljivko iz delovnega (SRAM) pomnilnika prepisati v EEPROM pomnilnik
(torej pisanje v EEPROM), to enostavno storimo z:
eXXX = XXX
4. Če pa želimo spremenljivko iz EEPROMa prebrati, storimo obratno:
XXX = eXXX
Torej povsem enostavno! Sedaj lahko npr. naredimo enostaven termometer, ki najvišjo in najnižjo
izmerjeno temperaturo hrani tudi ob izpadu napajanja.
Vkolikor imamo v EEPROMu shranjene določene parametre programa (npr. telefonske številke,
nastavitve) je potrebno paziti pri (pre)programiranju mikrokontrolerja, saj je pri večini
programatorjev privzeto nastavljeno, da se prepiše/izbriše tudi EEPROM pomnilnik. Vkolikor
vrednosti v EEPROMu želimo obdržati, omenjeno možnost izklopimo.
Naj še enkrat opozorim, da ima EEPROM pomnilnik omejeno število vpisov, zato je potrebno paziti na
sam program, da v EEPROM ne pišemo prepogosto.
Bascom AVR začetni tečaj, marec 2008 57
Zapisovanje v EEPROM in branje le-tega preko ukazov READEEPROM in
WRITEEEPROM
Bascom pa omogoča tudi drug, naprednejši način pisanja in branja EEPROMa preko ukazov
WRITEEEPROM in READEEPROM ter direktno pisanje konstant v EEPROM s pomočjo $eeprom ukaza.
$eeprom
Z vključitvijo omenjenega ukaza v program prevajalniku povemo, da bomo deklarirali konstante, ki
bodo vpisane v EEPROM pomnilnik. Prevajalnik generira EPP datoteko, ki jo s programatorjem
zapišemo v EEPROM mikrokontrolerja.
$eeprom 'Zapisujemo v EEPROM P_eeprom: 'Deklariramo podatkovno polje P_eeprom… Data 1 , 2 , 3 , 4 , 5 '… in mu vnesemo podatke. $data 'Preklopimo nazaj v FLASH način!
Readeeprom
Sedaj bomo v programu (v FLASH pomnilniku) prebrali omenjene podatke:
Dim A as byte Readeeprom B , P_eeprom '1. vrednost iz Polje_eeprom prenesemo v spr. B Print B 'In to vrednost pošljemo na RS232 terminal
Vkolikor bi bili sedaj v Do-Loop zanki, bi prebrali vse vrednosti iz polja Polje_eeprom, ob vsakem
prehodu naslednjo vrednost.
Writeeeprom
V EEPROM lahko tudi pišemo:
Dim B as byte B = 10 Writeeeprom B , P_eeprom 'Prvič moramo deklarirati tudi kam pišemo… B = 11 Writeeeprom B '… za naslednji vpis pa to ni več potrebno
58 Bascom AVR začetni tečaj, marec 2008
Internetni naslovi
Splošni linki
http://www.atmel.com/products/avr/default.asp Originalna stran proizvajalca ATMEL, kjer lahko
najdemo datasheete vseh AVRjev, program za
programiranje (AVR Studio) itd.
http://www.mcselec.com/ Originalna stran Bascom AVR / 8051
http://www.avrfreaks.net/ Stran za AVR navdušence!
http://www.avrprojects.net/ Stran z zanimivimi projekti, primerna za
začetnike!
Spletni forumi
http://www.elektronik.si/phpBB2/index.php Verjetno največji slovenski forum, namenjen
vsemu povezanim z elektroniko.
http://www.svet-el.si/phpBB2/index.php Forum revije Svet elektronike; še en slovenski
elektro forum
http://www.elektron.si/forum/ Slovenski elektro forum v nastajanju (na bazi
elektro-n foruma)
http://www.mcselec.com/index2.php?option=com
_forum&Itemid=59
Forum uporabnikov Bascoma (v sklopu strani
www.mcselec.com)
Spletne trgovine
http://trgovina.svet-el.si/ Svet elektronike; literatura, programi,
elementi (pretežno za projekte, objavljene v
SE), mikroprocesorji, KIT kompleti
http://www.hte.si/ HTE (Ljubljana, Maribor, Celje); elementi
http://www.ic-elect.si/ http://www.ic-elect.si/
http://www.just.si/ Just; orodje, merilna oprema, elementi
Bascom AVR začetni tečaj, marec 2008 59
Informacije o pogostih kontrolerjih
Razpored pinov, posebne funkcije, velikost FLASH, SRAM, EEPROM pomnilnika in še mnogo drugih, uporabnih informacij iščemo v proizvajalčevem tehničnem katalogu (morda prevod ni najustreznejši – če rečem datasheet boste razumeli ...). Sledenjega najlažje dobimo kar na domači strani proizvajalca (torej www.atmel.com). Da pa na bo potrebno za vsako vezavo gledati omenjenih publikacij, smo v tej publikaciji izbrali nekaj najpogosteje uporabljenih AVR mikrokontrolerjev, od najšibkejših do najzmogljivejših.
AT Tiny 2313 Flash: 2k SRAM: 128 EEPROM: 128 Pinov: 20 Drugo: 2xINT, 1xUART* *4MHz notranji oscilator ni točen, za UART komunikacijo uporabi 8MHz int. oscilator ali kristal.
AT Tiny 45 Flash: 4k SRAM: 256 EEPROM: Pinov: 8 Drugo: 3xADC, 3x INT
AT Mega 8515 Flash: 8k SRAM: 512 EEPROM: 512 Pinov: 40 Drugo: 2x INT, 1x UART
60 Bascom AVR začetni tečaj, marec 2008
AT Mega 8 Flash: 8k SRAM: 1024 EEPROM: 512 Pinov: 28 Drugo: 6xADC, 2x INT, 1x UART
AT Mega 16 <Flash: 16k SRAM: 1024 EEPROM: 512 Pinov: 40 Drugo: 8xADC, 1xUART, 2xINT
AT Mega 128 Flash: 128k SRAM: 4096 EEPROM: 4096 Pinov: 64 Drugo: 8xADC, 8xINT, 2xUART
AT Mega 2560 Flash: 256k SRAM: 8192 EEPROM: 4096 Pinov: 100 Drugo: 16xADC, 8xINT, 4xUART
Bascom AVR začetni tečaj, marec 2008 61
O publikaciji
Publikacija: Bascom AVR začetni tečaj
Avtorji: Vilko Sustič, Gregor Maček, Jure Mikeln
Uredil: Gregor Maček
Natisnil: Lado Železnik
Naklada: 40 izvodov
© Dovoljeno kopiranje publikacije ali dela le-te, pri čemer navedite tudi vir in avtorje!
62 Bascom AVR začetni tečaj, marec 2008
Kazalo
Vsebina priročnika Bascom AVR začetni tečaj
Uvod ........................................................................................................................................................ 3
Uvod v publikacijo ............................................................................................................................... 3
AVR mikrokontrolerji ........................................................................................................................... 3
Bascom AVR ............................................................................................................................................. 6
Predstavitev razvojnega okolja Bascom-AVR ...................................................................................... 6
Simulator v Bascom-u .......................................................................................................................... 9
Simulator in UART ......................................................................................................................... 10
Programiranje AVR mikrokontrolerjev .................................................................................................. 11
Opis MiniPin razvojnega orodja in programiranje ............................................................................ 11
Lock biti ......................................................................................................................................... 15
Fuse biti ......................................................................................................................................... 15
Priklop periferije na mikrokontroler...................................................................................................... 16
Vezava tipke ...................................................................................................................................... 16
Vezava LED diode .............................................................................................................................. 17
Vezava PFET in NFET tranzistorja ...................................................................................................... 18
Vezava LDC prikazovalnika ................................................................................................................ 19
Krmiljenje DC motorja ....................................................................................................................... 20
Uporaba izhodov ................................................................................................................................... 21
Direktno naslavljanje ......................................................................................................................... 22
Uporaba vhodov .................................................................................................................................... 23
Branje vhoda z ukazom IF-Then ........................................................................................................ 23
Branje vhoda z ukazom DEBOUNCE .................................................................................................. 24
Uporaba tekstovnega LCD zaslona ........................................................................................................ 25
Konfiguracija zaslona ......................................................................................................................... 25
Izpis na zaslon – ukaz LCD ................................................................................................................. 25
Pozicioniranje teksta na zaslon – ukaz LOCATE ................................................................................. 25
Premik teksta po zaslonu v levo ali desno – ukaz SHIFTLCD ............................................................. 26
Kreiranje lastnih znakov .................................................................................................................... 27
Bascom AVR začetni tečaj, marec 2008 63
Inicializacija zaslona med delovanjem programa – ukaz INITLCD ..................................................... 27
Komunikacija – UART pošiljanje ............................................................................................................ 28
RS-232 protokol ................................................................................................................................. 28
Komunikacijske nastavitve v Bascomu .............................................................................................. 29
Pošiljanje podatkov – PRINT .............................................................................................................. 29
Pošiljanje podatkov v binarni in šesdesetiški obliki........................................................................... 30
Komunikacija – UART sprejemanje........................................................................................................ 31
Sprejem podatkov z ukazoma INKEY, WAITKEY ................................................................................ 31
Sprejem podatkov z ukazom INPUT .................................................................................................. 31
Multipleksiranje – 7 segmentni LED ...................................................................................................... 32
Prekinitve (Interrupti) ............................................................................................................................ 41
1-wire protokol in termometer DS1820 ................................................................................................ 43
Stack – odložišče .................................................................................................................................... 46
EEPROM – pisanje in branje .................................................................................................................. 55
Zapisovanje v EEPROM in branje le-tega preko ERAM spremenljivk ................................................ 56
Zapisovanje v EEPROM in branje le-tega preko ukazov READEEPROM in WRITEEEPROM ............... 57
$eeprom ........................................................................................................................................ 57
Readeeprom .................................................................................................................................. 57
Writeeeprom ................................................................................................................................. 57
Internetni naslovi .................................................................................................................................. 58
Splošni linki ........................................................................................................................................ 58
Spletni forumi .................................................................................................................................... 58
Spletne trgovine ................................................................................................................................ 58
Informacije o pogostih kontrolerjih ...................................................................................................... 59
AT Tiny 2313 ..................................................................................................................................... 59
AT Tiny 45 .......................................................................................................................................... 59
AT Mega 8515 .................................................................................................................................... 59
AT Mega 8 .......................................................................................................................................... 60
AT Mega 16 ........................................................................................................................................ 60
AT Mega 128 ...................................................................................................................................... 60
AT Mega 2560 .................................................................................................................................... 60
O publikaciji ........................................................................................................................................... 61
Kazalo .................................................................................................................................................... 62
64 Bascom AVR začetni tečaj, marec 2008
Gregor MAČEK, Vilko SUSTIČ, Jure MIKELN
Bascom AVR začetni tečaj, marec 2008