elomax

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

Terug
Omhoog

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.


Vorige ] Volgende ]

© 2005...2008 Elomax [Voorwaarden ]