You are on page 1of 28

Mikroraunari

Laboratorijske vjebe

Autor: Ilija Mrenica, Ing. El.


Verzija 4.0
Sva prava pridrana (2009) All rights reserved

UVOD

ta je mikroraunar?
Mikroraunar je integralno kolo visokog stepena intergracije u kojem se nalazi procesorska
jezgra sa memorijom i ulazno-izlazna periferija.
Prisustvo procesorske jezgre podrazumijeva rad komponente baziran na izvravanju
pohranjenog programa u memoriji.
Mikroraunar jo nazivamo mikrokompjuter ili mikrokontroler. Termin mikrokontroler najbolje
opisuje primjenu ove komponente, a to je kontrola sistema. Ako uzmemo u obzir rije mikro moemo
zakljuiti da se tu radi o kontroli sistema sa vrlo malom komponentom za razliku od kontrole sistema
koju moemo izvesti sa raunarom, to bi zauzelo puno vie prostora i kotalo puno vie. Na kraju
trebamo izvesti zakljuak gdje trebamo koristiti mikroraunar.
Mikroraunar koristimo u ureajima u kojima sam kontrolni sistem treba da zauzima vrlo malo
povrine jer je i sam ureaj tj. njegova elektronika treba da budu mali, i to je najvanije ureaj treba da
bude ekonomine cijene, a najee prenosiv i lagan.
Koji ureaj imamo skoro svi u depu, a ispunjava sve ove uvjete?
ta je periferija tog ureaja?
Primjena mikroraunara je raznovrsna i zbog niske cijene sve vea, u nekoliko podruja je vrlo
izraena:
1. Potroaka elektronika (detektori pokreta, termostati, daljinska kontrola, odravanje
baterija, kafe aparati, kuanski aparati, itd...)
2. Komunikaciona tehnika (telefonski aparati, mikrofoni, modemi, i sl.)
3. Industrija (mjerenje energije, prenosni instrumenti, akvizicija podataka, kontrola motora)
4. Automobilska industrija (kontrola svjetala, inteligentni senzori, detektori blizine, praene
pritiska guma, daljinsko otkljuavanje, auto-alarmi, i sl.)
esto se ne razumije razlika i prednost koritenja mikrokontrolera u odnosu na sklopove
digitalne elektronike s kojom se isto moe izvesti svaki sistem kontrole. Sistem sa mikroraunarom ima
ogromnu prednost jer se moe reprogramirati svaki put da radi drugaije, dok sistem sa digitalnom
elektronikom ne moemo mijenjati jer bi morali mijenjati cijelu elektroniku i strukturu ploe.

Arhitektura mikroraunara
Osnovni elementi arhitekture mikroraunara (MCU Micro Control Unit) su:
- procesorska jezgra,
- memorija, i
- ulazno-izlazna periferija.
Na slici 1 prikazana je blok shema arhitekture tipinog mikroraunara:

Slika 1. Blok shema arhitekture tipinog mikroraunara

Ukratko emo navesti funkcije pojedinih elemenata:


-

CPU (Central Processing Unit) je centralna procesorska jedinica u kojoj se izvrava


program i obrada podataka;
RAM (Random Access Memory) memorija sa sluajnim pristupom ili radna memorija koja
se koristi za smjetaj podataka u toku izvoenja programa (njen sadraj se brie po
nestanku napajanja);
ROM (Read Only Memory) memorija koja se moe samo itati, u njoj je pohranjen program
i njen sadraj se ne brie po nestanku napajanja nego se program po ponovnom dolasku
napajanja izvrava opet poevi od prve adrese, ROM memorija moe biti tipa FLASH
(elektriki reprogramabilna);
PORT A, B, C su pinovi koji predstavljaju vezu sa vanjskim svijetom, mogu se konfigurisati
kao ulazni ili izlazni, analogni ili digitalni, sa posebnim instrukcijama kojima definiemo
registre ovih pinova i time njihovu ulogu;
Timer ili tajmer (broja) je poseban element za ije razumijevanje je potrebno vie
vremena, za sada je dovoljno znati da slui za precizno mjerenje vremena ili brojanje nekih
impulsa na ulazu mikrokontrolera;
ADC (Analog to Digital Converter) je pretvara analognog napona sa nekog ulaza
mikrokontrolera u digitalnu varijablu, npr. 5V e pretvoriti u heksadecimalnih 255 ako se radi
o 8-bitnom ADC. Varijabla u tom formatu je dalje pogodna za obradu unutar programa.
Postoje i DAC konvertori koji rade suprotno ali u pravilu nisu ugraeni u mikroraunare
zbog previsoke cijene;
Serijski port slui za komunikaciju sa raunarom putem RS-232 standarda za serijsku
komunikaciju.

Ovo je samo jedan dio raspoloive periferije dananjih mikroraunara.

Za potrebe praktine nastave koristimo PIC Peripherial Interface Controller (itaj pik ili pic)
mikroraunare amerike firme Microchip koji su tzv. RISC mikroraunari sa Harvardskom
arhitekturom.
RISC (Reduced Instruction Set Computer) je raunar sa reduciranim setom instrukcija , za
programiranje PIC mikroraunara potrebno je nauiti samo 35 instrukcija ako programiramo
asemblerskim jezikom.
Na slici 2 prikazana je blok shema Harvardske arhitekture, tu se vidi da postoje dvije sabirnice
podataka ili tzv. magistrale (BUS), jedna 8-bitna je za podatke, a druga 14-bitna je za
programske instrukcije. Ovo omoguuje CPU da pribavlja podatke i instrukcije odvojeno i
istovremeno ime se postiu velike brzine izvravanja programa kroz protonu strukturu.

Slika 2. Blok shema Harvardske arhitekture


Vano je zapamtiti da je program niz sekvencijalnih operacija nad podacima. Programska
memorija (ROM) je dio memorije gdje je smjeten niz instrukcija koje ine program. Podatkovna
memorija (RAM) je dio memorije gdje su smjeteni podaci, kao npr. konstante ili varijable, koje
koristi program u toku svog izvoenja.
PIC mikroraunari se proizvode u nekoliko familija u ovisnosti od mogunosti i cijene. Najlake
je poeti sa tzv. baseline familijom PIC10FXXX 8-bitnih mikroraunara, npr. razmotriemo
arhitekturu i mogunosti PIC10F222 mikroraunara:
-

4MHz ili 8MHz interni oscilator (svaki mikroraunar mora imati oscilator koji daje radni takt
po kojem CPU i ostali elementi sistema rade);
ICSP (In Circuit Serial Programming) mogunost reprogramiranja unutar kola;
Programska FLASH ROM memorija od 512 8-bitnih rijei;
SRAM za podatke (varijable) od 23 byte;
4 pina, od toga 3 ulazno-izlazna pina i 1 samo ulazni pin;
8-bitni tajmer/broja (Timer0);
WDT (Watchdog Timer) nezavisni oscilator koji resetuje MCU ako program stane;
8-bitni jednokanalni ADC na 2 vanjska pina; itd...

I VJEBA - LED DIODE


Poinjemo sa izradom eme u Proteus-u dodavanjem elemenata sa LibraryPick Device/Simbol te
biramo sljedee elemente iz pripadnih kategorija i podkategorija kao u tabeli I-1:
Tabela I-1.
Kategorija / podkategorija
Microprocessor ICs / PIC16 F.
Resistors
Optoelectronics

Element
PIC16F887
MINRES330R
LED-GREEN

Komentar
Mikroraunar ili MCU
Otpornik 330 - 0,6W
LED dioda

Mikroraunar stavljamo u sredinu, LED diode se spajaju preko otpornika od 330 na port A i port B,
pinovi RA0 i RB2, katode LED dioda spajamo na uzemljenje GND, kao na slici I-1.

Slika I-1. Simulacijski model za I vjebu LED diode (Proteus v.7.10)


Za uzemljenje sa lijeve strane alatne trake biramo Terminals ModeGND. Elemente
povezujemo sa Buses Mode (isto lijeva alatna traka).
Vraamo se u mikroC i otvaramo novi projekt, tu je u prvom dijalogu potrebno definirati osnovne
postavke projekta:
Project Name:
Project Path:
Device:
Clock:

dati neko ime projektu, npr. Led_Blink


sa Browse ii na My Documents uvijek
biramo mikroraunar P16F887
takt mikroprocesora stavljamo na 8 MHz

U treem koraku izabrati opciju Include none jer biblioteke ukljuujemo samo po potrebi, u
etvrtom koraku radimo konfiguraciju mikroraunara, slika I-2.

Slika I-2. Konfiguracija mikroraunara (MikroC Pro for PIC v.5.40)


to se tie konfiguracijskih bitova idemo za poetak sa Default vrijednostima, a promjene
moemo vriti naknadno (kompajlira se poslije sa drugim vrijednostima).
U mikroC-u se otvara prazan fajl, programski kod dat dole potrebno je ukucati tano i snimiti fajl
npr. kao Led_Blink.c u My Documents.
void main() {
ANSEL = 0;
ANSELH = 0;
C1ON_bit = 0;
C2ON_bit = 0;
PORTA = 0;
TRISA = 0;
while(1) {
PORTA = ~PORTA;
Delay_ms(1000);
}
}

// Konfiguriraj sve noice kao digitalne


// Onemogui komparatore
// inicijaliziraj PORTA na 0
// konfiguriraj PORTA kao izlaz
// beskonana petlja
// invertuj PORTA
// 1 sekunda kanjenja

Kompajliramo program sa BuildBuild ili sa CTRL+F9, kao rezultat dobiemo hex datoteku
istog imena na istoj lokaciji gdje je i projekt, treba biti My Documents.
Uitavanje programa u model mikroraunara u Proteusu za simulaciju vrimo na sljedei nain
(vraamo se u Proteus): sa lijeve alatne trake biramo Selection Mode (ili strelicu), dvostrukim klikom na
MCU ulazimo u njegov meni, u Program File moramo dati tanu putanju do Led_Blink.hex i Processor
Clock Frequency moramo promijeniti na 8MHz (kao na slici). Ostale parametre komponente ne
mijenjamo.
Kad je ema napravljena i program uitan u MCU poinjemo sa simulacijom, u lijevom donjem
uglu nalazi se alatna traka za upravljanje simulacijom, pritisnite PLAY:

Dok traje simulacija ne moemo mijenjati nita na emi, prvo se mora zaustaviti simulacija sa STOP.

RADNI ZADACI:
1. U Help-u mikroC-a pod Built-In Routines nai funkciju Delay_ms i objasniti koja je maksimalna
vrijednost ulaznog argumenta funkcije.
2. U Help-u mikroC-a pronai operator ~ i objasniti njegovu funkciju u programu, vidjeti pod mikroC
Language Reference / Operators.
3. U Help-u mikroC-a nai kako se individualno adresiraju noice (pinovi) mikroraunara, pogledati
pod mikroC Specifics / Accessing Individual Bits.
4. Izmijeniti program tako da se ukljuuje samo pin RA0, a ne cijeli port.
5. Izmijeniti program tako da LED diode rade izmjenino.
6. U datasheet-u PIC16F887 pronai ANSEL i ANSELH registre i objasniti emu slue.

II VJEBA - TASTERI

Teoretski uvod
Na slici II-1 vidimo est spoj tastera na mikroraunar sa tzv. pull-up otpornikom. Prekida je
normalno otvorenog tipa (NO) i kad nije pritisnut preko otpornika napon od 5V dolazi na pin
mikroraunara to predstavlja logiku 1. (Na slici II-1 pull-up otpornik R1 je standardno visoke
vrijednosti npr. 10K jer elimo malu potronju struje, I = 5V / 10K). Kad se taster pritisne, to nazivamo
aktivno stanje, 0V je na pinu mikroraunara to predstavlja logiku 0. Program treba da detektuje tu
promjenu stanja iz 1 u 0.

Slika II-1. Spoj tastera na mikroraunar pomou pull-up otpornika

Meutim, kod tastera imamo problem mehanikog istitravanja kontakata (eng. debouncing) tako
da program, umjesto jednog, moe detektovati vie pritisaka na taster, i zbog toga, praviti greku. Za
spoj sa slike II-1 program moe detektovati vie nula prilikom jednog pritiska, a mi elimo da detektuje
samo jednu. Potrebno je znai, period u kojem se deava istitravanje kontakata, a to je odmah nakon
prve detektovane nule, na neki nain ignorisati. Hardverski se to radi sa kondenzatorom u paralelnom
spoju, a softverski sa podesiivim kanjenjem. Softverski nain je prikladniji od hardverskog, jer za svaki
prekida, moramo odreivati kondenzator eksperimentalno, dok softverski moemo mijenjati kanjenje u
pozivu funkcije kao to je to rijeeno funkcijom Button u mikroC kompajleru.
Funkcija Button se poziva sa nekoliko parametara na sljedei nain:
Button(&PORTA, 0, 10, 0)
gdje su parametri redom:
1.
2.
3.
4.

PORT na koji je taster spojen (PORTA)


Pin ili noica tog porta (pin 0) na koju je spojen prekida
Kanjenje u milisekundama (1ms) i
Aktivno stanje pina (0), koje logiko stanje ima pin kad se pritisne prekida.

Funkcija Button daje izlaz tipa bool, tj. true(istina) ili false(neistina), true ako je taster pritisnut i false ako
nije, pa je moemo pozvati unutar uslovne izjave npr.
if(Button(&PORTA, 0, 1, 0)) {
PORTB=0xFF;
}
i tih par linija koda e upisati sve jedinice u port B ako je taster na pinu 0 porta A pritisnut.
Da bi neki pin bio koriten za taster on mora biti deklarisan kao ulazni pin to radimo namjetanjem
TRIS registra, npr:
TRISA.F0 = 1; // port A pin 0 konfigurisan kao ulazni pin

Laboratorijska vjeba
Poinjemo sa izradom eme u Proteus-u dodavanjem elemenata sa LibraryPick
Device/Simbol te biramo sljedee elemente iz pripadnih kategorija i podkategorija (pogledati tabelu II-1).
Za uzemljenje sa lijeve strane alatne trake biramo Terminals ModeGND. Elemente povezujemo sa
Buses Mode (isto lijeva alatna traka). Na emu stavljamo taster sa pull-up otpornikom i dvije LED sa
otpornicima za ogranienje struje na noice RB2 i RB7.

Tabela II-1.
Kategorija / podkategorija
Microprocessor ICs / PIC16 F.
Resistors
Optoelectronics
Active

Element
PIC16F887
RES
LED
BUTTON

Komentar
MCU
Otpornik
LED dioda
SPST Push Button

Taster i LED dioda predstavljaju najosnovniji ulazno-izlazni interfejs mikroraunara. Taster


emo pritiskati u toku simulacije i program e reagirati ukljuenjem LED dioda na osnovu programske
logike.
U mikroC kompajleru pravimo novi projekat koji emo nazvati tasteri_1, biramo P16F887,
namjetamo frekvenciju na 8MHz i konfiguracijske bitove default-ne osim Power-up Timer gdje biramo
Enable, ime omoguavamo rad sklopa PWRT koji slui za odgaanje poetka izvravanja programa
sve dok se napon na MCU ne stabilizira to je vrlo korisno za ispravan poetak rada svakog sklopa.
Program koji e, dok drimo taster pritisnutim, ukljuivati i iskljuivati LED diode u razmaku od
pola sekunde izgleda ovako:
void main(){
ANSEL = 0;
// Konfiguriraj sve noice kao digitalne
ANSELH = 0;
C1ON_bit = 0;
// Onemogui komparatore
C2ON_bit = 0;
TRISA.F0=1;
// pin 0 porta A je ulazni pin za taster
TRISB.F2=0;
// pin 2 porta B je izlazni pin
TRISB.F7=0;
// pin 2 porta B je izlazni pin
PORTB.F2=0;
// diode su ugaene inicijalno
PORTB.F7=0;
while(1){
if(Button(&PORTA, 0, 10, 0)) { // ako je taster na RA0 pritisnut
PORTB.F2 = ~PORTB.F2;
// promijeni stanje pina 2 porta B
PORTB.F7 = ~PORTB.F7;
// promijeni stanje pina 7 porta B
Delay_ms(500);
// kasni pola sekunde
}
else {
PORTB.F2 = 0;
// neka su sigurno ugaene
PORTB.F7 = 0;
}
}
}

10

Za razliku od prethodnih programa ovdje koristimo individualno adresiranje pinova sintaksom


PORTB.F2 gdje je B naziv porta, a 2 broj pina (pinovi idu od 0 do 7 na portu B). Potrebno je ukljuiti
biblioteku Button u Library Manager-u (dole desno).
RADNI ZADACI:
1. Napisati program koji radi sljedee, kad nije pritisnut taster stalno svijetli dioda na RB2, a kad je
pritisnut pali se i gasi dioda na RB7 u intervalu od 1s s tim da je dioda na RB2 ugaena.
2. Dodati u simulacijskom modelu jo jedan taster na pin RA2 i napisati program koji e paliti i
gasiti LED diode, ako je pritisnut RA0 titra RB2, a ako je pritisnut RA2 titra RB7.

11

III VJEBA 7 SEGMENTNI DISPLEJ

Teoretski uvod
Unutar jednog 7-segmentnog displeja imamo 7 svjetleih dioda obiljeenih sa A, B, C, D, E, F i
G i dodatak DP - decimalnu taku. Postoje dvije vrste 7 segmentnih displeja, sa zajednikom anodom i
zajednikom katodom. Sve to je prikazano na slici III-1, isjeak iz datasheet-a SC52-11:

Slika III-1. Isjeak iz datasheet-a SC52-11


Prema emi SC52-11 (zajednika katoda) prikaz omoguavamo sa dovoenjem binarne
kombinacije na PORTB. Binarne kombinacije za PORTB predstavljene decimalno i heksadecimalno su
date u sljedeoj tabeli (prepisati tabelu III-1 i dopisati binarne vrijednosti u odgovarajuu kolonu):
Tabela III-1.
Decimalni broj koji se prikazuje
0
1
2
3
4
5
6
7
8
9

Heksadecimalna kombinacija
3F
06
5B
4F
66
6D
7D
07
7F
6F

12

Binarna kombinacija
00111111

Laboratorijska vjeba
7-segmentni displeji se obino veu preko mree otpornika (Rx8 u Proteusu vrijednosti 330
za standardno napajanje 5V) povezujemo segmente redom na pinove PORTB abecednim redom (A=0,
... , G=6). Displej emo nai u biblioteci Optoelectronics, CC je oznaka za Comon Cathode.
Prema slici III-2 napraviti novi projekt u Proteusu i snimiti ga u My Documents.

Slika III-2. Simulacijski model za III vjebu 7 SEGMENTNI DISPLEJ

U mikroC programu otvoriti novi projekt, postavke MCU staviti kao u II vjebi, fajl 7seg1.c
snimiti u My Documents sa sljedeim kodom:
unsigned short mask(unsigned short num);
unsigned short i;

// deklaracija funkcije
// deklaracija varijable i

void main() {
ANSEL = 0;
ANSELH = 0;
C1ON_bit = 0;
C2ON_bit = 0;
PORTB = 0;
TRISB = 0;
do {
for (i = 0; i <= 9; i++) {
PORTB = mask(i);

// Konfiguriraj sve noice kao digitalne


// Onemogui komparatore

13

Delay_ms(1000);
}
} while (1);
}
unsigned short mask(unsigned short num) {
switch (num) {
case 0 : return 0x3F;
case 1 : return 0x06;
case 2 : return 0x5B;
case 3 : return 0x4F;
case 4 : return 0x66;
case 5 : return 0x6D;
case 6 : return 0x7D;
case 7 : return 0x07;
case 8 : return 0x7F;
case 9 : return 0x6F;
}
}

// tijelo funkcije mask

RADNI ZADACI:
1. Dodati komentar na svaku liniju koda i objasniti program u potpunosti, osim INTCON registra,
posluiti se Help-om mikroC-a i literaturom, potrebno je dati objanjenje switch-case strukture,
for petlje, deklaracije i pozivanja funkcije, i tipova varijabli u mikroC-u, npr. unsigned short kakva je to varijabla?
2. Izmjeniti program i simulacijski model tako da po pritisku na taster GORE broj na displeju se
uveca za 1. Displej je na pocetku 0, a ako dodje do 9 mora ici opet na 0.
3. Izmjeniti program tako da radi i taster DOLE.
4. Izmjeniti program tako da se brojevi prikazuju u jednocifrenoj hex kombinaciji od 0 do F.
5. Izmjeniti program i simulacijski model tako da kad se simulacija pokrene na 7-segmentnom
displeju sa zajednikom anodom (CA Common Anode) bude ispisan broj 5, koji se svake
sekunde umanjuje za 1, poslije 0 ide na 9. (Potrebno je napisati novu tabelu binarnih
kombinacija i izmjeniti tijelo funkcije, korisititi datasheet, literaturu, internet...)

14

IV VJEBA LCD DISPLEJ


Napraviti simulacijski model u Proteusu prema slici IV-1, LCD uzimamo LM016L iz biblioteke
Optoelectronics. Probaemo testni program koji doe uz mikroC kompajler (ukljuiti LCD biblioteku).
// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections
char txt1[] = "EasyPIC5";
char txt2[] = "Lcd4bit";
char txt3[] = "mikroElektronika";
char txt4[] = "2x16 LCD testing";

char i;

// Loop variable

void Move_Delay() {
Delay_ms(500);
}

// Function used for text moving


// You can change the moving speed here

void main(){
ANSEL = 0;
ANSELH = 0;
C1ON_bit = 0;
C2ON_bit = 0;

// Configure AN pins as digital I/O


// Disable comparators

Lcd_Init();

// Initialize LCD

Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,txt3);

// Clear display
// Cursor off
// Write text in first row
15

Lcd_Out(2,1,txt4);
Delay_ms(3000);
Lcd_Cmd(_LCD_CLEAR);

// Write text in second row


// Clear display

Lcd_Out(1,5,txt1);
Lcd_Out(2,5,txt2);

// Write text in first row


// Write text in second row

Delay_ms(2000);
// Moving text
for(i=0; i<4; i++) {
Lcd_Cmd(_LCD_SHIFT_RIGHT);
Move_Delay();
}
while(1) {
for(i=0; i<8; i++) {
Lcd_Cmd(_LCD_SHIFT_LEFT);
Move_Delay();
}
for(i=0; i<8; i++) {
Lcd_Cmd(_LCD_SHIFT_RIGHT);
Move_Delay();
}

// Move text to the right 4 times

// Endless loop
// Move text to the left 7 times

// Move text to the right 7 times

}
}

16

Slika IV-1. Simulacijski model za IV vjebu LCD


RADNI ZADACI:
1. Objasniti funkcije LCD_Cmd i LCD_Out koritene u programu, pogledati u Help -> mikroC
Libraries.
2. Objasniti i probati funkciju Lcd_Chr.
3. Napisati program koji e ispisivati etsbi na LCD i to na nain da ispis kree u gornjem redu s
lijeve strane i pomjera se do kraja reda, a nastavlja se u donjem redu sa desne strane i tako u
krug.

17

V VJEBA - TASTATURA
Na sljedeem primjeru vidjeemo kako se na mikroraunar povezuje tastatura 3x4 (KEYPADPHONE), komponenta esto koritena u telefonskim aparatima, alarmnim ureajima, kalkulatorima i sl.
Za prikaz broja se koristi 7-segmentni displej sa BCD ulazima (7SEG-BCD) zbog manjka slobodnih
pinova. Simulacijski model spajamo prema slici V-1.

Slika V-1. Model za V vjebu - Proteus

Slika V-2. Elektrina ema tastature

Redovi na tastaturi su obiljeeni sa A,B,C i D (slika 9), a kolone sa 1,2 i 3, i pritisak na dugme
prespaja red i kolonu. Kolone spojene na RB1-2-3 su ulazni pinovi, a redovi spojeni na RB4-5-6-7 su
izlazni pinovi i inicijalno su svi na logikoj 1 tako da nema toka struje. Program skenira tastaturu, rezultat
se pohranjuje na PORTA, dekoder pretvara BCD-8421 kod u kod pogodan za ispis na 7-seg displej.
Funkcija keyscan radi tako to red spusti na logiku 0, i zatim provjeri da li je neki od tastera
spojenih na RB1-2-3 pritisnut, ako je pritisnut njegovo aktivno stanje je logika 0. U zavisnosti o kojem
se redu i tasteru radi funkcija vraa u glavni program cijeli broj za ispis. Redovi se skeniraju
neprestano jedan za drugim. Programski kod je sljedei:
unsigned short keyscan();
void main() {
TRISB.F1=1;
TRISB.F2=1;
TRISB.F3=1;
TRISB.F4=0;
TRISB.F5=0;
TRISB.F6=0;
TRISB.F7=0;
PORTB.F4=0;

// kolone 1,2,3 ulazni pinovi

// redovi A,B,C,D izlazni pinovi

18

PORTB.F5=0;
PORTB.F6=0;
PORTB.F7=0;
TRISA=0;
PORTA=0;

// redovi su inicijalno 0
// portA je izlazni
// portA je inicijalno 0

// beskonana petlja
do {
PORTA=keyscan();
} while(1);
}
// funkcija keyscan
unsigned short keyscan() {
unsigned short i;
PORTB.F4=0; // ispitujemo red A na RB4
for (i=1; i<4; i++) {
if(Button(&PORTB,i,1,0)) {PORTB.F4=1; return i;}
}
PORTB.F4=1;
PORTB.F5=0; // ispitujemo red B na RB5
for (i=1; i<4; i++) {
if(Button(&PORTB,i,1,0)) {PORTB.F5=1; return i+3;}
}
PORTB.F5=1;
PORTB.F6=0; // ispitujemo red C na RB6
for (i=1; i<4; i++) {
if(Button(&PORTB,i,1,0)) {PORTB.F6=1; return i+6;}
}
PORTB.F6=1;
PORTB.F7=0; // ispitujemo red D na RB7
for (i=1; i<4; i++) {
if(Button(&PORTB,i,1,0)) {PORTB.F7=1; return i+9;}
}
PORTB.F7=1;
}

RADNI ZADATAK:

Testirati ispravnost programa. Frekvenciju oscilatora u oba programa


staviti 1MHz.

19

VI VJEBA - AD KONVERZIJA

Teoretski uvod
Analogno-digitalna konverzija je postupak pretvorbe analogne veliine napona u digitalni oblik tj.
binarni broj. Samom postupku najee prethodi tzv. kondicioniranje ili prilagodba mjerene veliine u
podruju od interesa (pojaavanje i usklaivanje naponskih nivoa).
Da bi radili AD konverziju sa mikroraunarom potrebno je da isti ima ugraenu hardversku
komponentu koju nazivamo ADC modul. Neki mikroraunari imaju ADC modul, a neki nemaju, npr.
PIC16F887 ima, a PIC16F84A nema.
PIC16F877 ima AD modul 10-bitne rezolucije sa 14 kanala to nam daje mogunost mjerenja
14 razliitih analognih veliina (ali ne istovremeno). Svaki kanal je spojen na odgovarajui pin
mikroraunara (AN0, AN1, ... , AN13). Pin mora biti deklarisan kao ulazni (TRIS =1), i kao analogni
(ANSEL i ANSELH registri).
10-bitna rezolucija znai da imamo 210 = 1024 binarnih brojeva (0 i 1023) za registriranje
izmjerene veliine. Napon koji mjerimo moe biti maksimalnog raspona od 0 do 5V pa je tako
5V/1023=4,88mV razlika izmeu dva susjedna binarna broja i istovremeno najvea mogua greka. U
tabeli VI-1 date su neke vrijednosti napona i pripadajue binarne i decimalne vrijednosti (popuniti prazna
mjesta u tabeli):
Tabela VI-1
NAPON BINARNA VRIJEDNOST
5V
1111111111
3V
1001100110
0011011011
0000010011
4,88mV 0000000001
0
0000000000

DECIMALNA VRIJEDNOST
1023
614

1
0

Vea rezolucija znai veu preciznost AD konvertora, npr. ako imamo 8-bitni ADC napon od 5V
moemo prikazati sa 28=256 vrijednosti (0 i 255). 5V/255=19,6mV je razlika izmeu dva susjedna
binarna broja i istovremeno najvea mogua greka, to je 4 puta vea greka nego kod 10-bitnog ADC.
mikroC kompajler ima ugraenu funkciju Adc_read koja nam omoguava lagan rad sa ADC
modulom, tj. lako oitavanje vrijednosti napona. Prototip Adc_read funkcije je sljedei:
unsigned Adc_read(unsigned short channel)
gdje su:

unsigned - izlazni tip (unsigned int) cijeli broj bez predznaka veliine 2 bajta kojim moemo
prikazati brojeve od 0 do 65535;
Adc_read naziv funkcije;

20

unsigned short tip ulaznog argumenta, unsigned short int, kratki cijeli broj bez predznaka
veliine 1 bita kojim moemo prikazati brojeve od 0 do 255
channel opis ulaznog argumenta, ulazni argument je broj kanala na kojem se vri AD
konverzija, npr. za pin AN2 taj argument bie 2.

Za potrebe simulacije na ADC kanal dovodiemo srednji izvod potenciometra (POT-HG) koji
moemo pomjerati gore-dole i time mjenjati odnos otpora tj. napon na ADC u toku simulacije. Spojiemo
i DC voltmetar na ulaz ADC radi kontrole oitanja napona (nalazi se u lijevoj alatnoj traci - slika VI-2).

Slika VI-1. AD konverzija na pinu AN2 (RA2)

Slika VI-2. DC voltmetar

ANSEL i ANSELH registri slue za konfiguraciju pinova u analogne to je potrebno uiniti prije
ulaska u beskonanu petlju ako emo raditi AD konverziju. Kao to se vidi na slici VI-1, pinovi imaju
viestruku mogunost konfiguracije, digitalni, analogni ili neku specifinu funkciju.
U ovom primjeru koristimo pin 2 na portu A tj. AN2 i pripadajui bit u ANSEL registru mora biti 1.
Ostali pinovi su deklarirani kao digitalni i moraju biti 0, konfiguracija u C-u e izgledati ovako:
ANSEL = 0x04;
ANSELH = 0x00;

// AN2 analogni, ostali digitalni


// svi digitalni

a izgled registara u memoriji ovako (ispod su oznake pinova):

ANSELH
7

0
0
AN13

0
AN12

21

0
AN11

0
AN10

AN9

0
AN8

ANSEL
7

0
0

0
AN7

0
AN6

0
AN5

0
AN4

1
AN3

0
AN2

0
AN1

AN0
U mikroC kompajleru imamo 2 primjera programskog koda za AD konverziju, u prvom primjeru
ADC_on_LEDs oitavamo vrijednost na kanalu 2 (AN2) i svih 10 bitova prikazujemo pomou LED dioda
spojenih na port D i dva najznaajnija na port B, bitove 7 i 6. U toku simulacije umjesto pojedinanih
LED dioda i koristiemo LED_BARGRAPH element spojen preko otporne mree kao na slici VI-3.

Slika VI-3. LED_BARGRAPH element


Binarne teine idu od 1 do 10 na displeju, 1 je 20, 10 je 29. U toku simulacije oitaemo napon
sa voltmetra i provjeriti da li odgovara vrijednosti na displeju, npr. napon od 2.75V treba biti jednak
decimalnoj vrijednosti 563, binarno 1000110011 to na displeju treba biti prikazano ovako:
1
1
0
0
1
1
0
0
0
1

PORTD.BIT0
PORTD.BIT1
PORTD.BIT2
...

PORTD.BIT6
PORTD.BIT7
PORTB.BIT6
PORTB.BIT7

Instrukcijom temp_res=Adc_Read(2) 10-bitna vrijednost oitanog napona pohranjena je u


varijablu temp_res od 16 bita na nain da 6 najteih bitova ostaje 0. Sad je za prikaz potrebno kopirati
lakih 8 bitova u port D to inimo instrukcijom PORTD = temp_res. Dva najznaajnija bita varijable
22

trebamo prebaciti u port B na bitove 6 i 7. To inimo instrukcijom PORTB = temp_res>>2 tako da


pomjerimo u desno sve za 2 mjesta i zatim prebacimo takvu varijablu u port B.
Drugi primjer u mikroC kompajleru ADC_on_LCD radi AD konverziju i ispis izmjerene vrijednosti
napona na matrini displej 2x16. U programskom kodu je pokazano na koji nain se binarni broj
pretvara u decimalni, razumljiv ovjeku, i prilagoava za ispis na LCD kao niz ASCII karaktera sa
pomonim znakovima. Za potrebe simulacije spojiemo LCD displej na slobodni port C kao na slici VI-4.

Slika VI-4. LCD na portu C


Programski kod za AD konverziju na LED diode i LCD sa objanjenjem dat je u sljedea dva
listinga:
// AD konverzija na LED diode PIC16F887
unsigned int temp_res;
void main() {
ANSEL = 0x04;
TRISA = 0xFF;
ANSELH = 0;
TRISB = 0x3F;
TRISD = 0;

// Konfigurii AN2 pin kao analogni


// PORTA je ulazni
// Konfigurii ostale pinove kao digitalne I/O
// Pinovi RB7, RB6 su izlazni
// PORTD je izlazni

do {
temp_res = ADC_Read(2);
// Oitaj 10-bitni rezultat AD konverzije na 2. kanalu
PORTD = temp_res;
// Poalji 8 lakih bitova na PORTD
PORTB = temp_res >> 2;
// Poalji 2 najtea bita na RB7 i RB6
// sa temp_res >> 2 pomiemo svih 10 bitova za 2 mjesta u desno i kad to dodjelimo portu B sa
// PORTB = imaemo 8 i 9 bit na 6 i 7 mjestu u portu B
} while(1);
}

23

// AD konverzija na LCD PIC16F887


PIC16F887
// ovdje ubaciti konfiguraciju LCD-a (koristiti vjebu LCD)
unsigned char ch;
unsigned int adc_rd;
char *text;
long tlong;
void main() {
INTCON = 0;
ANSEL = 0x04;
TRISA = 0x04;
ANSELH = 0;
Lcd_Init();
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Cmd(_LCD_CLEAR);
text = "AD konverzija";
Lcd_Out(1,1,text);
text = "LCD example";
Lcd_Out(2,1,text);
ADCON1 = 0x82;
TRISA = 0xFF;
Delay_ms(2000);
text = "voltage:";
while (1) {
adc_rd = ADC_read(2);
Lcd_Out(2,1,text);
tlong = (long)adc_rd * 5000;
tlong = tlong / 1023;
ch = tlong / 1000;
Lcd_Chr(2,9,48+ch);
Lcd_Chr_CP('.');
ch = (tlong / 100) % 10;
Lcd_Chr_CP(48+ch);
ch = (tlong / 10) % 10;
Lcd_Chr_CP(48+ch);
ch = tlong % 10;
Lcd_Chr_CP(48+ch);
Lcd_Chr_CP('V');
Delay_ms(1);

// 1 byte
// 2 byte
// pokaziva na 1 byte
// 4 byte

// Onemogui sve prekide


// Konfigurii AN2 pin kao analogni
// Konfigurii ostale pinove kao digitalne I/O

// ispii string na LCD, 1. red, 1. kolona


// 2. red, 1. kolona
// Konfigurii VDD kao Vreferentni
napon, i analogne kanale
Vref
// PORTA je ulazni

// Oitaj 10-bitni rezultat AD konverzije na 2. kanalu


// pretvori rezultat oitanja u milivolte
// 0..1023 -> 0-5000mV
// izvuci broj koji je 1 napona
// ispii napon kao ASCII u 2. red, 9. Kolona
// ASCII decimalni brojevi kreu od 48 (48=0, 49=1, itd...)
// ispii taku na trenutnu poziciju kurzora
// izvuci broj koji je 0.1 napona (% je mod operacija)
// ispii ASCII na trenutnu poziciju kurzora
// izvuci broj koji je 0.01 napona
// ispii ASCII na trenutnu poziciju kurzora
// izvuci broj koji je 0.001 napona
// ispii ASCII na trenutnu poziciju kurzora
// dodajemo V za volte na kraju ime je ispis sloen

}
}//~!
24

Laboratorijska vjeba
RADNI ZADATAK: Koristei programski kod iz gornja dva listinga napisati program koji e
pokrenuti simulaciju sa slike VI-5, napraviti simulacijski model u Proteusu i testirati izvoenje programa.

Slika VI-5. VI vjeba AD KONVERZIJA


Pri izvoenju vjebe raditi dio po dio, prvo uraditi LED_BARGRAPH, a zatim ubaciti LCD displej
koji treba prvo probati sa Lcd_Chr komandom, i tek onda ubacivati kod za taj primjer (paziti gdje ta
ide).
Objasniti ADCON1 registar (pogledati datasheet PIC16F887).

25

VII VJEBA - PREKIDI

Teoretski uvod
Prekidi su najmoniji alat u programiranju mikroraunara i esto se koriste. Prekid u izvravanju
nekog programa deava se u bilo kojem dijelu programa sa svrhom da se izvri odreena radnja koja je
prioritetna, takvu radnju zovemo prekidna servisna rutina (eng. interrupt service routine). Prekid moe
biti vanjski ili unutranji, imamo vie vrsta prekida zavisno od mikroraunara, npr. PIC16F84A ima etiri
razliita prekida i moemo ih koristiti sve odjednom, u katalokim podacima (datasheet) navedeno je da
su to sljedei prekidi:
1.
2.
3.
4.

Vanjski prekid na RB0/INT pinu


Prekid pri preljevu tajmera 0 (TMR0), moe biti unutranji ili vanjski na RA4/T0CKI pinu
Promjena na portu B, pinovi 4-7
Kraj upisivanja podataka u EEPROM

Svaki izvor prekida ima pridruena dva bita u INTCON (INTerruptCONtrol) registru (osim to za provjeru
upisa u EEPROM koristimo EECON1 registar), jednim bitom omoguujemo taj prekid, a drugim
detektujemo da se taj prekid desio. Tu je i zajedniki bit GIE (Global Interrupt Enable) kojim se
omoguuju ili zabranjuju svi prekidi odjednom. Prekidna logika PIC16F84A izgleda kao na slici VII-1.

Slika VII-1. Prekidna logika PIC16F84A


U INTCON registru, osim GIE bita, svi bitovi zavravaju sa IE Interrupt Enable (omogui prekid) ili IF
Interrupt Flag (prekidna zastavica). Setovanjem, tj. postavljanjem na logiku 1 bitova IE omoguavamo
odreeni prekid da se desi, npr. naredbom: INTCON.RBIE = 1; omoguili smo vanjski prekid na
RB0/INT pinu. Ispitivanjem IF bitova detektujemo da se odreeni prekid desio to je obavezno ako
radimo sa vie prekida. IF bit ispitujemo tako to provjeravamo da li je taj bit setovan tj. poprimio
vrijednost logike 1 (podignuta zastavica), npr. naredbom: if (INTCON.RBIF) { ... } izvrie se dio koda
unutar vitiastih zagrada ako se desio vanjski prekid na RB0/INT pinu.

26

Slika VII-2. INTCON i OPTION_REG registri kojima se podeavaju prekidi


OPTION_REG registar nam slui da definiemo dodatne parametre vezane za prekide, PS bitovi slue
za djelilo vremenskog sklopa (Timer0 prescaler), T0 bitovi za odreivanje izvora impulsa, INTEDG za
rastui ili padajui brid impulsa na INT pinu i RBPU za omoguavanje internih pull-up otpornika na
portu B. (Detaljne informacije o prekidima pronai u katalokim podacima i literaturi.)

Laboratorijska vjeba
Za laboratorijsku vjebu ispitivanja prekida napraviti simulacijski model kao na slici VII-3.
Ispitujemo dva prekida, vanjski na RB0 pinu koji se deava pritiskom na taster, dioda D1 mijenja svoje
stanje, i unutranji na Timer0 koji radi na takt mikroprocesora i uzrokovan je preljevom registra sa
maksimalne vrijednosti 0xFF na minimalnu vrijednost 0x00. Za frekvenciju oscilatora od 8MHz koja je
zadana za ovu vjebu, Timer0 registar se uvea za 1 svakih 500ns bez koritenja djelila (prescaler).
Kad se prekid na Timer-u 0 desi kratko se upali LED dioda D2.

Slika VII-3. VII vjeba PREKIDI

27

Programski kod je sljedei:


unsigned cnt;
void interrupt() {
if(INTCON.INTF){
PORTA.F0=~PORTA.F0;
}
else{
cnt++;
TMR0 = 96;
}
INTCON = 0xB0;
}
void main() {
OPTION_REG = 0x84;
TRISB.F0 = 1;
TRISB.F7 = 0;
TRISA.F0 = 0;
TMR0 = 96;
INTCON = 0xB0;
cnt = 0;
do {
if (cnt == 400) {
PORTB.F7=~PORTB.F7;
cnt = 0;
}
} while(1);

// prekidna rutina

// RB0 je ulazni
// RB7 je izlazni
// RA0 je izlazni
// Timer0 pocetna vrijednost
// cnt pocetna vrijednost
// beskonana petlja
// Promijeni stanje RB7
// Reset cnt

RADNI ZADACI:
1. Skicirati OPTION_REG registar sa postavkom u mainu na hex 84, i objasniti kako je namjeten
taj registar, koristiti datasheet.
2. Skicirati INTCON registar sa postavkom u mainu na hex B0 i objasniti kako je postavljen sa
opisom svih bitova tog registra, koristiti datasheet.
3. Zato je poetna vrijednost TMR0 96? U kojem vremenu se deava prekid? Izraunati. Voditi
rauna o tome da je prescaler 1:32.
4. emu slui varijabla cnt? Zato ide do 400?
5. Na koji nain se ispituje unutar prekidne rutine koji se prekid desio? Objasni if else strukturu
koja se tu koristi.
28

You might also like