elomax

[ Techniek ] [ Shop ] [ Site map
TCNT ] Capture (IC) ] Compare (OC) ] OC Voorbeeld 1 ] [ OC Voorbeeld 2 ] OC Voorbeeld 3 ] IC Voorbeeld 1 ]

Terug
Omhoog

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.


Vorige ] Volgende ]

© 2005...2008 Elomax [Voorwaarden ]