Assembly:Timer
Fra CodeWiki
For denne artikkelen brukes et PICDEM 2 demo kort fra Microchip.
Timere brukes til veldig meget. Besøker du en nettside for eksempel, er det en timer som avgjør når nettleseren din konkluderer med at nettsiden ikke er tilgjengelig. Innenfor programmering ønsker vi ofte å skape små forsinkelser av ulike grunner. I de fleste vanlige programmeringsspråk finnes det timermetoder av diverse slag som gjerne tar en parameter som spesifiserer antall tidsenheter timeren skal holde på. I assembly er det litt mer tungvindt å bruke timere, ettersom vi må gjøre litt mer koding selv.
Innhold |
Timer i 16-bits modus
Timer0 i 18F452
Før vi begynner med selve timerprogrammeringen må vi initialisere et par komponenter.
- bit 7 TMR0ON: Timer0 On/Off Control bit --> 1 = Enable Timer0, 0 = Disable Timer0
- bit 6 T08BIT: Timer0 8-bit/16-bit Control Bit --> 1 = timer0 er konfigurert som en 8-bit timer/teller, 0 = timer0 settes som en 10-bits timer
- bit 5 TOCS: Timer0 Clock Source Select Bit. --> 1 = Transition på T0CKI pin, 0 = Internal Instruction cycle clock (CLK0)
- bit 4 T0SE: Timer0 Source Edge Select bit. Når pulsene kommer inn til timeren kan vi bestemme oss for positiv eller negativ flanke. (0 = positiv flanke)
- bit 3 PSA: Timer0 Prescaler Assignment bit
- bit 2-0 T0PS2:T0PS0; Timer0 Prescaler Select bits
Timerkoden
#include <p18f452.inc> ; Spesifikt for Picdem 2 demo kortet radix dec ; Spesifiserer at vi benytter oss av det desimale tallsystemet hvis ikke annet er oppgitt. org 32 goto main main movlw 0 movwf TRISB,0 call tennPortB ; vi kaller metoden tennPortB, som du kan finne lenger ned i koden clrf T0CON ; nullstill Kontrollreg bcf T0CON, T08BIT ; 16 bit counter, bruker altså en 16 bits tellermekanisme. bcf T0CON, T0CS ; Vi bruker den interne instruksjonsklokken. Vi bestemmer altså her om vi skal bruke ekstern eller intern oscillator bcf T0CON, PSA ; Vi nullstiller PSA-biten, og sier dermed at vi benytter prescaleren bsf T0CON, T0PS0 bsf T0CON, T0PS1 ; 1:256 Prescaling (altså at nedtellingsfaktoren er 256 mikrosek) bsf T0CON, TOPS2 ;Laster timer med startverdi ;skal telle fra 0x85ED-0xFFFF movlw 0x85;0x7F movwf TMR0H movlw 0xED;0xFF movwf TMR0L bsf T0CON, TMR0ON ; Enable timer0 tlp2 btfss INTCON, TMR0IF ; Vi skal utføre en bit-test. Vi venter til timer bit settes. Hvis timeren er satt, vil den hoppe over bra-instruksjonen. bra tlp2 ; ubetinget hopp-setning. Den vil hoppe tilbake til linjen over (tlp2). call slukkPortB ;Vi slukker alle lysdiodene ved hjelp av slukkPortB metoden, som er definert lenger ned i koden. stop bra stop tennPortB movlw 255 ; tenner alle dioder på port B movwf PORTB return ; Henter returadressen fra stacken slik at vi kommer tilbake i koden der vi var. slukkportB movlw 0 ; slukker alle dioder på port B movwf PORTB return end ; Ingen instruksjon til mikrokontrolleren, men en beskjed til oversettelsesprogrammet om at nå er all oversettingen fullført.
Eksempel
Vi ønsker å skape en tidsforsinkelse = 8 sekunder. Vi vet at en tellerpuls = 1 mikrosekund, og at vi bruker nedtelling med 256 prescaler. Etter nedtellingen blir telletakten 1 puls per 256 mikrosekund
Vi regner ut antall tellinger: 8 sek/256*10-⁶ (mikrosek) = 31250
Innlastingsverdi: For å finne innlastningsverdien tar vi 2^16 (16 bit) og trekker fra antall tellinger.
31250 = 0x7A12
65536 - 31250
34285 = 0x85ED
For å fullføre, må vi kode følgende:
Initialiseringen --> lys på alle diodene --> Tidsforsinkelse, 8 sek --> slukk alle dioder

