You are on page 1of 26

Laboratorijska vježba br.

1
Naziv vježbe: Izrada projekta kontrole 7-segmentnih displeja

DIO 1.
1. Uvodni dio

Zadatak:
Potrebno je realizirati program za mikrokontroler PIC16F887 koji će na portovima od
PORTA do PORTD paliti i gasiti led diode u vremenskom razmaku od 1s. Pomoću kompajlera
prevesti kôd u HEX format. Nakon toga izvršiti simulaciju hardverskog sistema u
programskom paketu Proteus i potvrditi ispravnost napisanog programa učitavanjam u
mikrokontroler. Otkloniti eventualne greške u programskom kodu.

Implementacija rješenja:
U programskom paketu mikroC napraviti projekat pod nazivom LedBlink na slijedeći
način:

 Pokrenuti New Project Wizard iz menija Project->New Project

 Izabrati mikokontroler P16F887

 Odabrati frekvenciju oscilatora 8MHz

1
 Dati ime projektu i spremiti ga u za tu namjenu predviđen folder na D: disku (IV1-4 -
>MikroC->LedBlink)

 Preskočiti slijedeći korak klikom na Next i zavšiti Wizard klikom na Finish.


 Otvoriće se prazan projekat u kojeg je potrebno upisati slijedeći programski kôd

 U slijedećem koraku potrebno je kompajlirati napisani program odabirom


Project->Build. U donjem dijelu prozora prikazaće se statistika o procesu
kompajliranja i eventualnim greškama.
 Sada je u folderu gdje smo snimili projekat generiran fajl sa nastavkom .hex, u
ovom slučaju LedBlink.hex. Ovaj fajl je sve što nam je potrebno da pređemo
na slijedeći korak hardverske simulacije sistema.

U programskom paketu Proteus napraviti novi projekat pod nazivom LedBlink na


slijedeći način:
 Iz menija File izabrati New Design i snimiti ga (opcija Save Design As) pod
nazivom LedBlink u folder na D: disku (IV1-5->Proteus->LedBlink). Otvoriće se
prazna radna površina za unos nove sheme.
 Iz biblioteke komponenata izabrati mikrokontroler PIC16F887 i led diode
potrebne za projekat.

2
 Sastaviti shemu prema slijedećoj slici.

U1
1 15
RE3/MCLR/VPP RC0/T1OSO/T1CKI
16
RC1/T1OSI/CCP2
2 17
RA0/AN0/ULPW U/C12IN0- RC2/P1A/CCP1
R1 R2 R3 R4 R5 R6 3
RA1/AN1/C12IN1- RC3/SCK/SCL
18 R17 R18 R19 R20 R21 R22 R23 R24
1k 1k 1k 1k 1k 1k 4 23 1k 1k 1k 1k 1k 1k 1k 1k
RA2/AN2/VREF-/CVREF/C2IN+ RC4/SDI/SDA
5 24
RA3/AN3/VREF+/C1IN+ RC5/SDO
6 25
RA4/T0CKI/C1OUT RC6/TX/CK
7 26
RA5/AN4/SS/C2OUT RC7/RX/DT
14
RA6/OSC2/CLKOUT
D17 D18 D19 D20 D21 D22 13
RA7/OSC1/CLKIN RD0
19 D7 D6 D5 D1 D2 D3 D4 D8
LED-BIRG
LED-BIRG
LED-BIRG
LED-BIRG
LED-BIRG
LED-BIRG 20 LED-BIBY
LED-BIBY
LED-BIBY
LED-BIBY
LED-BIBY
LED-BIBY
LED-BIBY
LED-BIBY
RD1
33 21
RB0/AN12/INT RD2
34 22
RB1/AN10/C12IN3- RD3
35 27
RB2/AN8 RD4
36 28
RB3/AN9/PGM/C12IN2- RD5/P1B
37 29
RB4/AN11 RD6/P1C
38 30
RB5/AN13/T1G RD7/P1D
39
RB6/ICSPCLK
40 8
RB7/ICSPDAT RE0/AN5
9
RE1/AN6
10
RE2/AN7
PIC16F887

R9 R10 R11 R12 R13 R14 R15 R16 R25 R26 R27 R28 R29 R30 R31 R32
1k 1k 1k 1k 1k 1k 1k 1k 1k 1k 1k 1k 1k 1k 1k 1k

D25 D26 D27 D28 D29 D30 D31 D32 D16 D9 D10 D11 D12 D13 D14 D15
LED-BIRY
LED-BIRY
LED-BIRY
LED-BIRY
LED-BIRY
LED-BIRY
LED-BIRY
LED-BIRY LED-BIGY
LED-BIGY
LED-BIGY
LED-BIGY
LED-BIGY
LED-BIGY
LED-BIGY
LED-BIGY

 Učitati LedBlink.hex u mikrokontroler na slijedeći način

3
 Podesiti frekvenciju oscilatora na 8MHz i pokrenuti simulaciju klikom na
dugme Play u donjem lijevom uglu.

 Ispraviti eventualne greške i analizirati rezultate simulacije.


Dodatni zadatak (ocjena 5):

 Prepraviti programski kod iz prethodnog zadatka tako da se ne koristi


višestruko dodjeljivanje vrijednosti portovima već da se izmjena stanja na
portovima vrši kroz brojačku petlju. Program testirati na istoj shemi.

Zadaća:
 Korištenjem User Manual-a za mikrokontroler PIC16F887 skicirati i ukratko
objasniti ulogu konfiguracijskih registara korištenih u ovom primjeru (TRISA,
TRISB, TRISC, TRISD).
 U help-u mikroC-a pronaći funkciju Delay_ms() i dokumentirati njen način
korištenja.
 Objasniti način rada do-while beskonačne petlje. Zašto je ova petlja specifična
kod sistema baziranih na mikrokontrolerima.
 Na internetu pronaći jednostavne primjere korištenja 7-segmentnih displeja i
tastera kod sistema sa mikrokonrolerima.

4
2. DIO 7-segmentni display – Implementacija rješenja

Zadatak:
Potrebno je osmisliti algoritam upravljanja sa 7-segmentnim display-om. Detaljno
analizirati rad diplay-a, nacrtati njegovu internu shemu, nacrtati tablicu kombinacija
za paljenja pojedinih segmenata u heksadecimalnom i binarnom sistemu. Napisati
programski kod prema tabelama u programskom paketu MikroC, kompajlirati i
provjeriti njegovu ispravnost u Proteusu.

Rješenje:

sl.1 Interna struktura 7-segmentnog display-a

Unutar jednog 7-segmentnog displeja imamo 7 svjetlećih dioda obilježenih sa A,


B, C, D, E, F i G i dodatak DP - decimalnu tačku. Postoje dvije vrste 7 segmentnih
displeja, sa zajedničkom anodom i zajedničkom katodom.

Pojedinačni pin mikrokontrolera se ne smije opteretiti strujom većom od 20mA


tako da moramo ograničiti struju kroz svaki pojedini segment na manji iznos. Ovo
ćemo uraditi dodavanjem otpornika od 330ohm u seriju sa svakim segmentom (led
diodom).
Tabela koja je u nastavku prikazana predstavlja osnov za pisanje programa. U
tabelu je potrebno upisati binarne i heksadecimalne vrijednosti koje odgovaraju

5
decimalnim brojevima sa lijeve strane tabele, odnosno redosljedu paljenja
segmenata da bi se prikazala svaka pojedinačna decimalna cifra.

Decimalni broj koji se Heksadecimalna Binarna kombinacija


prikazuje kombinacija RD0 RD1 RD2 RD3 RD4 RD5 RD6

0 0x3F 0011 1111

1 0x06 0000 0110

2 0x5B 0101 1011

3 0x4F 0100 1010

4 0x66 0110 0110

5 0x6D 0110 1110

6 0x7D 0111 1110

7 0x07 0000 0111

8 0x7F 0111 1010

9 0x6F 0110 1010

Tabela 1. Stanja pojedinih segmenata

Program za upravljanje 7-segmentnim display-om prikazan je u nastavku:

unsigned short maska(unsigned short kombinacija); //Deklaracija


funkcije maska

unsigned short i; //Deklaracija brojačke varijable

void main() {
INTCON = 0; //Isključi GIE, PEIE,INTE,RBIE,T0IE
PORTA = 0;
TRISA = 0;
PORTD = 0;
TRISD = 0;
do {
for (i = 0; i <= 9; i++) {//Brojačka petlja
PORTA = 1; //Upali tranzistor i omogući
paljenje segmenata
PORTD = maska(i); //Postavi odgovarajuću
kombinaciju na PORTD

6
Delay_ms(500);
}
} while (1); //Beskonačna petlja
}
//Tijelo funkcije maska
unsigned short maska(unsigned short kombinacija) {
switch (kombinacija) {
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;
}
}

Sastaviti shemu u Proteus-u, učitati .HEX file i provjeriti ispravnost programa.

U1
1 15
RE3/MCLR/VPP RC0/T1OSO/T1CKI
16
RC1/T1OSI/CCP2
2 17
RA0/AN0/ULPWU/C12IN0- RC2/P1A/CCP1
3 18
RA1/AN1/C12IN1- RC3/SCK/SCL
4 23
RA2/AN2/VREF-/CVREF/C2IN+ RC4/SDI/SDA
5 24
RA3/AN3/VREF+/C1IN+ RC5/SDO
6 25
RA4/T0CKI/C1OUT RC6/TX/CK
7 26
14
RA5/AN4/SS/C2OUT RC7/RX/DT RN1
RA6/OSC2/CLKOUT
13 19 1 16
RA7/OSC1/CLKIN RD0
20 2 15
RD1
33 21 3 14
RB0/AN12/INT RD2
34 22 4 13
RB1/AN10/C12IN3- RD3
35 27 5 12
RB2/AN8 RD4
36 28 6 11
RB3/AN9/PGM/C12IN2- RD5/P1B
37 29 7 10
RB4/AN11 RD6/P1C
38 30 8 9
RB5/AN13/T1G RD7/P1D
39
RB6/ICSPCLK
40 8 330
RB7/ICSPDAT RE0/AN5
9
RE1/AN6
10
RE2/AN7
PIC16F887

R1 Q1
2N2222
2k

sl.2 Shematski prikaz sklopa za upravljanje 7-segmentnim display-om u Proteus-u

Zadaća:

7
 Napisati program koji će ispisivati dvocifrene brojeve na dva 7-seg display-a

3. DIO 7-segmentni display (multiplex mod)


Zadatak:
Za grupu od četiri 7-segmentna display-a potrebno je osmisliti algoritam upravljanja koji
će omogućiti korištenje jednog porta mikrokontrolera za sva četiri display-a. Na osnovu
algoritma upravljanja napisati programski kod u programskom paketu MikroC. Kompajlirati
ga i provjeriti njegovu ispravnost u Proteusu i na razvojnom sistemu EasyPIC 5 (razvojni
sistem konfigurisati tako da je omogućen rad sa 7-segmentnim display-ima).
Implementacija rješenja:
Na osnovu napisanog programa u programskom paketu Proteus nacrtati shemu spoja
zadatog sklopa. Za dato programsko rješenje problema potrebno je napisati programske
komentare. Za konverziju iz decimalnog u heksadecimalni sistem koristiti funkciju maska()
iz prethodnog zadatka. Objasniti sistem korištenja prekida koji se u ovom primjeru koristi.
Takođe, objasniti način na koji se rastavljen četverocifreni broj i spremljen u niz. Objasniti
način na koji se upravlja radom pojedinačnih 7-segmentnih display-a (tranzistori i PORTA).
Objasniti prednosti ovakvog načina upravljanja u odnosu na višeportno.
Programski kod:

unsigned short shifter, portd_index; TMR0 = 0;


unsigned int cifra, broj; TMR0IF_bit = 0;
unsigned short PORTD_niz[4]; }

unsigned short maska(unsigned short void main() {


kombinacija){
switch (kombinacija) { ANSEL = 0;
case 0 : return 0x3F; ANSELH = 0;
case 1 : return 0x06;
case 2 : return 0x5B; TRISA = 0;
case 3 : return 0x4F; PORTA = 0;
case 4 : return 0x66; TRISD = 0;
case 5 : return 0x6D; PORTD = 0;
case 6 : return 0x7D;
case 7 : return 0x07; OPTION_REG = 0x03;
case 8 : return 0x7F; TMR0 = 0;
case 9 : return 0x6F; cifra = 0;
} portd_index = 0;
} shifter = 1;
void interrupt() {
PORTA = 0; broj = 1234;
PORTD = PORTD_niz[portd_index]; GIE_bit = 1;
PORTA = shifter; TMR0IE_bit = 1;

shifter <<= 1; do {
if (shifter > 8) cifra = broj / 1000 ;
shifter = 1; PORTD_niz[3] = maska(cifra);
cifra = (broj / 100) % 10;
portd_index++ ; PORTD_niz[2] = maska(cifra);
if (portd_index > 3) cifra = (broj / 10) % 10;
portd_index = 0; PORTD_niz[1] = maska(cifra);

8
cifra = broj % 10; broj++ ;
PORTD_niz[0] = maska(cifra); if (broj > 9999)
broj = 0;
Delay_ms(100); } while(1);
}

U1
1 15
RE3/MCLR/VPP RC0/T1OSO/T1CKI
16
RC1/T1OSI/CCP2
2 17
RA0/AN0/ULPWU/C12IN0- RC2/P1A/CCP1
3 18
RA1/AN1/C12IN1- RC3/SCK/SCL
4 23
RA2/AN2/VREF-/CVREF/C2IN+ RC4/SDI/SDA
5 24
RA3/AN3/VREF+/C1IN+ RC5/SDO
6 25
RA4/T0CKI/C1OUT RC6/TX/CK
7 26
14
RA5/AN4/SS/C2OUT RC7/RX/DT RN1
RA6/OSC2/CLKOUT
13 19 1 16
RA7/OSC1/CLKIN RD0
20 2 15
RD1
33 21 3 14
RB0/AN12/INT RD2
34 22 4 13
RB1/AN10/C12IN3- RD3
35 27 5 12
RB2/AN8 RD4
36 28 6 11
RB3/AN9/PGM/C12IN2- RD5/P1B
37 29 7 10
RB4/AN11 RD6/P1C
38 30 8 9
RB5/AN13/T1G RD7/P1D
39
RB6/ICSPCLK
40 8 330
RB7/ICSPDAT RE0/AN5
9
RE1/AN6
10
RE2/AN7
PIC16F887

R1 Q1 R2 Q2 R3 Q3 R4 Q4
2N2222A 2N2222A 2N2222A 2N2222A
330 330 330 330

Sl.3 Shematski prikaz sklopa za upravljanje 7-segmentnim display-om u Proteus-u, multiplex


mod rada

4. DIO 7-segmentni display (multiplex mod- prikaz stanja AD konvertora)

Zadatak:
Korištenjem potenciometra spojenog na izvor istosmjernog napona, izvršiti mjerenje
napona pomoću AD konvertora. Izmjereni napon, u osnovnom obliku (od 0 do 1023) prikazati
na 7-segmentnom displeju. Kao ulaz za AD konverziju koristiti pin RB4.

9
Laboratorijska vježba br.2
Naziv vježbe: Izrada projekta kontrole 2x16 matričnog (LCD) displeja
1. Uvodni dio

Zadatak: Potrebno je osmisliti shemu spoja i napisati program koji će na LCD displej-u
ispisivati zadate poruke. Shema treba da se sastoji od mikrokontrolera PIC16F887 na čijem
PORTu-B treba da je spojen LCD displej (2x16) baziran na Hitachi HD44780 kontroleru.
Program treba da koristi gotove funkcije MikroC kompajlera za rad sa LCD displej-ima. Svaku
od funkcija je potrebno detaljno analizirati i komentirati.

Implementacija rješenja:
Na osnovu napisanog programa u programskom paketu Proteus nacrtati shemu spoja
zadatog sklopa. Pomoću zadate literature (Pic Mcu Input And Output Device Interfacing) definisati
svaki pojedini pin na LCD displeju. Za dato programsko rješenje problema potrebno je komentarisati i
svaku funkciju posebno analizirati i ukratko opisati. Prepraviti programski kôd tako da pravilno
ispisuje kompletnu poruku “Srednja Elektrotehnicka Skola Bihac”. Izvršit simulaciju rada cjelokupnog
rješenja i ispraviti eventualne pogreške.

Programski kôd:
ANSELH = 0;
sbit LCD_RS at RB4_bit; C1ON_bit = 0;
sbit LCD_EN at RB5_bit; C2ON_bit = 0;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit; Lcd_Init();
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit; Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
sbit LCD_RS_Direction at TRISB4_bit; Lcd_Out(1,6,txt3);
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit; Lcd_Out(2,6,txt4);
sbit LCD_D5_Direction at TRISB1_bit; Delay_ms(2000);
sbit LCD_D6_Direction at TRISB2_bit; Lcd_Cmd(_LCD_CLEAR);
sbit LCD_D7_Direction at TRISB3_bit;
Lcd_Out(1,1,txt1);
Lcd_Out(2,5,txt2);
char txt1[] = "Srednja";
char txt2[] = "Elektrotehnicka"; Delay_ms(2000);
char txt3[] = "Skola";
char txt4[] = "Bihac";
for(i=0; i<4; i++) {
char i; Lcd_Cmd(_LCD_SHIFT_RIGHT);
Move_Delay();
void Move_Delay() { }
Delay_ms(500);
} while(1) {
for(i=0; i<8; i++) {
void main(){ Lcd_Cmd(_LCD_SHIFT_LEFT);
ANSEL = 0; Move_Delay();

10
}

for(i=0; i<8; i++) {


Lcd_Cmd(_LCD_SHIFT_RIGHT);
Move_Delay();
}
}
}

Laboratorijska vježba br.3


Naziv vježbe: Upotreba tastera
1. Dio

Zadatak: Potrebno je, na osnovu programskog listinga, odrediti algoritam rada programa, sastaviti
shemu u Proteus-u, kompajlirati kod i izvršiti njegovo testiranje. Algoritam opisati pomoću
pseudokoda. Korištenjem „Help-a“ MikroC razvojnog okruženja, opisati funkciju Button() i njene
argumente. Kako istitravanje tastera utiče na tačnost njegovog očitanja? Razjasniti tu problematiku!!
Napisati programske kometare.
Rješenje:
Postoje dva načina spajanja tastera na mikrokontroler (slika). U zavisnosti na koji način su
tasteri spojeni, očitavaju se logička stanja na pinu mikrokontrolera. Vrijednosti otpornika R 1 i R2 su
najčešće u rasponu od 1-10kΩ. MikroC posjeduje funkciju za rad sa tasterima
(Button(__,__,__,__)) koja ima četiri argumenta. Svaki od argumenata ima svoju funkciju
(pronaći u help-u MikroC-a i opisati svaki argument). Tateri se napajaju istim naponom kao i
mikrokontroler. Na ovakav način se spaja i veoma velik broj različitih vrsta senzora.

11
Slika 1. Način spajanja tastera na mikrokontroler

Sl.2 Izgled tastera


Programski listing:

bit staro_stanje;

void main() {

ANSEL = 0;
ANSELH = 0;

TRISB0_bit = 1;

TRISC = 0x00;
PORTC = 0xAA;

staro_stanje = 0;

do {
if (Button(&PORTB, 0, 1, 1)) {
staro_stanje = 1;
}
if (staro_stanje && Button(&PORTB, 0, 1, 0)) {

12
PORTC = ~PORTC;
staro_stanje = 0;
}
} while(1);
}

2. Dio
Prepraviti postojeći program tako da koristi shemu sa slike 1 uz dodatak led diode sa
predotporom (proračunati predotpor). Led diodu spojiti na pin RC1. Tasterom spojenim na RB0 pin
paliti diodu, a tasterom spojenim na RB1 pin gasiti diodu. Kompletan programski kod detaljno
komentarisati. Simulaciju rada sklopa izvršiti u Proteusu (naparaviti novi MikroC i Proteus folder).

Zadatak za zadaću:

Prepraviti programski kod iz 2. dijela tako da se za očitanje stanja tastera ne koristi


Button() funkcija nego if() uslovna naredba.

Laboratorijska vježba br.4


Naziv vježbe: Upotreba AD konvertora

Zadatak: Opisati funkciju programskog koda. Napisati programske komentare. Koristiti MikroC
kompajler.

Rješenje:

unsigned int temp_res;


void main() {
ANSEL = 0x04;
TRISA = 0x04;
ANSELH = 0x00;
TRISC = 0x00;
TRISD = 0x00;
do {
temp_res = ADC_Read(2);
PORTC = temp_res;
PORTD = (temp_res >> 2) & 0b11000000;
} while(1);
}

13
Zadatak:
Prepraviti program i el.shemu tako da se koriste dva AD kanala za mjerenje. Koristiti još jedan
potenciometar, a pomoću tastera u pull-up konfiguraciji, izvršiti odabir kanala sa kojeg će se vršiti
mjerenje. Rezultat mjerenja, za oba slučaja prikazati kao i u vježbi. Rezultate mjerenja potvrditi
računski u svesci!!
Laboratorijska vježba br.5
Naziv vježbe: Korištenje DS18B20 temperaturnog senzora

Zadatak: Potrebno je izvršiti hardversku analizu DS18B20 temperaturnog senzora na osnovu


koje će se izraditi programa za očitanje vrijednosti njegovih temperatirnih registara. Nakon
uspješne analize, primjeniti stečeno znanje za izradu jednostvavnog projektnog (grupe po 5
učenika) zadatka koji će uključivati mjerenje temperature. Sistem predstaviti u Proteusu, a
programsko rješenje u MikroC kompajleru. Radove sa kratkim opisom (u formi maturskog
rada) predati preko e-learning servisa (upute ćete dobiti od predavača).
Rješenje:
Digitalni temperaturni senzor DS18B20 - opis rada
Kao element za mjerenje temperature izabran je digitalni senzor DS18B20 proizvođača
Dallas Semiconductor Inc. Radi se o veoma jednostavnom (sa stanovišta interfejsa) senzoru
koji daje veoma pouzdana očitanja temperaure u 0C sa 9, 10, 11 i 12 bitnom preciznosti.
Temperature koje je moguće izmjeriti kreću se u rasponu od -55 do +125 0C sa preciznošću
od +/-0.5 0C. Svaki senzor posjeduje jedinstven 64-bitni zapis (idntifikacijski broj) koji
omogućava da ih se veoma velik broj spoji na jednu senzorsku sabirnicu.

14
Izmjerena temperatura se u digitalnom formatu putem 1-wire sučelja prenosi do
mikrokontrolera. 1-wire sučelje je intelektualno vlasništvo firme Dallas Inc. Razvijeno je s
ciljem pojednostavljenja u komunikaciji između različitih senzorskih elemenata, a osnovna
zamisao podrazumijeva slanje podataka, napajanje i signalizaciju preko jednog voda. Ovo
sučelje je slično I2C sučelju s tim da su brzine prijenosa mnogo manje ali su udaljenosti na
kojima senzori mogu komunicirati sa master uređajem znatno veće.
Pošto dijele istu podatkovnu i napojnu liniju (u parazitnom načinu rada), jako velik broj
DS18B20 senzora sa jedinstvenim ID brojem može zajedno koegzistirati bez utjecaja jednih
na druge. Svaki senzor, koji je po default-u slave element, se na osnovu ID broja odaziva na
komande master uređaja (MCU).

Blok dijagram DS18B20 senzora je prikazan na slici 1.1

Sl. 1.1 Blok dijagram DS18B20 temperaturnog senzora

Senzor može raditi u parazitnom i režimu napajanja iz sistemskog izvora. Kod


parazitnog načina rada senzor dobija napajanje između dva slanja podataka sa 1-wire
sabirnice (prikazano lijevo na blok dijagramu), dok se u drugom slučaju napaja iz sistemskog
izvora iz kojeg se napajaju i svi ostali elementi u sistemu. Prvi način je prikladniji kada na
jednoj sabirnici imamo veći broj senzora, dok je drugi namijenjen za slučajeve u kojima svaki
senzor zauzima poseban ulaz na mikrokontroleru. U drugom slučaju (sl. 1.2) je obavezan pull-
up otpornik (najčešće 4K7).

15
Sl. 1.2 Napajanje DS18B20 iz sistemskog napajanja

U osnovi ovog senzora nalazi se analogno-digitalni konvertor. Rezolucija konverzije je


podesiva i može da bude 9, 10, 11 i 12 bita. Ovo odgovara rezolucijama temperature od
0.5°C, 0.25°C, 0.125°C ili 0.0625°C. Temperaturna konverzija se dobiva izvršavanjem
komande Convert T [44h]. Rezultati konverzije se spremaju u tzv. scratchpad memoriju u 16-
bitnom dvokomplmentarnom formatu sa predznakom. Informacija o temperaturi preko 1-
wire sabirnice može se dobiti izvršavanjem komande Red Scratchpad [BEh]. Nakon izvršenja
komande podaci se preko sabirnice prenose prema master uređaju (MCU) i to prvo LSB 1
(Least Significant Byte) pa nakon njega MSB (Most Significant Byte). MSB sadrži i „predznak
(S)“ izmjerene temperature koji nam govori da li je izmjerena temperatura pozitivna ili
negativna (sl. 1.3). U tabeli 1.1 prikazani su primjeri izmjerenih temperatura u 12-bitnoj
rezoluciji.

Sl. 1.3 LSB i MSB bajtovi

Tabela 1.1 Primjeri očitanja temperatura i sadržaja registara

Digitalni izlaz
Temperatura Digitalni izlaz (binarni)
(heksadecimalni)
+125°C 0000 0111 1101 0000 07D0h
+25.0625°C 0000 0001 1001 0001 0191h
0°C 0000 0000 0000 0000 0000h
-10.125°C 1111 1111 0101 1110 FF5Eh
1
Potrebno je razlikovati LSB od LSb (Least Significant Bit) i MSB od MSb (Most Significant Bit)

16
-55°C 1111 1100 1001 0000 FC90h

Potrebno je još napomenuti da DS18B20 posjeduje konfiguracijski registar pomoću


kojeg se određuje radna rezolucija. Registar sadrži 8 bitova od kojih su samo dva aktivna (sl.
1.4). U zavisnosti od odabrane rezolucije mijenja se i vrijeme konverzije kao što je prikazano
u tabeli 1.2. Može se zaključiti da viša rezolucija zahtijeva i duže vrijeme konverzije, pa iz tog
razloga treba paziti da prilikom izbora sistemska petlja bude dovoljno prilagođena vremenu
konverzije.

Sl. 1.4 Konfiguracijski registar

Tabela 1.2 Vrijeme konverzije u zavisnosti od odabrane rezolucije

R1 R2 Rezolucija Maksimalno vrijeme konverzije


0 0 9-bit 93.75 ms
0 1 10-bit 187.5 ms
1 0 11-bit 375 ms
1 1 12-bit 750 ms

Funkcija za čitanje stanja senzora:


//Deklaracija varijabli potrebnih za temperaturnu konverziju
const unsigned short TEMP_REZOLUCIJA = 12;
char *text = "000"; //Priprema ispisa
unsigned temp; //privremena varijabla

//Čitanje temperature sa DS18B20 senzora


unsigned Procitaj_Temp(){
const unsigned short RES_SHIFT = TEMP_REZOLUCIJA - 8;
char temp_cijela;
unsigned int temp_dio;
// Izvrši čitanje temperatrure sa DS18B20 senzora
Ow_Reset(&PORTC, 5); // 1-wire reset signal
Ow_Write(&PORTC, 5, 0xCC); //Komanda SKIP_ROM
Ow_Write(&PORTC, 5, 0x44); // Komanda CONVERT_T
Delay_us(300);

Ow_Reset(&PORTC, 5);
Ow_Write(&PORTC, 5, 0xCC); // Komanda SKIP_ROM
Ow_Write(&PORTC, 5, 0xBE); // Komanda READ_SCRATCHPAD

temp = Ow_Read(&PORTC, 5); //Spremanje rezultata čitanja


temp = (Ow_Read(&PORTC, 5) << 8) + temp; //I pomak za 8 mjesta u lijevo
Delay_ms(10);

// Provjeri da li je temperatura negativna


if(temp & 0x8000) {
text[0] = '-';

17
temp = ~temp + 1;
}
// Izvuci cijeli dio temperature
temp_cijela = temp >> RES_SHIFT ;
// Prtvori temp_cijela u karakter
if(temp_cijela/100)
text[0] = temp_cijela/100 + 48;
else
text[0] = '0';

text[1] = (temp_cijela/10)%10 + 48; // Izvuci desetice


text[2] = temp_cijela%10 + 48; // Izvuci jedinice

Laboratorijska vježba br.6


Naziv vježbe: Komunikacija između mikrokontrolera i PC računara
korištenjem UART jedinice za serijsku komunikaciju

18
Zadatak: Potrebno je analizirati gotovo, jednostavno programsko rješenje za komunikaciju između
PC računara i mikrokontrolera. Programski kod je potrebno detaljno analizirati (saznati šta radi),
opisati svaku pojedinačnu funkciju, nacrtati algoritamsku shemu rada programa i napisati pseudokod.
Takođe, potrebno je izvršiti simulaciju u Proteusu (korištenjem virtuelnog porta) kao i fizičko
spajanje mikrokontrolera sa PC računarom korištenjem razvojnog okruženja EasyPIC5 i RS232 kabla
(slika 1). Testirati program.

Slika 1. Način spajanja mikrokontrolera sa PC računarom

Programski listing:
UART1_Write_Text("Start");
char uart_rd; UART1_Write(10);
UART1_Write(13);
void main() {
ANSEL = 0; while (1) {
ANSELH = 0; if (UART1_Data_Ready()) {
C1ON_bit = 0; uart_rd = UART1_Read();
C2ON_bit = 0; UART1_Write(uart_rd);
}
UART1_Init(9600); }
Delay_ms(100); }

1. Simulacija u Proteusu
 Potrebno je napraviti novi projekat kao što je prikazano na shemi sa slike 2.

19
A

P1
U1 ERROR
1 15
RE3/MCLR/VPP RC0/T1OSO/T1CKI
16
RC1/T1OSI/CCP2
2 17 9
RA0/AN0/ULPW U/C12IN0- RC2/P1A/CCP1 RI
3 18 4
RA1/AN1/C12IN1- RC3/SCK/SCL DTR
4 23 8
RA2/AN2/VREF-/CVREF/C2IN+ RC4/SDI/SDA CTS
5 24 3
RA3/AN3/VREF+/C1IN+ RC5/SDO TXD
6 25 7
RA4/T0CKI/C1OUT RC6/TX/CK RTS
7 26 2
RA5/AN4/SS/C2OUT RC7/RX/DT RXD
14 6
RA6/OSC2/CLKOUT DSR
13 19 1
RA7/OSC1/CLKIN RD0 DCD
20
RD1
33 21
RB0/AN12/INT RD2
34 22 COMPIM
RB1/AN10/C12IN3- RD3
35 27
RB2/AN8 RD4
36 28
RB3/AN9/PGM/C12IN2- RD5/P1B
37 29
RB4/AN11 RD6/P1C
38 30
RB5/AN13/T1G RD7/P1D
39
RB6/ICSPCLK
40 8
RB7/ICSPDAT RE0/AN5
9
RE1/AN6
10
RE2/AN7
PIC16F887

Slika 2. Simulacija serijske komunikacije između PC računara i mikrokontrolera

 Instalirati program Virtual Serial Port (skinuti sa e-learninga) i podesiti ga prema slici 3

Slika 3. Namještanje virtuelnog porta

 Izvršiti podešavanje virtuelnog porta u Proteusu (slika 4) tako da koristi Virtual Serial Pair
(COM2) koji je napravljen u prethodnom koraku.

20
Slika 4. Podešavanje virtuelnog COM porta u Proteusu

 Napraviti novi projekat u MikroC-u, i kompajlirati programski kod iz programskog listinga


(slika5).

Slika 5. Projekat u MikroC-u


 U MikroC-u pokrenuti program Tools->USART Terminal i namjestiti ga kao na slici 6. Nakon
podešavanja pritisnuti dugme Connect.

21
Slika 6. Podešavanje USART terminala
 Terminal je sada preko COM3 porta spojen na COM2 port preko kojeg će se vršiti
komunikacija između PC računara i mikrokontrolera. Napomena: nije se moguće spojiti na
već otvoren COM port, zbog toga koristimo program Virtual Serial Port Driver!!
 Pokrenuti simulaciju u Proteus-u. Na USART terminalu treba da bude ispisana poruka Start
(slika7). OBJASNITI ZBOG ČEGA SMO DOBILI OVU PORUKU NA TERMINALU NA OSNOVU
PROGRAMSKOG LISTINGA.

Slika 7. Stanje USART terminala prilikom izvršavanja programa na mikrokontroleru


 Na osiloskopu je prikazan (slika 8) valni oblik koji predstavlja poruku „Start“.

22
Slika 8. Poruka „Start“ prikazana na osciloskopu
2. Spajanje hardwera
 Koristiti EasyPIC 5 razvojni sistem za kao bazu za komunikaciju između PC računara i
mikrokontrolera (slika 1).
 Potvrditi rezultate dobivene u Proteus-u

Zadaća
 Potrebno je objasniti namjenu integrisanog kruga MAX232.
 Nacrtati, označiti i opisati svaki pojedinačni pin serijskog RS232 kabla.
 Ukratko objasniti RS232 protokol koji se koristi kod serijske komunikacije. Objasniti NRZ
(engl. Non Return To Zerro) protokol.
 Pokušati na osnovu valnog oblika sa slike 8 dekodirati riječ „Start“ (referirati se na prethodno
pitanje)
 Prepraviti el. shemu i programski kod tako da na pritisak jednog tastera šalje poruku „Strart“.
Detektovati slanje poruke sa PC računara (sa USART terminala) i ispisati je na LCD displeju.
 Izvršiti mjerenje napona sa potenciometra i preko UART periferne jedinice mikrokontrolera
izvršiti njeno slanje na PC.
 Otkriti i detaljno pojasniti značenje kodova (argumenata) koji su predati funkciji
UART1_Write().
UART1_Write(10);
UART1_Write(13);

23
Laboratorijska vježba br.7
Naziv vježbe: Manuelno upravljanje brojem okretaja istosmjernog
motora korištenjem PWM (Pulse Width Modulation) modulacije

Zadatak: Potrebno je osmisliti algoritam upravljanja brojem okretaja motora


istosmjerne struje koristeći PWM (objasniti) modulaciju. Mikrokontroler treba na osnovu
stanja tastera koji se nalaze prikopčani na PORTu-A da poveća ili smanji DC (Duty Cycle) od 0-
100%. Na taj način se regulira struja kroz armaturu motora, a samim tim i broj okretaja. Za
PWM izlaz koristiti RC2 pin mikrokontrolera. U MikroC-u napisati softversko rješenje
problema, a simulaciju rada cjelokupnog sistema izvršiti u Proteus-u.

Implementacija: Napraviti novi projekat( u MikroC-u) pod nazivom PWM i spremiti ga


na za to predviđenu lokaciju. Prekucati dole napisani kôd i izvršiti kompajliranje. Ispraviti
eventualne greške. Napisati programske komentare za svaku liniju ili blok kôda.

sbit LCD_RS at RB4_bit; sbit LCD_D6 at RB2_bit;


sbit LCD_EN at RB5_bit; sbit LCD_D7 at RB3_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit; sbit LCD_RS_Direction at TRISB4_bit;

24
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit; void main() {
sbit LCD_D5_Direction at TRISB1_bit; InitMain();
sbit LCD_D6_Direction at TRISB2_bit; current_duty = 220;
sbit LCD_D7_Direction at TRISB3_bit; PWM1_Start();
PWM1_Set_Duty(current_duty);
unsigned short current_duty, Lcd_Init();
old_duty, current_duty1, old_duty1; Lcd_Cmd(_LCD_CLEAR);
void LCD(unsigned short DC){ Lcd_Cmd(_LCD_CURSOR_OFF);
char text[4]; Lcd_Out(1,1,"DC[%]:");
char text1[4]; LCD(100-current_duty/2.55);
ByteToStr(DC, text); while (1) {
Lcd_Out(1,7,text); if (RA0_bit) {
Lcd_Out(2,1,"Freq[Hz]:"); Delay_ms(30);
Lcd_Out(2,10,"500"); current_duty--;
} LCD(100-current_duty/2.55);
void InitMain() { PWM1_Set_Duty(current_duty);
ANSEL = 0;
ANSELH = 0; }
C1ON_bit = 0; if (RA1_bit) {
C2ON_bit = 0; Delay_ms(30);
PORTA = 0; current_duty++;
TRISA = 0; LCD(100-current_duty/2.55);
PORTB = 0; PWM1_Set_Duty(current_duty);
TRISB = 0; }
PORTC = 0; Delay_ms(25);
TRISC = 0; }
PWM1_Init(500); }
}
Napraviti novi projekat pod nazivom PWM u programskom paketu Proteus prema
shemi. Izvršiti učitavanje pwm.hex fajla u simulator i izvršiti simulaciju. Šta se može zaključiti
iz rezultata simulacije. Objasniti prednosti korištenja tzv. prekidačkog načina rada tranzistora
nad linearnim. Koji je način upravljanja motorom efikasniji i zašto? (koristiti Internet)
R7
10K
J1 D2
1 MCLR
ICSP-PICKIT3

2 VDD
3 GND 1N4001
4 PGD C3
5 PGC
100nF
25630501RP2 B1
12V

U1
7805

LCD1 1 3
LM016L VI VO
GND

C1 C2
2

10uF 10uF
VDD
VSS

VEE

RW
RS

D0
D1
D2
D3
D4
D5
D6
D7

RV1
E

R2 D1
+88.8

15 16
1k 1N4001
1
2
3

4
5
6

7
8
9
10
11
12
13
14

R4
270 Q2
R6 R5 U2 BC547
PINOVI 11,32
1k 1k
500R 1 15
RE3/MCLR/VPP RC0/T1OSO/T1CKI
RC1/T1OSI/CCP2
16 R1 Q1 Q4
2 17 BC547 R3 BUK
RA0/AN0/ULPWU/C12IN0- RC2/P1A/CCP1
3 18 330
RA1/AN1/C12IN1- RC3/SCK/SCL
4 23 8.2
RA2/AN2/VREF-/CVREF/C2IN+ RC4/SDI/SDA
5 24
RA3/AN3/VREF+/C1IN+ RC5/SDO
6
RA4/T0CKI/C1OUT RC6/TX/CK
25 Q3
7 26 BC558
RA5/AN4/SS/C2OUT RC7/RX/DT
14
RA6/OSC2/CLKOUT
13 19
RA7/OSC1/CLKIN RD0
20
RD1
33 21
RB0/AN12/INT RD2
34 22
RB1/AN10/C12IN3- RD3
35 27
RB2/AN8 RD4
36 28
RB3/AN9/PGM/C12IN2- RD5/P1B
37 29
RB4/AN11 RD6/P1C
38 30
RB5/AN13/T1G RD7/P1D
39
RB6/ICSPCLK
40 8
RB7/ICSPDAT RE0/AN5
9
RE1/AN6
10
RE2/AN7
PINOVI 12,31
PIC16F887

Shema za spoj na matador ploči

25
LCD1
LM016L

VDD
VSS

VEE

RW
RS

D0
D1
D2
D3
D4
D5
D6
D7

D
E

B
1
2
3

4
5
6

7
8
9
10
11
12
13
14

B1

+88.8
12V

B2
12V

D1
UF4004

U1 R4 Q2
1 15 1k BC547
RE3/MCLR/VPP RC0/T1OSO/T1CKI
16
RC1/T1OSI/CCP2
2
RA0/AN0/ULPW U/C12IN0- RC2/P1A/CCP1
17 Q1
3
RA1/AN1/C12IN1- RC3/SCK/SCL
18 R2 IRF540Z
4 23
RA2/AN2/VREF-/CVREF/C2IN+ RC4/SDI/SDA
5 24 10
RA3/AN3/VREF+/C1IN+ RC5/SDO
6
RA4/T0CKI/C1OUT RC6/TX/CK
25 R5 Q4
7
RA5/AN4/SS/C2OUT RC7/RX/DT
26 BC547 Q3
14 1k BC557
RA6/OSC2/CLKOUT
13 19
RA7/OSC1/CLKIN RD0
20
RD1
33 21
RB0/AN12/INT RD2
34 22
RB1/AN10/C12IN3- RD3
35 27
RB2/AN8 RD4

+88.8
Amps
36 28
RB3/AN9/PGM/C12IN2- RD5/P1B
37 29
RB4/AN11 RD6/P1C
38 30
RB5/AN13/T1G RD7/P1D
39
RB6/ICSPCLK
40 8
RB7/ICSPDAT RE0/AN5
9
RE1/AN6
RE2/AN7
10 R3
0.39
PIC16F887

Spoj u proteusu

Nakon izvršenih simulacija, spojiti sklop na matador ploči, izvršiti spajanje sa


razvojnim sistemom, učitati hex kôd u mikrokontroler, pokrenuti rad sistema i analizirati
dobivene rezultate.

Zadaci za vježbu III modul

1. Napisati program u MikroC-u i napraviti projekat u Proteus-u koji će preko serijskog


porta poslati poruku na terminal u kojoj je navedeno da li je taster na
mikrokontroleru spojen kao PullUp ili PullDown.
2. Napisati program u MikroC-u i napraviti projekat u Proteus-u koji će preko serijskog
porta PC računara slati komande za uvećanje i smanjenje broja okretaja DC motora.
Mikrokontroler treba da na terminal vraća podatak o trenutnom faktoru popune
(Duty Cycle) u postocima i apsolutnom iznosu.
3. Napisati program u MikroC-u i napraviti projekat u Proteus-u koji će preko serijskog
porta slati podatke o cijeni goriva (diesel i benzin) i prikazati ih na deset 7-segmentnih
displeja koji rade u multiplex modu. Displeji su raspoređeni u grupe po 5 segmenta na
dva porta. Prvi segment sa lijeve strane treba da prikaže slova B (benzin) i D (diesel),
ostala četiri segmenta treba da prikažu cijenu goriva sa decimalnom tačkom nakon
druge cifre.

26

You might also like