Bascom AVR začetni tečaj Delovno gradivo

64
Gregor MAČEK, Vilko SUSTIČ, Jure MIKELN Bascom AVR začetni tečaj, marec 2008 Bascom AVR začetni tečaj Delovno gradivo

Transcript of Bascom AVR začetni tečaj Delovno gradivo

Page 1: Bascom AVR začetni tečaj Delovno gradivo

Gregor MAČEK, Vilko SUSTIČ, Jure MIKELN

Bascom AVR začetni tečaj, marec 2008

Bascom AVR začetni tečaj

Delovno gradivo

Page 2: Bascom AVR začetni tečaj Delovno gradivo

2 Bascom AVR začetni tečaj, marec 2008

Page 3: Bascom AVR začetni tečaj Delovno gradivo

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

Page 4: Bascom AVR začetni tečaj Delovno gradivo

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

Page 5: Bascom AVR začetni tečaj Delovno gradivo

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!

Page 6: Bascom AVR začetni tečaj Delovno gradivo

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.

Page 7: Bascom AVR začetni tečaj Delovno gradivo

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

Page 8: Bascom AVR začetni tečaj Delovno gradivo

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.

Page 9: Bascom AVR začetni tečaj Delovno gradivo

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.

Page 10: Bascom AVR začetni tečaj Delovno gradivo

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.

Page 11: Bascom AVR začetni tečaj Delovno gradivo

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

Page 12: Bascom AVR začetni tečaj Delovno gradivo

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.

Page 13: Bascom AVR začetni tečaj Delovno gradivo

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:

Page 14: Bascom AVR začetni tečaj Delovno gradivo

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.

Page 15: Bascom AVR začetni tečaj Delovno gradivo

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.

Page 16: Bascom AVR začetni tečaj Delovno gradivo

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

Page 17: Bascom AVR začetni tečaj Delovno gradivo

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.

Page 18: Bascom AVR začetni tečaj Delovno gradivo

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.

Page 19: Bascom AVR začetni tečaj Delovno gradivo

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

Page 20: Bascom AVR začetni tečaj Delovno gradivo

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.

Page 21: Bascom AVR začetni tečaj Delovno gradivo

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

Page 22: Bascom AVR začetni tečaj Delovno gradivo

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

Page 23: Bascom AVR začetni tečaj Delovno gradivo

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

Page 24: Bascom AVR začetni tečaj Delovno gradivo

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

Page 25: Bascom AVR začetni tečaj Delovno gradivo

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"

Page 26: Bascom AVR začetni tečaj Delovno gradivo

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

Page 27: Bascom AVR začetni tečaj Delovno gradivo

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.

Page 28: Bascom AVR začetni tečaj Delovno gradivo

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

Page 29: Bascom AVR začetni tečaj Delovno gradivo

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.

Page 30: Bascom AVR začetni tečaj Delovno gradivo

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

Page 31: Bascom AVR začetni tečaj Delovno gradivo

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

Page 32: Bascom AVR začetni tečaj Delovno gradivo

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:

Page 33: Bascom AVR začetni tečaj Delovno gradivo

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

Page 34: Bascom AVR začetni tečaj Delovno gradivo

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:

Page 35: Bascom AVR začetni tečaj Delovno gradivo

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

Page 36: Bascom AVR začetni tečaj Delovno gradivo

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

Page 37: Bascom AVR začetni tečaj Delovno gradivo

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

Page 38: Bascom AVR začetni tečaj Delovno gradivo

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.

Page 39: Bascom AVR začetni tečaj Delovno gradivo

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:

Page 40: Bascom AVR začetni tečaj Delovno gradivo

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.

Page 41: Bascom AVR začetni tečaj Delovno gradivo

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.

Page 42: Bascom AVR začetni tečaj Delovno gradivo

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.

Page 43: Bascom AVR začetni tečaj Delovno gradivo

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.

Page 44: Bascom AVR začetni tečaj Delovno gradivo

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

Page 45: Bascom AVR začetni tečaj Delovno gradivo

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'

Page 46: Bascom AVR začetni tečaj Delovno gradivo

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.

Page 47: Bascom AVR začetni tečaj Delovno gradivo

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)

Page 48: Bascom AVR začetni tečaj Delovno gradivo

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

Page 49: Bascom AVR začetni tečaj Delovno gradivo

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

Page 50: Bascom AVR začetni tečaj Delovno gradivo

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.

Page 51: Bascom AVR začetni tečaj Delovno gradivo

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.

Page 52: Bascom AVR začetni tečaj Delovno gradivo

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.

Page 53: Bascom AVR začetni tečaj Delovno gradivo

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.

Page 54: Bascom AVR začetni tečaj Delovno gradivo

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.

Page 55: Bascom AVR začetni tečaj Delovno gradivo

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.

Page 56: Bascom AVR začetni tečaj Delovno gradivo

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.

Page 57: Bascom AVR začetni tečaj Delovno gradivo

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

Page 58: Bascom AVR začetni tečaj Delovno gradivo

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

Page 59: Bascom AVR začetni tečaj Delovno gradivo

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

Page 60: Bascom AVR začetni tečaj Delovno gradivo

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

Page 61: Bascom AVR začetni tečaj Delovno gradivo

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!

Page 62: Bascom AVR začetni tečaj Delovno gradivo

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

Page 63: Bascom AVR začetni tečaj Delovno gradivo

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

Page 64: Bascom AVR začetni tečaj Delovno gradivo

64 Bascom AVR začetni tečaj, marec 2008

Gregor MAČEK, Vilko SUSTIČ, Jure MIKELN

Bascom AVR začetni tečaj, marec 2008