Assembly:Timer

Fra CodeWiki

Gå til: navigasjon, søk

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 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

Personlige verktøy
dataprogrammering
generelt