You are on page 1of 3

Izvještaj za laboratorijsku vježbu 9

Prva implementacija koda, bez korištenja prekida, data je ispod:

#pragma config
FOSC=HS,WDTE=OFF,PWRTE=OFF,MCLRE=ON,CP=OFF,CPD=OFF,BOREN=OFF,CLKOU
TEN=OFF
#pragma config
IESO=OFF,FCMEN=OFF,WRT=OFF,VCAPEN=OFF,PLLEN=OFF,STVREN=OFF,LVP=OFF
#define _XTAL_FREQ 8000000
#include <xc.h>

void initialize(){
TRISD = 0x00;
ANSELD = 0x00;
TRISDbits.TRISD7 = 1;
ANSELB = 0x00;
TRISB = 0x00;
LATB = 0x00;
//timer0
OPTION_REGbits.TMR0CS = 0;
OPTION_REGbits.TMR0SE = 0;
OPTION_REGbits.PSA = 0;
OPTION_REGbits.PS2 = 0;
OPTION_REGbits.PS1 = 1;
OPTION_REGbits.PS0 = 0;

TMR0=5;

/*INTCONbits.GIE=1;
INTCONbits.TMR0IE=1;*/
return;
}

void main() {
initialize();
short cnt = 0;
short uzlazna = 1;
while (1) {
//ovo je za generisanje impulsa na rd0
if(TMR0 == 0) {
LATDbits.LATD0 = 1 - LATDbits.LATD0;
TMR0 = 5;
}
//sad realizujemo brojac impulsa na rd7
if(PORTDbits.RD7){
if(uzlazna){
cnt++;
uzlazna=0;
}
}
else {
uzlazna=1;
}
LATB=cnt;
}
return;
}

Ovakav kod pri generisanju odgovarajuće četvrtke na RD0 zapravo pokazuje značajne
nepreciznosti, te se ispravno rješenje dobija tek korištenjem prekida.

Kod koji koristi prekide dat je ispod.

#pragma config
FOSC=HS,WDTE=OFF,PWRTE=OFF,MCLRE=ON,CP=OFF,CPD=OFF,BOREN=OFF,CLKOU
TEN=OFF
#pragma config
IESO=OFF,FCMEN=OFF,WRT=OFF,VCAPEN=OFF,PLLEN=OFF,STVREN=OFF,LVP=OFF
#define _XTAL_FREQ 8000000
#include <xc.h>

void initialize(){
TRISDbits.TRISD0 = 0;
ANSELDbits.ANSD0 = 0;
TRISDbits.TRISD7 = 1;
ANSELDbits.ANSD7 = 0;
ANSELB = 0x00;
TRISB = 0x00;
LATB = 0x00;
//timer0
OPTION_REGbits.TMR0CS = 0;
OPTION_REGbits.PSA = 0;
OPTION_REGbits.PS2 = 0;
OPTION_REGbits.PS1 = 1;
OPTION_REGbits.PS0 = 0;

TMR0=5;
INTCONbits.GIE=1;
INTCONbits.TMR0IE=1;
return;
}

void interrupt isr(void){


if(INTCONbits.TMR0IF){
LATDbits.LATD0 = 1 - LATDbits.LATD0;
INTCONbits.TMR0IF = 0;
TMR0=5;
}
}

void main(void){
initialize();
short uzlazna = 1;
short brojac = 0;

while(1){
if(PORTDbits.RD7){
if(uzlazna){
brojac++;
uzlazna=0;
}
}
else{
uzlazna=1;
}
LATB=brojac;

}
return;
}

Na primjeru drugog koda, posmatrajući signale u Proteusu, primjećujemo da nema


produžavanja stanja logičke nule ili jedinice unutar generisane četvrtke. Prekidna rutina
praktično obavlja sav posao koji se radio unutar if-a u prethodnoj realizaciji.
Dio koda koji koristimo za brojanje impulsa pina RD7 je isti u oba slučaja, i podrazumijeva
provjeravanje prvo stanja pina, a zatim logičke varijable koja je indikator promjene s vrijednosti
log. 0 na vrijednost log. 1. U slučaju da su obje vrijednosti true, vrijednost brojača se ažurira, što
se reflektuje i na LATB.

You might also like