C:Timer
Fra CodeWiki
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. }
