elomax

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

Terug
Omhoog

Twee output-compares op dezelfde uitgang

Een andere opzet waarbij de duty-cycle binnen ruimere grenzen gekozen kan worden, is gegeven in het volgende voorbeeld. Hier worden zowel output-compare 1 als output-compare 2 gebruikt om PA6 aan te passen. Output-compare 1 wordt gebruikt om de periodetijd van het uitgangs signaal te bepalen. Iedere keer als output-compare 1 afloopt, wordt de uitgang een '1' gemaakt. In de interrupt routine voor output-compare 1 wordt output-compare 2 geactiveerd en ingesteld om na bepaalde tijd de uitgang weer een '0' te maken. Output-compare 2 kan dit volledig zelfstandig, zonder dat hiervoor een interrupt routine moet worden aangeroepen. Hierdoor is het mogelijk de duty-cycle van het signaal bijna 100% te maken. Bij een periodetijd van 2000 counts kan output-compare 2 bijvoorbeeld worden geladen met 1999, wat een duty-cycle van 1999 / 2000 = 99.95% mogelijk maakt.

Het programma genereert een duty-cycle gemoduleerd signaal op uitgang PA6. Wanneer U dit signaal wilt meten, denk er dan aan dat het een ongebufferd signaal is.

 

*************************************************
* 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 interrupts
*************************************************
PROGRAM		space
oc1start	equ $		|het beginadres van deze module
oc1time		equ 2000	|het aantal klokperioden per interrupt
				|een klokperiode duurt 0.5 micro-seconden
oc2time		equ 500		|het actieve deel van het signaal
* initialisatie van de output-compare interrupt
* output compare 1 zorgt voor de tijdbasis
* output compare 2 zorgt voor de realisatie van de duty-cycle
* op PA6 onstaat zodoende een duty-cycle signaal
PROGRAM		space
		ldx #regsbeg	|IX wijst naar de I/O registers
* output compare 1 maakt het signaal een '1'
		bset oc1m+regsbeg,x,oc1m6
				|laat output compare op PA6 werken
		bset oc1d+regsbeg,x,oc1d6
				|begin met de output een '1' te maken
* output compare 2 maakt het signaal een '0'
		bset tctl1+regsbeg,x,om2
		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 or oc2f)
		stab tflg1	|reset de interrupt-vlaggen
		ldd toc1	|haal de tijd op het moment van de interrupt
		pshb		|en bewaar deze tijd op de stack
		psha
		addd #oc1time	|tel hierbij de periodetijd van het signaal op
		std toc1	|zodat aan het eind van de periode weer een
				|interrupt komt
		pula		|haal het begintijdstip van deze periode terug
		pulb		|en tel er de tijd dat het signaal een '1'
		addd #oc2time	|moet zijn bij op. zet het resultaat in toc2
		std toc2	|zodat oc2 het signaal op tijd weer '0' maakt
		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

Ofschoon dit programma het wel mogelijk maakt de duty-cycle tot nagenoeg 100% in te stellen, is een duty-cycle van 0% niet haalbaar. Wanneer het voor de toepassing nodig is dat een duty-cycle van bijna 0% wel haalbaar is, kan de functie van de output-compares verwisseld worden. U laat output-compare 1 dan het signaal een '0' maken, en output-compare 2 maakt dan na verloop van tijd het signaal een '1'. U kunt dan een duty-cycle van nagenoeg 0% realiseren, terwijl een duty-cycle van 100% in dit geval weer slecht haalbaar is.
U kunt natuurlijk een bijzonder slim programma schrijven, dat afhankelijk van de verlangde duty-cycle, de éne of de andere methode kiest.


Vorige ] Volgende ]

© 2005...2008 Elomax [Voorwaarden ]