C:Timer

Fra CodeWiki

Gå til: navigasjon, søk

C har den egenskapen at det kan jobbe relativt maskinnært. I dette eksempelet skal vi gjøre det samme som i Timeren i Assembly, bare at nå er koden i C.

Vi ønsker å lage en 5 sekunders forsinkelse. Portene og registerne vi benytter oss av er tilknyttet PICDEM 18f452.


Pollet Løsning

Her bruker vi en pollet løsning.

5 sekunders forsinkelse: 5/(256*10-⁶) = 19531. 2¹⁰ - 19531 = 46005 = 0xB3B5

void main(){
T0CON = 0x07; // 256 Prescaler
TRISB=0x00; //Port B som output
PORTB=0x00;
RCON.7=1; //Aktiver prioritertstyrte interrupts
TMR0H=0xB3;
TMR0L=0xB5;
 
INTCON.7=1; // Aktiver høyprioritert interrupts
INTCON.5=1; // Aktiver Timer0 overflow interrupt
 
T0CON.7=1; //Starte timeren
 
while(intcon.2==0){} //Mens overflow-flagget ikke har blitt reist så venter vi
PORTB.0 = 1; //Lysdioden på PortB.0 tennes.
}
}

Interrupt-rutine

Her skal vi gjøre det samme, bare at denne gangen skal vi ha en interruptrutine som automatisk blir kjørt når timeren er ferdig med å telle (når Timer0 Overflow-flagget blir heist).

#Pragma origin 0x08
 
interrupt_rutine(void){ //Starter interruptrutinen vår
 
PORTB.0=1; //Skrur på dioden
INTCON.2=0; // Setter overflowflagget til 0
#pragma fastMode
}
 
void main()
 
TRISB=0x00;
PORTB=0x00;
T0CON = 0x07; //256 Prescaler 
RCON.7=1; // Aktiverer prioritertstyrt Interrupts
INTCON.7=1; // Aktiver høyprioritertstyrt interrupts
INTCON.5=1; // Aktiver Timer0 overflow interrupts
TMR0H=0xB3; 
TMR0L=0xB5;
T0CON.7=1; // Start Timer0
 
while(1){} //Evig løkke med ingenting.
 
}
Personlige verktøy
dataprogrammering
generelt