Besturen van een output onder controle van een output-compare
Het volgende voorbeeld bestuurt een uitgang op de SIMPLEX onder
besturing van output-compare 1, de functie waarvoor de output-compares
eigenlijk bedoeld zijn. Het voorbeeld kan gebruikt worden voor het
genereren van een nauwkeurige en stabiele frequentie op een uitgang van de
micro-controller.
*************************************************
* definiëren van de geheugen map
*************************************************
incl "map512.asm"
*************************************************
* start van het programma
*************************************************
PROGRAM space |kies het programma gebied
reset equ $ |na reset begint de micro op deze plaats
lds #stackend |begin met de stackpointer te laden
ldx #databeg |en zet dan het volledige datagebied op 00
clearram clr 0,x
inx
cpx #dataend
bls clearram
ldx #regsbeg |laat IX op de bank met I/O registers wijzen
*************************************************
* output-compare interrupt
*************************************************
PROGRAM space
oc1start equ $ |het beginadres van deze module
oc1time equ 2000 |het aantal klokperioden per interrupt
|een klokperiode duurt 0.5 micro-seconden
* initialisatie van de output-compare interrupt
PROGRAM space
ldx #regsbeg |IX wijst naar de I/O registers
bset oc1m+regsbeg,x,oc1m7
|laat output compare op PA7 werken
bset oc1d+regsbeg,x,oc1d7
|begin met de output een '1' te maken
ldd tcnt |haal de systeemtijd
addd #oc1time |en zet deze 'oc1time' verder voor de eerste
std toc1 |interrupt, clear dan een eventuele interrupt
ldab #oc1f
stab tflg1 |en enable de interrupts van output-compare 1
bset tmsk1+regsbeg,x,oc1i
bra oc1end |einde van de initialisatie
* subroutine voor de afhandeling van de output-compare interrupt
PROGRAM space
oc1intentry equ $
ldab #oc1f
stab tflg1 |reset de interrupt-vlag
ldab oc1d |inverteer de waarde die de output de volgende
eorb #oc1d7 |interrupt zal krijgen
stab oc1d
ldd toc1 |haal de tijd op het moment van de interrupt
addd #oc1time |en zet deze 'oc1time' verder voor de volgende
std toc1 |interrupt
rti
oc1end equ $ |einde van de output-compare interrupt module
*************************************************
* het hoofdprogramma
*************************************************
PROGRAM space
cli |laat de interrupts door
main0 bra main0 |en wacht oneindig
end
De meeste code in het programma zal U inmiddels na lezen duidelijk
zijn. De stukjes programma die nieuw zijn worden hieronder besproken.
De output-compare 1 interrupt wordt geïnitialiseerd en geactiveerd. De
I/O schakeling rond output-compare 1 wordt opdracht gegeven om bij elke
output-compare 1, uitgang PA7 aan te passen. Hiertoe moet in het OC1M
register het OC1M7-bit op '1' gezet worden.
Het OC1D-register bevat de waarde die bij elke output-compare op de
betreffende uitgang gezet moet worden. Tijdens initialisatie wordt dit op
'1' gezet, zodat de eerste output-compare 1 actie een '1' op de uitgang
zal zetten.
Wanneer de output-compare afloopt, wordt een interrupt routine gestart.
In deze routine wordt het nieuwe tijdstip berekend voor de volgende
interrupt, en wordt bepaald welke waarde bij de volgende interrupt op de
uitgang gezet moet worden. Door bij elke interrupt de waarde die op de
uitgang gezet wordt te inverteren, zal op de uitgang een blokgolf
ontstaan.
De uitgang PA7 is te vinden op de connector. Denk eraan dat deze
uitgang niet gebufferd is. U kunt de frequentie die door de
micro-controller wordt opgewekt meten met een frequentiemeter, of
eventueel hoorbaar maken op een audio-versterker. De amplitude van het
signaal is ongeveer 5 Volt, dus in het laatste geval zult U een
weerstandje moeten gebruiken om het signaal te verzwakken.
|