You are on page 1of 43

ZADACI IZ DIGITALNIH SISTEMA

1. Upravljanje sa LED diodom

// PIC16F877A Configuration Bit Settings

// 'C' source line config statements

// CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = ON // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial
Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data
EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write
protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code
protection off)

// #pragma config statements should precede project file includes.


// Use project enums instead of #define for ON and OFF.

#include <xc.h>
#define _XTAL_FREQ 8000000
//napisati program u kojem se LED dioda pali i gasi
void main() {
TRISB=0X00;
while(1) {
RB0=1;
__delay_ms(100);
RB0=0;
__delay_ms(100);
}
}

1
Slika 1

Slika 2

2
2. Upravljanje sa tri LED diode
#pragma config FOSC = HS
#pragma config WDTE = ON
#pragma config PWRTE = OFF
#pragma config BOREN = ON
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config WRT = OFF
#pragma config CP = OFF

#define _XTAL_FREQ 8000000


#include <xc.h>

#include <stdio.h>
#include <stdlib.h>

int main(){
TRISB = 0x00;
TRISC = 0x00;

while(1){

RB1 = 1;
RB2 = 0;
RC1 = 0;
__delay_ms(2000);

RB1 = 0;
RB2 = 1;
RC1 = 0;
__delay_ms(2000);

RB1 = 0;
RB2 = 0;
RC1 = 1;
__delay_ms(2000);

RB1 = 1;
RB2 = 1;
RC1 = 0;
__delay_ms(2000);

RB1 = 0;
RB2 = 1;
RC1 = 1;
__delay_ms(2000);

RB1 = 1;
RB2 = 1;
RC1 = 1;

3
__delay_ms(2000);

}
return 0;
}

Slika 3

4
3. Napisati program i izvršiti simulaciju tako da mikrokontroler PIC16F877A
upravlja LED diodom putem push buttona. Ako push button nije pritisut, LED
dioda je ugašena, ako se drži aktivnim duže od 2 sekunde, LED dioda se upali.

#pragma config FOSC = HS


#pragma config WDTE = ON
#pragma config PWRTE = OFF
#pragma config BOREN = ON
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config WRT = OFF
#pragma config CP = OFF

#define _XTAL_FREQ 8000000


#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
int main(){
TRISB0 = 0;
TRISC0 = 1;
while(1){
if(RC0=1){
RB0=0;
__delay_ms(2000);
if(RC0=1){
RB0=1;
}
}
else
if(RC0=0){
RB0=0;
}
}
return 0;
}

5
Slika 4

6
4. Napisati kôd i izvršiti simulaciju u kojoj pushbutton mijenja stanje dvije LED
diode. Ako je pritisnut, upaljena je jedna, ako se ugasi, ugasi se ta i upali se druga.

#pragma config FOSC = HS


#pragma config WDTE = ON
#pragma config PWRTE = OFF
#pragma config BOREN = ON
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config WRT = OFF
#pragma config CP = OFF

#define _XTAL_FREQ 8000000


#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
int main(){
TRISB = 0;
TRISC1 = 11111111;
while(1){
if(RC1==0){
__delay_ms(1000);

if(RC1==0){
RB1 = 0;
RB5 = 1;
}

}
else
{
RB1 = 1;
RB5 = 0;
}
}
return 0;
}

7
Slika 5

8
5. Napisati program i izvršiti simulaciju u Proteusu za program koji će koristiti dva
push buttona za međusobno uključivanje i isključivanje LED diode.

// PIC16F877A Configuration Bit Settings

// 'C' source line config statements

// CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = ON // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial
Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data
EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write
protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code
protection off)

// #pragma config statements should precede project file includes.


// Use project enums instead of #define for ON and OFF.

#include <xc.h>
#define _XTAL_FREQ 8000000

void main() {
TRISB=0;
TRISC=1;
while(1) {
if(RC0=1) {
if(RC1=1) RB0=0; else RB0=1;
RC1=0;
}
else if(RC1=1) {
if(RC0=1)RB0=0; else RB0=1;
}
else {
RC0=RC1=0;
RB0=0;
}
}
}

9
Slika 6

10
6. Napisati program i izvršiti simulaciju tako da sedmosegmentni display kada je
sklopka aktivna broji od 0 do 9. Kada se sklopka deaktivira, brojač stane.

#pragma config FOSC = HS


#pragma config WDTE = ON
#pragma config PWRTE = OFF
#pragma config BOREN = ON
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config WRT = OFF
#pragma config CP = OFF

#define _XTAL_FREQ 8000000


#include <xc.h>
#include <stdio.h>
#include <stdlib.h>

unsigned char const SEGMENT_MAP[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D,
0x07, 0x7F, 0x6F};
void main(void){
TRISD = 0x00;
TRISC = 0x01;
char broj = 0;
while(1){
if(!PORTC){
__delay_ms(250);
broj++;

if (broj>9)
broj = 0;
}
else{
PORTD = (SEGMENT_MAP[broj]);
}
}
}

11
Slika 7

12
7. Napisati program i izvršti simulaciju u kojoj se servomotor rotira od -90°do 90°.

#pragma config FOSC = HS


#pragma config WDTE = ON
#pragma config PWRTE = OFF
#pragma config BOREN = ON
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config WRT = OFF
#pragma config CP = OFF

#define _XTAL_FREQ 8000000


#include <xc.h>
#include <stdio.h>
#include <stdlib.h>

void servoRotiraj0(){
unsigned int i;
for(i=0; i<50; i++){
RB0 = 1;
__delay_us(800);
RB0 = 0;
__delay_us(19200);
}
}
void servoRotiraj90(){
unsigned int i;
for(i=0; i<50; i++){
RB0 = 1;
__delay_us(1500);
RB0 = 0;
__delay_us(18500);
}
}

void servoRotiraj180(){
unsigned int i;
for(i=0; i<50; i++){
RB0 = 1;
__delay_us(2200);
RB0 = 0;
__delay_us(17800);
}
}

void main() {
TRISB = 0;

13
do{
servoRotiraj0();
__delay_ms(180);
servoRotiraj180();
__delay_ms(180);
}
while(1);

Slika 8

14
8. Napisati program kojim se pali jedna dioda kad se motor obrće u jednu, a druga
kad se obrće u drugu stranu

#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)


#pragma config WDTE = ON // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial
Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data
EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write
protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code
protection off)

#define _XTAL_FREQ 8000000


#include <xc.h>

void ServoRotiraj0() {
unsigned int i;
for(i=0;i<50;i++) {
RB0=1;
__delay_us(800);
RB0=0;
__delay_us(19200);
}
}

void ServoRotiraj90() {
unsigned int i;
for(i=0;i<50;i++) {
RB0=1;
__delay_us(1500);
RB0=0;
__delay_us(18500);
}
}

void ServoRotiraj180() {
unsigned int i;
for(i=0;i<50;i++) {
RB0=1;
__delay_us(2200);
RB0=0;
__delay_us(17800);
}
}
void main () {

15
TRISB=0;
do {
ServoRotiraj0();
RB2=1;
RB1=0;
__delay_ms(150);
ServoRotiraj180();
RB1=1;
RB2=0;
__delay_ms(150);
}
while(1);
}

Slika 9

Slika 10

16
9. Koristiti virtualni terminal za komunikaciju s korisnikom kako bi njegovom
naredbom upalili ili ugasili LED diodu.

#pragma config FOSC = HS


#pragma config WDTE = OFF
#pragma config PWRTE = OFF
#pragma config BOREN = ON
#pragma config LVP = ON
#pragma config CPD = OFF
#pragma config WRT = OFF
#pragma config CP = OFF

#define _XTAL_FREQ 20000000


#define Baud_rate 9600
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>

void Initializing_UART(void){
TRISC6 = 0;
TRISC7 = 1;

SPBRG =((_XTAL_FREQ/16)/Baud_rate)-1;
BRGH = 1;

SYNC = 0;
SPEN = 1;

TXEN = 1;
CREN = 1;

TX9 = 0;
RX9 = 0;
}

void UART_send_char(char bt){


while(!TXIF);
TXREG = bt;

char UART_get_char() {
if(CERR){
CREN = 0;
CREN = 1;
}
while(!RCIF);
return RCREG;
}

17
Slika 11

18
10. Upotrebom LCD 16*2 displeja ispisati željenu poruku kao string, kao pomjerački
tekst lijevo-desno i kao karakter.
Header file:
void Lcd_Port(char a){
if(a&1)
D4=1;
else D4=0;
if(a&2)
D5=1;
else D5=0;
if(a&4)
D6=1;
else D6=0;
if(a&8)
D7=1;
else D7=0;
}

void Lcd_Cmd(char a){


RS = 0;
Lcd_Port(a);
EN = 1;
__delay_ms(4);
EN = 0;
}

void Lcd_Clear(){
Lcd_Cmd(0);
Lcd_Cmd(1);
}

void Lcd_Set_Cursor(char a, char b){


char temp, z, y;
if(a==1){
temp = 0x80 +b-1;
z = temp>>4;
y = temp & 0x0F;
Lcd_Cmd(z);
Lcd_Cmd(y);
}
else if(a==2){
temp= 0xC0+b-1;
z = temp>>4;
y = temp & 0x0F;
Lcd_Cmd(z);
Lcd_Cmd(y);
}
}

void Lcd_Init(){

19
Lcd_Port(0x00);
__delay_ms(20);

Lcd_Cmd(0x03);
__delay_ms(5);

Lcd_Cmd(0x03);
__delay_ms(11);

Lcd_Cmd(0x03);
Lcd_Cmd(0x02);
Lcd_Cmd(0x02);
Lcd_Cmd(0x08);
Lcd_Cmd(0x00);
Lcd_Cmd(0x0C);
Lcd_Cmd(0x00);
Lcd_Cmd(0x06);

void Lcd_Write_Char(char a){


char temp, y;
temp = a&0x0F;
y = a&0xF0;
RS = 1;
Lcd_Port(y>>4);
EN = 1;
__delay_ms(40);
EN = 0;
Lcd_Port(temp);
EN = 1;
__delay_ms(40);
EN = 0;
}

void Lcd_Write_String(char *a){


int i;
for (i = 0; a[i] != '\0'; i++)
Lcd_Write_Char(a[i]);
}

void Lcd_Shift_Right(){
Lcd_Cmd(0x01);
Lcd_Cmd(0x0C);
}

void Lcd_Shift_Left(){
Lcd_Cmd(0x01);
Lcd_Cmd(0x08);
}

20
Glavni file:
#define _XTAL_FREQ 8000000
#define RS RD2
#define EN RD3
#define D4 RD4
#define D5 RD5
#define D6 RD6
#define D7 RD7

#include <xc.h>
#include "header_fajl.h"

#pragma config FOSC = HS


#pragma config WDTE = OFF
#pragma config PWRTE = OFF
#pragma config BOREN = ON
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config WRT = OFF
#pragma config CP = OFF

int main(){
unsigned int a;
TRISD = 0x00;
Lcd_Init();
while(1){
Lcd_Clear();
Lcd_Set_Cursor(1,1);
Lcd_Write_String("Na vjezbama ");

Lcd_Set_Cursor(2,3);
Lcd_Write_String("iz digitalnih ");
__delay_ms(2000);

Lcd_Clear();
Lcd_Set_Cursor(1,3);
Lcd_Write_String("Snijeg pada ");
Lcd_Set_Cursor(2,1);
Lcd_Write_String("Lalalalalal ");
__delay_ms(2000);

Lcd_Clear();
Lcd_Set_Cursor(1,1);
Lcd_Write_String("Vidimo se");

for (a = 0; a<15; a++){


__delay_ms(300);
Lcd_Shift_Left();
}

21
for (a = 0; a<15; a++){
__delay_ms(300);
Lcd_Shift_Right();
}
Lcd_Clear();
Lcd_Set_Cursor(2,7);
Lcd_Write_Char('E');
Lcd_Write_Char('0');
__delay_ms(2000);
}
return 0;
}

Slika 12

22
UART (Universal Asynchronous Receiver / Trainsmitter) je univerzalni serijski prijemnik i
odašiljač. Predstavlja serijsko komunikacijsko sučelje koje predstavlja duplex komunikaciju
između dva uređaja. Koristi dvije podatkovne linije za slanje podataka TX i dvije podatkovne
linije za primanje podataka RX. Uzemljenje, odnosno referenca uređaja mora biti zajednička.
Asihnrono komunikacijsko sučelje znači da nije potrebno slati clock zajedno sa podacima kao
što se mora u sinhronoj komunikaciji.

PIC mikrokontroler može imati jednu od tri vrste komunikacija:


 UART (asinhroni, Full Duplex),
 USRT Master (sinhroni, Half Duplex),
 USRT Slave (sinhroni, Half Duplex).
OSART Baud Rate Generator (BRG) predstavlja stopu generatora koji nudi potreban clock za
prijenos i prijem podataka. USRT modul ima osmobitni generator brzine prijenosa koji
podržava i asinhroni i sinhroni modul. Osmobitni SPBRG registar kontrolira vremenski
period ovog takt impulsa, clocka. U asinhronom načinu BRGH, njegov drugi bit TX STA
registra također kontrolira generiranu brzinu prijenosa ali je ovaj u sinhronom načinu
zanemaren. Brzina prijenosa pdoataka se može izračunati iz sljedećih jednadžbi ggdje FOSC
predstavlja taktnu frekvenciju mikrokontrolera.
LOW SPEED BRGH = 0 HIGH SPEED BRGH = 1
Asinhroni, Band Rate =
FOSC
0 FOSC Band Rate =
16 ( x +1 )
b 4 ( x +1 )
FOSC
1 Sinhroni, Band Rate = N/A
4 ( x +1 )

11. Komunikacija PIC na PIC mikrokontrolera ostvaruje se pomoću UART


komunikacijskog sučelja. Vrši se upravljanje LED diodama koje su spojene na
PIC16F877A mikrokontroler pomoću prekidača DIP8 spojenog na drugi
PIC16F877A mikrokontroler. Ova dva miktokontrolera nalaze se u master slave
odnosu. DIP8 prekidač povezan je sa portom B master mikrokontrolera koji je
konfiguriran kao glavni ulaz. Kada se prekidač uključi, odgovarajući pinovi će biti
uzemljeni. Podaci koji su pročitani sa port B mastera šalju se na slave koristeći
UART. Slave primljene podatke upisuje u svoj port B kojeg konfigurira kao izlaz.
Na ovaj način treba ostvariti da LED diode spojene na slave mikrokontroler
svijetle ovisno o statusu DIP8 prekidača koji je spojen na master mikrokontroler.

23
(ne mogu se praviti u istom projektu)

HEADER FILE I ZA MASTER I ZA SLAVE


//inicijalizacija

char UART_Init(const long int baudrate){


unsigned int x;
x = (_XTAL_FREQ - baudrate*64)/(baudrate*64);
if (x > 255){
x = (_XTAL_FREQ - baudrate*16)/(baudrate*16);
BRGH = 1;
}
if (x<256){
SPBRG = x;
SYNC = 0;
SPEN = 1;
TRISC7 = 1;
TRISC6 = 1;
CREN = 1;
TXEN = 1;
return 1;
}
return 0;
}

//slanje podataka putem uarta

//provjeravanje registra za transmitt podatke za prijenos

char UART_TX_Empty(){
return TRMT;
}

24
//PROVJERA JESU LI PODACI PRIMLJENI
char UART_Data_Ready(){
return RCIF;
}

// CITANJE PRIMLJENIH PODATAKA


char UART_Read(){
while(!RCIF);
return RCREG;
}

//CITANJE PRIMLJENOG TEKSTA


void UART_Read_Text(char *Output, unsigned int length){
unsigned int i;
for (int i = 0; i<length; i++){
Output[i] = UART_Read();
}
}

//PISANJE PRIMLJENIH PODATAKA


void UART_Write(char data){
while (!TRMT);
TXREG = data;
}

// PISANJE PRIMLJENOG TEKSTA


void UART_Write_Text(char *text){
int i;
for (i = 0; text[i]!='\0'; i++)
UART_Write(text[i]);
}

25
MAIN FILE OD MASTERA

#define _XTAL_FREQ 8000000


#include <xc.h>
#include <pic16f877a.h>
#include "master_header.h"

#pragma config FOSC = HS


#pragma config WDTE = OFF
#pragma config PWRTE = OFF
#pragma config BOREN = ON
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config WRT = OFF
#pragma config CP = OFF

void main(){
TRISB = 0xFF; // PORT B INPUT

nRBPU = 0;
UART_Init(9600);

do{
UART_Write(PORTB);
__delay_ms(100);

}
while(1);
}

26
MAIN FILE OD SLAVEA

#define _XTAL_FREQ 8000000


#include <xc.h>
#include <pic16f877a.h>
#include "slave_header.h"

#pragma config FOSC = HS


#pragma config WDTE = OFF
#pragma config PWRTE = OFF
#pragma config BOREN = ON
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config WRT = OFF
#pragma config CP = OFF

void main(){
TRISB = 0x00; // PORT B INPUT
UART_Init(9600);

do{
if(UART_Data_Ready())
PORTB = UART_Read();

__delay_ms(100);

}
while(1);
}

27
Slika 13

28
12. Koriste se 4 sedmosegmentna displeja za prikaz minute: sekunde (00:00). Kada se
odbroji do vremena 00:59 treba da se upali zelena led dioda, te da se na displeju
ispiše to vrijeme i poruka: Vrijeme je pod kontrolom! Kada se odbroji do vremena
01:59 treba da se upali žuta led lioda, te da se na LCD dispelu ispiše to vrijeme i
poruka Vrijeme je na granici! Kada se odbroji do vremena 02:15 treba se upaliti
crvena led dioda, te da se ispiše Vrijeme je van dozvoljenih granica!

HEADER FILE LED.H:

void Lcd_Port(char a){


if(a & 1)
D4 = 1;
else
D4 = 0;

if(a & 2)
D5 = 1;
else
D5 = 0;

if(a & 4)
D6 = 1;
else
D6 = 0;

if(a & 8)
D7 = 1;
else
D7 = 0;

void Lcd_Cmd(char a){


RS = 0;
29
Lcd_Port(a);
EN = 1;
__delay_ms(4);
EN = 0;
}

Lcd_Clear(){
Lcd_Cmd(0);
Lcd_Cmd(1);
}

void Led_Set_Cursor(char a, char b){


char temp, z, y;

if (a == 1){
temp = 0x80 + b - 1;
z = temp >> 4;
y = temp & 0x0F;
Lcd_Cmd(z);
Lcd_Cmd(y);
}else if(a == 2){
temp = 0xC0 + b - 1;
z = temp >> 4;
y = temp & 0x0F;
Lcd_Cmd(z);
Lcd_Cmd(y);
}
}

void Lcd_Init(){
Lcd_Port(0x00);
__delay_ms(20);
Lcd_Cmd(0x03);
__delay_ms(5);

30
Lcd_Cmd(0x03);
__delay_ms(11);
Lcd_Cmd(0x03);
Lcd_Cmd(0x02);
Lcd_Cmd(0x02);
Lcd_Cmd(0x08);
Lcd_Cmd(0x00);
Lcd_Cmd(0x0C);
Lcd_Cmd(0x00);
Lcd_Cmd(0x06);
}

void Lcd_Write_Char(char a){


char temp, y;
temp = a&0x0F;
y = a&0xF0;
RS = 1;
Lcd_Port(y >>4);
EN = 1;
__delay_us(40);
EN = 0;
Lcd_Port(temp);
EN = 1;
__delay_us(40);
EN = 0;
}

void Lcd_Write_String(char *a){


int i;
for (i=0; a[i] != '\0'; i++){
Lcd_Write_Char(a[i]);
}
}

31
void Lcd_Shift_Right(){
Lcd_Cmd(0x01);
Lcd_Cmd(0x0C);
}

void Lcd_Shift_Left(){
Lcd_Cmd(0x01);
Lcd_Cmd(0x08);
}

MAIN FILE:
#define _XTAL_FREQ 200000000
#define RS RD2
#define EN RD3
#define D4 RD4
#define D5 RD5
#define D6 RD6
#define D7 RD7

#pragma config FOSC = HS


#pragma config WDTE = OFF
#pragma config PWRTE = OFF
#pragma config BOREN = OFF
#pragma config LVP = ON
#pragma config CPD = OFF
#pragma config WRT = OFF
#pragma config CP = OFF

#include <xc.h>
#include "led.h"

unsigned int Vrijednost(int broj){


32
unsigned int rezultat;
unsigned int Segment_Display[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
0x7F,0x6F};
rezultat = Segment_Display[broj];
return rezultat;
}

void main(){
int jedinice, desetice, stotice, hiljade;
int br1 = 0, br2 = 0, k =0;

CMCON = 0x07;
ADCON1 = 0x06;
TRISB = 0x00;
TRISC = 0x00;
TRISD = 0x00;
Lcd_Init();

RC6 = 0;
RC5 = 0;
RC4 = 0;

while(1){
if(br1 == 58){
RC6 = 1;
RC5 = 0;
RC4 = 0;

Lcd_Clear();
Lcd_Set_Cursor(1,1);
Lcd_Write_String("00:59 Vrijeme je");
Lcd_Set_Cursor(2,1);
Lcd_Write_String("pod kontrolom!");

33
}
if(br1 == 158){
RC6 = 0;
RC5 = 1;
RC4 = 0;
Lcd_Clear();
Lcd_Set_Cursor(1,1);
Lcd_Write_String("01:59 Vrijeme");
Lcd_Set_Cursor(2,1);
Lcd_Write_String("je na granici!");
}
if(br1 == 215){
RC6 = 0;
RC5 = 0;
RC4 = 1;
Lcd_Clear();
Lcd_Set_Cursor(1,1);
Lcd_Write_String("Vrijeme je izvan");
Lcd_Set_Cursor(2,1);
Lcd_Write_String("dozvoljene granice!");

for(int i = 0; i<5; i++){


__delay_ms(30);
Lcd_Shift_Right();
}

for(int i =0; i<5; i++){


__delay_ms(30);
Lcd_Shift_Right();
}
}
if (br1 == 250){

34
RC4 = 0;
Lcd_Clear();
}
if(br1 == 9999){
br1 = 0;

}
else{
br1++;
br2++;
}

for (int i =0; i<5; i++){


//jedinice
jedinice = Vrijednost(br1 % 10);
PORTB = jedinice;
RC3 = 0;
__delay_ms(10);
RC3 = 1;

//desetice
desetice = Vrijednost((br1 / 10) %10);
PORTB = desetice;
RC2 = 0;
__delay_ms(10);
RC2 = 1;

//stotice
stotice = Vrijednost((br1 / 100) %10);
PORTB = stotice;
RC1 = 0;
__delay_ms(10);
RC1 = 1;

35
//shiljade
hiljade = Vrijednost((br1 / 1000) %10);
PORTB = hiljade;
RC0 = 0;
__delay_ms(10);
RC0 = 1;
}
}
}

Slika 14

36
13. Napisati program koji će izvršavati sljedeće naredbe upotrebnom virtualne mašine
koja omogućava:
a) prva radnja je rotacija servo motora za +-180
b) druga radnja je pale se 3 led diode redoslijedom sve tri upaljene, prve dvije upaljene, prva
upaljena, druge dvije upaljene treća upaljena
c) treća radnja je brojač od 0 do 4, zatim od 2 do 8 i od 9 do 3 prikazati na 7-segmentnom
displeju

#pragma config FOSC = HS


#pragma config WDTE = OFF
#pragma config PWRTE = OFF
#pragma config BOREN = OFF
#pragma config LVP = ON
#pragma config CPD = OFF
#pragma config WRT = OFF
#pragma config CP = OFF

#include <xc.h>
#include <stdio.h>
#include <stdlib.h>

#define _XTAL_FREQ 16000000


#define Baud_rate 6900

unsigned int Segment_Display[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
0x7F, 0x6F};

//Servo motor
void ServoRotate0(){
unsigned int i;
for(i = 0; i<50; i++){
RB0 = 1;
__delay_us(800);
RB0 = 0;
__delay_us(19200);
}
}

void ServoRotate90(){
unsigned int i;
for(i = 0; i<50; i++){
RB0 = 1;
__delay_us(1500);
RB0 = 0;

37
__delay_us(18500);
}
}

void ServoRotate180(){
unsigned int i;
for(i = 0; i<50; i++){
RB0 = 1;
__delay_us(2200);
RB0 = 0;
__delay_us(17800);
}
}

void opcija1() {
ServoRotate0();
__delay_ms(130);
ServoRotate180();
__delay_ms(130);
}

void opcija2(){
RB1 = 1;
RB2 = 1;
RB3 = 1;
__delay_ms(1000);
RB1 = 1;
RB2 = 1;
RB3 = 0;
__delay_ms(1000);
RB1 = 1;
RB2 = 0;
RB3 = 0;
__delay_ms(1000);
RB1 = 0;
RB2 = 1;
RB3 = 1;
__delay_ms(1000);
RB1 = 0;
RB2 = 0;
RB3 = 1;
__delay_ms(1000);
RB1 = 0;
RB2 = 0;
RB3 = 0;
}

void opcija3(){
char broj = 0;
for(int i = 0; i < 5; i++){

38
broj = i;
PORTD = (Segment_Display[broj]);
__delay_ms(500);
}

for(int i = 2; i < 9; i++){


broj = i;
PORTD = (Segment_Display[broj]);
__delay_ms(500);
}

for(int i = 9; i > 2; i--){


broj = i;
PORTD = (Segment_Display[broj]);
__delay_ms(500);
}
}

void Initialize_UART(void){
TRISC6 = 0; //TX pin -izlazni
TRISC7 = 1; //RX pin - ulazni

SPBRG = 103; // racuna se ((_XTAL_FREQ/16)/Baud_rate)-1


BRGH = 1;

//Asihrnoski serijskiport
SYNC = 0;
SPEN = 1;

TXEN = 1; //UKLJUCIVANJE PRENOSA


CREN = 1; //UKLJUCIVANJE PRIJEMA

TX9 = 0;
RX9 = 0;

void UART_send_char(char bt){


while(!TXIF); //zaustavlja program dok se TX ne oslobodi
TXREG = bt;
}

char UART_get_char(){
if(OERR){ //provjerava error
CREN = 0; //ako ima error - restart
CREN = 1; //isto
}
while(!RCIF); //zaustavlja pr dok se RX ne oslobodi
return RCREG;

39
}

void UART_send_string(char* st_pt){


while(*st_pt)
UART_send_char(*st_pt++);
}

//MENU
void menuShow(){
UART_send_string("\r");
UART_send_string("Odaberite opciju 1, 2 ili 3... \r");
}

void main(void){
int vrijednost;
TRISB = 0;
TRISD = 0;
Initialize_UART();
menuShow();

do{
vrijednost = UART_get_char();
switch(vrijednost) {
menuShow();
case '1':
UART_send_string("Odabrali ste opciju 1 \r");
UART_send_string("Okretanje servo motora \r ");
opcija1();
break;
case '2':
UART_send_string("Odabrali ste opciju 2 \r");
UART_send_string("Led diode \r ");
opcija2();
break;
case '3':
UART_send_string("Odabrali ste opciju 3 \r");
UART_send_string("7 segmentni displej \r ");
opcija3();
break;
}
}
while(vrijednost != 4);
}

40
Slika 15

Slika 16

41
14. Napisati program koji ce omoguciti A/D konverziju uzimajuci analogne podatke iz
potenciometra i prikazujuci stanje na izlazu koristeci 10 led dioda. Takodjer
koristiti voltmetar koji ce citati vrijednost sa potenciometra.

// CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial
Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data
EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write
protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code
protection off)

// #pragma config statements should precede project file includes.


// Use project enums instead of #define for ON and OFF.

//PIC16F877A mikrokontroler ima 8 ADC ulaza i on ce konvertovati analogne ulaze


//u odgovarajuci 10 bitni digitalni broj. Pretpostavljamo da je ADC low 0(v),
//a ADC high 5(v). Odnosno Vref-=0(V), Vref+=5(V), n=10 bit(izlaz).
//Rezolucija=(Vref+-Vref-)/(2n-1)=5/1023=0.004887(V)
//ADC modul kod PIC16F877A mikrokontrolera ima 4 registra.
//Za high ADRESH
//Za low ADRESL
// ADCON0
// ADCON1

#include <xc.h>
#define _XTAL_FREQ 8000000

void main() {
//Postavimo portove
TRISA=0XFF;
TRISB=0X00;
TRISC=0X00;

//POSTAVLJAMO CONVERSION CLOCK CLOCK FOSC/16


ADCON0bits.ADCS0=1;
ADCON0bits.ADCS1=0;
ADCON1bits.ADCS2=1;

//POSTAVLJAMO CHANNEL
ADCON0bits.CHS0=0;
ADCON0bits.CHS1=0;

42
ADCON0bits.CHS2=0;

//POSTAVLJAMO PORT FORMAT


ADCON1bits.ADFM=1;

//PORT KONFIGURACIJA
ADCON1bits.PCFG0=0;
ADCON1bits.PCFG1=0;
ADCON1bits.PCFG2=0;
ADCON1bits.PCFG3=0;

//POSTAVLJAMO STATUS BIT


ADCON0bits.GO_DONE=1;

//SWITCH NA ADC
ADCON0bits.ADON=1;

while(1) {
if(ADCON0bits.GO_DONE==0) { //nakon konverzije acon0bits.go_Done ce biti jednak
nuli
ADCON0bits.GO_DONE=1; //postavimo na 1 za pocetak sljedece konverzije
PORTB=ADRESL; //Donjih 8 bitova od ADC result
PORTD=ADRESH;//High i 2 bita od ADC result
}
};
}

Slika 17

43

You might also like