Kod:
Code: Select all
const unsigned short znamenka[]={63,6,91,79,102,109,125,7,127,111};
unsigned short i=0;
unsigned int br=0;
bit stanje1,stanje2,dozvola;
void main() {
PORTB=0;
PORTD=0;
PORTC=0;
TRISB=0;
TRISC=0xFF;
TRISD=0;
PORTB=0; //ništa na displayu desetica
PORTD=znamenka[0];
stanje1=1;
stanje2=1;
dozvola=0;
OPTION_REG=0b11001111;
GIE_bit=1;
PEIE_bit=0;
TMR0IE_bit=1;
TMR0=56;
while(1){
if(PORTC.B2==1&&stanje1==1){ //start/stop tipka
dozvola=~dozvola;
stanje1=0;
}
if(PORTC.B2==0){
stanje1=1;
}
if(PORTC.B3==1&&stanje2==1){ //reset tipka
i=0;
br=0;
dozvola=0;
stanje2=0;
}
if(PORTC.B3==0){
stanje2=1;
}
/*if(br==5000){ //generiranje 1 sekunde-svaki put kad br
br=0; //dostigne vrijednost 5000, i se uveća za 1
if(i>=99){ //ukoliko i prijeđe 99 vraća se na nulu.
i=0; //program radi sa uvjetom if(br>=5000),ali
} //ne radi sa br==5000
else{
i++;
}
}*/
if(i<10){
PORTB=0; //kad je brojač <10,na displayu desetica se ne prikazuje ništa
}
else{
PORTB=znamenka[i/10]; //izvlačenje 1. znamenke brojača (i)
}
PORTD=znamenka[i%10]; //izvlačenje 2. znamenke brojača (i)
}
}
void interrupt(){
if(TMR0IF_bit){ //nije portebno ako je samo TMR0 izvor inerrupta
if(dozvola==1){
br++;
if(br==5000){ //isti kod za generiranje sekunde kao gore,ali u
br=0; //u interaptu.U ovom slučaju program radi.
if(i>=99){ //
i=0; //
} //
else{ //
i++; //
} //
} // Zašto ovaj dio koda mora biti u interaptu?
}
TMR0=56;
TMR0IF_bit=0;
}
}
Problem je što mi nije jasno zašto program ne radi dobro kad dio koda za provjeru stanja brojača br nije u interaptu(u proteusu i na protobordu u tom slučaju ispravno broji do 10-13,svaki put drukčije,a nakon toga jedno 2 minute mu treba da skoči na 14,i onda opet dugo vremena stoji tako itd.).
Kako odrediti koji dio programa treba biti u interaptu a koji ne(znam da treba što manje ,pa sam zato mislio da mi u interaptu bude samo br++ i setovanje tmr bitova)?