Analoge uitgang
De output-compare timers geven een flexibele en exacte controle over de
uitgangspennen. Hierdoor kunnen ook eenvoudig duty-cycle gemoduleerde
signalen opgewekt worden. Een duty-cycle gemoduleerd signaal is een
blokvormig signaal met een vaste periodetijd en een variabele verhouding
tussen de tijd dat het signaal een '1' is, en de periodetijd. Deze
verhouding noemt men de duty-cycle. De duty-cycle kan liggen tussen 0%
(het signaal is altijd een '0') en 100% (het signaal is altijd een '1'.)

De duty-cycle bepaalt de gemiddelde waarde van het signaal. Stel dat
het signaal tussen 0 Volt en 5 Volt wisselt. Een signaal met een
duty-cycle van 0% heeft dan een gemiddelde waarde van 0 Volt, een signaal
met een duty-cycle van 100% heeft een gemiddelde waarde van 5 Volt.
Tussenliggende waarden zijn bijvoorbeeld:
75% --> 3.75 Volt
50% --> 2.50 Volt
25% --> 1.25 Volt
De gemiddelde waarde kan uit het blokvormig signaal worden afgeleid
middels een eenvoudig RC filter.
De eenvoudigste manier om een duty-cycle gemoduleerd signaal op te
wekken wordt gegeven in het volgende voorbeeld.
*************************************************
* 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
oc1period equ 2000 |het aantal klokperioden per interrupt
|een klokperiode duurt 0.5 micro-seconden
oc1time equ 500 |actieve periode van het signaal
* 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
bitb #oc1d7 |test of het signaal een '0' of een '1' zal
beq oc1int0 |worden. Pas de tijd aan volgens de duty-cycle
ldd #(oc1period-oc1time)
bra oc1int9
oc1int0 ldd #oc1time
oc1int9 addd toc1 |tel hierbij de tijd op het moment van de
std toc1 |interrupt op voor de nieuwe interrupt tijd
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
In dit programma wordt een signaal opgewekt met een periodetijd van
2000 klokpulsen van elk 0.5µs (in totaal 1 milli-seconde.) De tijd dat
het signaal een '1' is, is vastgesteld op 500 klokpulsen, waarmee de
duty-cycle van het signaal dus op 25% komt te liggen. De interrupt routine
verzorgt het correct laden van het toc1 register, waardoor er interrupts
zullen optreden:
- aan het begin van een periode
- na 25% van de periode
Bij elke interrupt wordt de uitgang geïnverteerd. Afhankelijk van het
feit of de uitgang de volgende interrupt een '1' of een '0' zal worden
gemaakt, wordt de nieuwe tijd voor de volgende interrupt berekend.
|