Bascom AVR začetni tečaj

Similar documents
R V P 2 Predavanje 05

Reševanje problemov in algoritmi

TOPLJENEC ASOCIIRA LE V VODNI FAZI

! BASCO CO AVR AVR " #$

Računalnik iz domin. Škafar, Maja Šafarič, Nina Sangawa Hmeljak Mentor: Vid Kocijan

Uporaba preglednic za obdelavo podatkov

OPTIMIRANJE IZDELOVALNIH PROCESOV

Digitalne strukture. Delovni zvezek za laboratorijske vaje. doc. dr. Gorazd Pucihar. Ime in priimek študenta:

OFF-LINE NALOGA NAJKRAJŠI SKUPNI NADNIZ

Analogna elektronska vezja. Uvodna vaja

Attempt to prepare seasonal weather outlook for Slovenia

AKSIOMATSKA KONSTRUKCIJA NARAVNIH

Digitalna tehnika. Delovni zvezek za laboratorijske vaje. doc. dr. Gorazd Pucihar. Ime in priimek študenta:

UNIVERZA V LJUBLJANI PEDAGOŠKA FAKULTETA POLONA ŠENKINC REŠEVANJE LINEARNIH DIFERENCIALNIH ENAČB DRUGEGA REDA S POMOČJO POTENČNIH VRST DIPLOMSKO DELO

Multipla korelacija in regresija. Multipla regresija, multipla korelacija, statistično zaključevanje o multiplem R

Simulacija dinamičnih sistemov s pomočjo osnovnih funkcij orodij MATLAB in Simulink

Zgoščevanje podatkov

ENERGY AND MASS SPECTROSCOPY OF IONS AND NEUTRALS IN COLD PLASMA

NALOGE ZA PRVO SKUPINO. Kaj izpiše naslednji program? R: 9 Odgovor primerno utemelji!

OA07 ANNEX 4: SCOPE OF ACCREDITATION IN CALIBRATION

Izmenični signali moč (17)

Vsebina Od problema do načrta programa 1. del

Optimizacija delovanja in povečanje obiska na spletni strani

ENAČBA STANJA VODE IN VODNE PARE

Državni izpitni center. Izpitna pola 1. Četrtek, 4. junij 2015 / 90 minut

Problem umetnostne galerije

Spletni sistem za vaje iz jezika SQL

Hipohamiltonovi grafi

Univerza v Ljubljani Fakulteta za matematiko in fiziko. Oddelek za fiziko. Seminar - 3. letnik, I. stopnja. Kvantni računalniki. Avtor: Tomaž Čegovnik

Naloge iz LA T EXa : 3. del

NIKJER-NIČELNI PRETOKI

22. državno tekmovanje v znanju računalništva (1998) NALOGE ZA PRVO SKUPINO. Kaj izpiše naslednji program? Rešitev: str. 8

UNIVERZA NA PRIMORSKEM FAKULTETA ZA MATEMATIKO, NARAVOSLOVJE IN INFORMACIJSKE TEHNOLOGIJE. Verjetnostni algoritmi za testiranje praštevilskosti

Linearna regresija. Poglavje 4

USING SIMULATED SPECTRA TO TEST THE EFFICIENCY OF SPECTRAL PROCESSING SOFTWARE IN REDUCING THE NOISE IN AUGER ELECTRON SPECTRA

POLDIREKTNI PRODUKT GRUP

UNIVERZA NA PRIMORSKEM FAKULTETA ZA MATEMATIKO, NARAVOSLOVJE IN INFORMACIJSKE TEHNOLOGIJE

Klemen Konič, 4. GB Tehniška gimnazija Tehniški Šolski Center Nova Gorica

Univerza na Primorskem. Fakulteta za matematiko, naravoslovje in informacijske tehnologije. Zaznavanje gibov. Zaključna naloga

23. državno tekmovanje v znanju računalništva (1999) NALOGE ZA PRVO SKUPINO

NALOGE ZA PRVO SKUPINO

DIGITALNO VODENJE Laboratorijske vaje

Verodostojnost in kvaliteta spletno dostopnih informacij

Izvedbe hitrega urejanja za CPE in GPE

Modelska Analiza 1. University of Ljubljana Faculty of Mathematics and Physics. 3. naloga - Numeri na minimizacija

Eulerjevi in Hamiltonovi grafi

A L A BA M A L A W R E V IE W

matematika + biologija = sistemska biologija? Prof. Dr. Kristina Gruden Prof. Dr. Aleš Belič Doc. DDr. Jure Ačimovič

Statistika 2 z računalniško analizo podatkov

1) V diagramu sta prikazana plazemska koncentracijska profila po večkratnem intravenskem odmerjanju učinkovine v dveh različnih primerih (1 in 2).

Statistika 2 z računalniško analizo podatkov. Neizpolnjevanje predpostavk regresijskega modela

Usmerjene nevronske mreže: implementacija in uporaba

UNIVERZA V LJUBLJANI FAKULTETA ZA MATEMATIKO IN FIZIKO ODDELEK - FIZIKA. Matej Posinković KVANTNI RAČUNALNIKI SEMINAR. Mentor: prof.

Zanesljivostna analiza ARM9 razvojnega sistema FRI SMS

Analiza variance in linearna regresija

MICROWAVE PLASMAS AT ATMOSPHERIC PRESSURE: NEW THEORETICAL DEVELOPMENTS AND APPLICATIONS IN SURFACE SCIENCE

Samo-nastavljivo vodenje z DMC-jem in proporcionalnim regulatorjem

UNIVERZA V LJUBLJANI PEDAGOŠKA FAKULTETA FAKULTETA ZA MATEMATIKO IN FIZIKO Študijski program: Fizika in tehnika

C-PROGRAMIRANJE ARM9 MIKROKRMILNIKOV V PROSTO DOSTOPNEM RAZVOJNEM OKOLJU ZA LINUX

Fakulteta za matematiko in fiziko Univerza v Ljubljani. Seminar. Kvantni računalniki. Avtor: Matjaž Gregorič. Mentor: prof. N.S.

Iskanje najcenejše poti v grafih preko polkolobarjev

Paralelni in distribuirani algoritmi v numerični analizi

Hadamardove matrike in misija Mariner 9

Sodobna orodja in postopki za načrtovanje algortimov vodenja servopogonov

UNIVERZA V MARIBORU FAKULTETA ZA NARAVOSLOVJE IN MATEMATIKO. Oddelek za matematiko in računalništvo DIPLOMSKO DELO.

USING THE DIRECTION OF THE SHOULDER S ROTATION ANGLE AS AN ABSCISSA AXIS IN COMPARATIVE SHOT PUT ANALYSIS. Matej Supej* Milan Čoh

Simulation of multilayer coating growth in an industrial magnetron sputtering system

Verifikacija napovedi padavin

Državni izpitni center. Izpitna pola 1. Sobota, 27. avgust 2016 / 90 minut

OPTIMIZACIJA Z ROJEM DELCEV

ZDRAVLJENJE BOLNICE S VON WILLEBRANDOVO BOLEZNIJO TIPA 3 IN INHIBITORJI

PRIMERJAVA ANALITIČNIH PROGRAMSKIH ORODIJ PRI REŠEVANJU PROBLEMOV ODLOČANJA V POSLOVNIH PROCESIH

Učni komplet za Raspberry Pi Conrad Components

Excel. Matjaž Željko

PRESENEČENJA V FIZIKI: VRTAVKE. Mitja Rosina Fakulteta za matematiko in fiziko Ljubljana, 12.marca 2010

JEDRSKA URA JAN JURKOVIČ. Fakulteta za matematiko in fiziko Univerza v Ljubljani

Cveto Trampuž PRIMERJAVA ANALIZE VEČRAZSEŽNIH TABEL Z RAZLIČNIMI MODELI REGRESIJSKE ANALIZE DIHOTOMNIH SPREMENLJIVK

Sekvenčna preklopna vezja

UNIVERZA NA PRIMORSKEM FAKULTETA ZA MATEMATIKO, NARAVOSLOVJE IN INFORMACIJSKE TEHNOLOGIJE. Ekstremne porazdelitve za odvisne spremenljivke

UNIVERZA V LJUBLJANI PEDAGOŠKA FAKULTETA SAŠO ZUPANEC MAX-PLUS ALGEBRA DIPLOMSKO DELO

Mathematica PRI MATEMATIKI V 1. IN 2. LETNIKU SPLOŠNEGA GIMNAZIJSKEGA PROGRAMA

SVM = Support Vector Machine = Metoda podpornih vektorjev

Obisk iz rezultatov iskanj na iskalniku Google

1 Luna kot uniformni disk

IZPELJANKE ALGORITMA LZW

Solutions. Name and surname: Instructions

UČNI NAČRT PREDMETA / COURSE SYLLABUS. Študijska smer Study field. Samost. delo Individ. work Klinične vaje work

UNIVERZA V LJUBLJANI FAKULTETA ZA RAČUNALNIŠTVO IN INFORMATIKO. Gorazd Kovačič. Avtomatsko vizualno testiranje spletnih strani

Usmerjenost v samopreseganje in dosežke vodenje samega sebe

2002.X.1 Mobilni milijonar

Ivan Pucelj: RIMSKE ŠTEVILKE IN RAČUNANJE Z NJIMI. List za mlade matematike, fizike, astronome in računalnikarje

Osnovna statistična analiza v R-ju

UNIVERZA NA PRIMORSKEM FAKULTETA ZA MATEMATIKO, NARAVOSLOVJE IN INFORMACIJSKE TEHNOLOGIJE

MPP5800 series - PANEL MOUNT PRINTERS. Options

MECHANICAL EFFICIENCY, WORK AND HEAT OUTPUT IN RUNNING UPHILL OR DOWNHILL

UNIVERZA V LJUBLJANI PEDAGOŠKA FAKULTETA LUKA VIKTOR ROGAČ KONČNI AVTOMATI DIPLOMSKO DELO

21.1 Scilab Brownov model 468 PRILOGA. By: Dejan Dragan [80] // brown.m =========================== function brown(d,alfa) fakt = 5;

UNIVERZA NA PRIMORSKEM FAKULTETA ZA MATEMATIKO, NARAVOSLOVJE IN INFORMACIJSKE TEHNOLOGIJE

VAJE 2: Opisna statistika

APLIKACIJA ZA DELO Z GRAFI

Transcription:

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

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

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 LCDprikazovalnika 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 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 4 Bascom AVR začetni tečaj, marec 2008

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!

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. 6 Bascom AVR začetni tečaj, marec 2008

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 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. 8 Bascom AVR začetni tečaj, marec 2008

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.

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. 10 Bascom AVR začetni tečaj, marec 2008

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

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. 12 Bascom AVR začetni tečaj, marec 2008

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:

Č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. 14 Bascom AVR začetni tečaj, marec 2008

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.

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). 16 Bascom AVR začetni tečaj, marec 2008

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.

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. 18 Bascom AVR začetni tečaj, marec 2008

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

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. 20 Bascom AVR začetni tečaj, marec 2008

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 Config Portb.0 = Output Config Portb.1 = Output 'Lahko nastavimo cel register kot output 'Lahko pa tudi zgolj posamezni pin iz registra

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 Set Porta.0 Wait 1 Reset Porta.0 Wait 1 Loop 'Začetek zanke 'Vklopim LED 'Počakam sekundo (ukaz wait; lahko tudi waitms ali waitus, max. vrednost pri posameznem ukazu je 255!) 'Izklopim LED 'Počakam sekundo '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 Wait 1 Porta = &B11111111 Wait 1 Loop 'Biti od 0-7 v portu A so izklopljeni 'Biti od 0-7 v portu A so vklopljeni 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 22 Bascom AVR začetni tečaj, marec 2008

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 Config Portb.0 = Input 'Lahko nastavimo cel port kot output '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 If Pinb.0 = 1 Then 'malo počakamo 'ponovno preverimo stanje in če je tipka še vedno pritisnjena...... 'naredimo željeno operacijo End If End If Loop

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 Config portc.0 = output Config Debounce = 40 'Port b.0 konfiguriramo kot vhod 'Port c.0 konfiguriramo kot izhod '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 Config portc.0 = output Config Debounce = 40 'Port b.0 konfiguriramo kot vhod 'Port c.0 konfiguriramo kot izhod '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 24 Bascom AVR začetni tečaj, marec 2008

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 Cursor Off 'Pobrišemo zaslon '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" 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 26 Bascom AVR začetni tečaj, marec 2008

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.

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... 28 Bascom AVR začetni tečaj, marec 2008

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.

Prazno vrstico enostavno kreiramo s praznim ukazom PRINT, torej: Do Print "test" Print Print "test2" Wait 3 Loop 'prazna vrstica Č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 lete 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) Wait 3 Print Hex(A) Wait 3 Loop 'pošljem A kot binarno vrednost 'pošljem A kot šesdesetiško vrednost 30 Bascom AVR začetni tečaj, marec 2008

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

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: 32 Bascom AVR začetni tečaj, marec 2008

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 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: ' 'Minipin7seg: 34 Bascom AVR začetni tečaj, marec 2008

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 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 Do For I = 0 To 3 Portb = Lookup(i, Minipin7seg) Portd = 255 36 Bascom AVR začetni tečaj, marec 2008

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 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 Waitms 5 Next experimentiraj z različnimi zakasnitvami 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. 38 Bascom AVR začetni tečaj, marec 2008

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:

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. 40 Bascom AVR začetni tečaj, marec 2008

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.

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. 42 Bascom AVR začetni tečaj, marec 2008

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. Č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 1wwrite &H44 Wait 1 'skip ROM velja za vse, ki ste na liniji 'merite temperaturo '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 1wwrite &HCC 1wwrite &HBE 'reset 'skip ROM velja za vse, a je samo eden na liniji 'dajte podatke Podatek o temperaturi dobimo v polovičkah stopinje in ga daje v obliki dveh bajtov T = 1wread(2) 'Beremo podatke, prva dva bajta sta temperatura ' T je tipa integer 44 Bascom AVR začetni tečaj, marec 2008

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'

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. 46 Bascom AVR začetni tečaj, marec 2008

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) 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 48 Bascom AVR začetni tečaj, marec 2008

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 M Word 0104 0103 260 259 Glede na to, da smo definirali: $regfile = "m162def.dat" $hwstack = 64 $swstack = 64 $framesize = 64 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. Pretaknimo na simulatorju okno tako, da nam pokaže IO vsebine. Izgledalo bo nekako tako: 50 Bascom AVR začetni tečaj, marec 2008

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.

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. 52 Bascom AVR začetni tečaj, marec 2008

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.

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. 54 Bascom AVR začetni tečaj, marec 2008

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.

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. 56 Bascom AVR začetni tečaj, marec 2008

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 P_eeprom: Data 1, 2, 3, 4, 5 $data 'Zapisujemo v EEPROM 'Deklariramo podatkovno polje P_eeprom ' in mu vnesemo podatke. '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 B = 11 Writeeeprom B 'Prvič moramo deklarirati tudi kam pišemo ' za naslednji vpis pa to ni več potrebno

Pomagala, ki mi pomagajo pri delu z mikroprocesorji Vilko Sustič Moja praksa z mikroprocesorji sicer ni bogvekaj, a do nekaterih ugotovitev sem prišel, in sem zadovoljen z njimi. S tem papirjem jih dajem na razpolago tudi drugim, saj če vam bo všeč boste morda kopirali, v najslabšem slučaju boste zamahnili z roko in šli dalje. 3-pinski konektor Prišel sem do zaključka, da na vsakem tiskanem vezju, ki ga krmili mikroprocesor, dodam še enega ali dva 3-pinska konektorja, ki jih sicer pri samem delovanju naprave ne potrebujem, ampak kar tako, 'za vsak slučaj'. Pri tem se držim vedno enakega razporeda kontaktov. 1- +5v 2- Nek prost vhodno/izhodni pin mikroprocesorja, ki ga sicer ne rabim 3- Masa Tak konektor naknadno lahko uporabim na različne načine, nanj priklopim dodatno led diodo, tipko, lahko z njim krmilim naprej kako drugo napravo, kar v prvem konceptu nisem imel v mislih in podobno. Na sledeči sliki je napravica z dvema takima konektorjema. Enostavno prost prostor na tiskanem vezju sem zapolnil s konektorejma in ju povezal s prostima pinoma mikroprocesorja. 58 Bascom AVR začetni tečaj, marec 2008

V programu predvideti programska pomagala za lažje odkrivanje napak. Kdor dela, dela napake. Kdor programira, vgrajuje v program tudi napake. In potem jih skuša odpraviti. Če samo gledamo v čip mikroprocesorja lahko samo ugibamo, kaj se v njem dogaja, ugibanje pa nas samo počasi pripelje do resnice. Da pridemo do resnice prej, vgradimo v program ukaze, s katerimi nas program obvešča, kaj se v mikroprocesorju dogaja. Če ima naprava LCD ali kako drugo izhodno enoto na kateri se pojavljajo obvestila uporabniku, potem programiramo izpis takih testnih obvestil pač na tako napravo. Ko smo z delovanjem programa zadovoljni, tedaj taka pomožna obvestila odstranimo iz programa. V Bascomu bi to naredili morda tako... ' nekje definiramo konstano test ' const test = 1.. ' potem vgradimo izpis pomožnih informacij If test = 1 then Lcd 'Stevec = ';stevec End if. ' ali pa #if test = 1 Lcd 'Stevec = ';stevec #endif Seveda se da to narediti v kateremkoli programskem jeziku, le pravila so drugačna, a podobna. Ko smo s programom zadovoljni, enostavno spremenimo konstanto test v 0 in ponovno prevedemo program. Naj še omenim razliko med Bascom ukazoma if in #if. Med tem, ko se preverjanje pogoja pri ukazu if dogaja v mikroprocesorju med izvajanjem programa, se preverjanje pogoja pri ukazi #if izvaja že v fazi prevajanja programa na PC-u, in tedaj se pogojna koda, če pogoj ni izpolnjen, sploh ne vgradi v mikroprocesorski program. Kaj pa če naprava nima LCD-a ali neke druge primerne enote za komuniciranje z človekom? Tedaj pride prav prej omenjeni 3-pinski konektor kamor vklopimo kabel za povezavo s PC-jem. Tedaj bomo ekran PC-a uporabili kot enoto, kamor bo naš program pisal obvestila nam, ko bomo testirali program. Ko bomo s programom zadovoljni, potem bomo enostavno kabel izvlekli iz konektorja in napravo vgradili tja, kjer bo upravljala ali nadzirala tisto, za kar je namenjena. V ta namen imata Bascom8051 in BascomAVR takoimenovani softverski uart, ki ga definiramo z

Open "com1.6:9600" For Output As #2 ali Open "comd.2:9600,8,n,1" For Output As #2 Detajle Open ukaza si oglejte v Bascom Help-u! Seveda že iz definicije pina vidimo, da je prvi ukaz za 8051 mikroprocesor, kajti le on ima pin P1.6 drugi pa je za AVR mikroprocesor, ker le on ima PinD.2 Seveda je to pin, ki je vezan na kontakt 2 3-polnega pomožnega konektorja, ki sem ga na začetku omenil. Sedaj lahko v Bascomu AVR lepo pišemo testne pomožne informacije Recimo Print #2, "Stanje števca = "; Števec In stanje števca se bo pojavilo v novi vrstici na ekranu PC-a, če bomo seveda pravilno povezali PC z našim 3-pinskim konektorjem, a o tem kasneje. No, v Bascom8051 ne moremo pisati tako, ker pozna za softwarski uart samo ukaze Put, ki prenašajo samo en bajt, ne pa tudi ukaze Print, kjer lahko pišemo cele vrstice. Pa si potem naredimo podprogram, ki nam bo nadomestil ukaz Print, vsebino, ki jo želimo napisati pa sestavimo v spremenljivki tipa niz. 60 Bascom AVR začetni tečaj, marec 2008

Recimo Dim S As String * 16 'Področje za swuart ' splošne deloven spremenljivke programa Dim i as byte Dim j as byte Dim k as byte Open "com1.6:9600" For Output As #2 S = "Stevec = " + Str(Stevec) Gosub Suartprint Podprogram Suartprint pa bo bajt po bajt spremenljivke S prenesel na softwareuart: Suartprint: push {i} push {j} push {k} ' Suartprint I = Len(s) If I > 16 Then I = 16 End If ' Pišem niz: For J = 1 To I K = J + 1 Put #2, X(k) Next ' in zaključim z CR/NL Put #2, 10 Put #2, 13 pop {k} pop {j} pop {i} Waitms 10 Return Podprogram najprej spravi vsebino delovnih spremenljivk i,j in k na odložišče (stack), da ne bi s spremembo vsebine teh spremenljivk pokvaril delovanje glavnega programa, saj le ta ima lahko v njih važno vsebino. Potem ugotavlja, koliko znakov je potrebno oddati, potem v for zanki te znake odda, in potem odda še dva znaka, ki jih PC potem obravnava kot konec vrstice. Pri Bascom8051 imamo še eno neprijazno zadevo: ti mikroprocesorji imajo zelo malo delovnega pomnilnika RAMa, in z Dim S as string * 16 ga morda preveč obremenimo, tedaj, je potrebno pač manjše dimenzije niza, in paziti pri sestavljanju niza na prekoračitev in pisati (klicati podprogram) pogosteje.

Seveda še nismo končali. Sedaj so ti znaki šele na kontaktu 2 3-pinskega konektorja. Kako pridejo na ekran PC-a? Najprej je potrebno 3-pinski konektor z neko vmesno napravico (interface, vmesnik) povezati s Serial Portom PC-a ali kot rečemo z Com portom. V ta namen sem si izdelal napravico po tej shemi: (priznam shemo si nisem izmislil sam, temveč sem jo našel na internetu na http://chaokhun.kmitl.ac.th/~kswichit/rs232_web/rs232.html ) Na levi je 9-pinski DB9 ženski konektor, ki paše na konektor PC-a. Na desni priklopimo ta vmesnik na 3-pinski konektor naše naprave, kjer s pomočjo softare-uarta pišemo serijsko podatke, in jih dajemo na fotodiodo optospojke. Kot vidite je levi del vmesnika popolnoma galvansko ločen od desnega, in tako je PC zaščiten pred električnimi udarci, ki bi ga lahko udarili zaradi kake električne napake iz naše naprave. Levi del vmesnika je napajan iz RTS kontakta 9-polnega konektorja, in tranzistor optospojke prenaša optični signal v električni na RXD kontakt COM porta. 62 Bascom AVR začetni tečaj, marec 2008

Napravico sem naredil na testni ploščici (proto board-u) in izgleda tako: Lepo se vidi ploski kabel, ki se konča s 3-polno vtičnico za omenjeni 3-polni konektor, čeprav potrebujemo samo dve žili, +5V in pin. Sedaj je potrebno le še to informacijo prenesti na ekran. To naredi na PC-u program, ki mu rečemo terminal emulator. Takih programov je več, a po mojih izkušnjah je najboljši sad domače slovenske pameti, naredil ga je in dal na splošno brezplačno uporabo v osebne namene gospod Vlado Brajer, dobite ga pa na spletni strani http://braypp.googlepages.com/terminal

Ko instalirate in poženete program, boste dobili približno tako sliko: In sedaj važno: potem ko ste nastavili hitrost na 9600 (kot pri open ukazu v Bascomu ), potem, ko ste izbrali COMport (PC jih lahko ima več), in ko ste kliknili na Connect, morate zagotoviti vmesniku napajanje preko RTS signala tako, da kliknete na RTS tipko na desnem robu okna. In to je to. To seveda vse lepo deluje, če testiramo napravo na naši delovni mizi, kjer imamo tudi osebni računalnik z ekranom. Pokaže pa se tudi potrebna, da iščemo napake v programu tudi kasneje, ko je stvar že instalirana nekje recimo v kurilnici, ali na podstrešju, kjer ne moremo z osebnim računalnikom zraven. 64 Bascom AVR začetni tečaj, marec 2008

V ta namen sem si naredil posebno mikroprocesorsko ploščico po sledeči shemi: (Tudi ta se napaja kar iz napetosti 3-polnega konektorja) Kot je videti, imamo samo mikroprocesor, ki daje na LCD podatke, ki jih prebere iz pina 2 3-polnega konektorja. Seveda stvar še daleč ni tako udobna, kot ekran PC-a, saj imamo le dve kratki vrstici podatkov na LCD-u. Vsaka nova vrstica se pojavi na LCD-u spodaj, stara vrstica se premakne navzgor. Morda bi bilo smiselno uporabiti v ta namen kak močnejši avr mikroprocesor in LCD z več vrsticami, a nekaj moram pustiti tudi vam, da imate veselje naprej delati, kaj ne?

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/ http://www.avrprojects.net/ Stran za AVR navdušence! Stran z zanimivimi projekti, primerna za začetnike! Spletni forumi http://www.elektronik.si/phpbb2/index.php http://www.svet-el.si/phpbb2/index.php http://www.elektron.si/forum/ http://www.mcselec.com/index2.php?option=com _forum&itemid=59 Verjetno največji slovenski forum, namenjen vsemu povezanim z elektroniko. Forum revije Svet elektronike; še en slovenski elektro forum Slovenski elektro forum v nastajanju (na bazi elektro-n foruma) Forum uporabnikov Bascoma (v sklopu strani www.mcselec.com) Spletne trgovine http://trgovina.svet-el.si/ http://www.hte.si/ http://www.ic-elect.si/ http://www.just.si/ Svet elektronike; literatura, programi, elementi (pretežno za projekte, objavljene v SE), mikroprocesorji, KIT kompleti HTE (Ljubljana, Maribor, Celje); elementi http://www.ic-elect.si/ Just; orodje, merilna oprema, elementi 66 Bascom AVR začetni tečaj, marec 2008

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

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 68 Bascom AVR začetni tečaj, marec 2008