Programació en ASM del PIC 16F690 amb PICkit 2

Referència Trucs Perifèrics   Recursos CITCEA
Tutorial Exemples Projectes   Inici

Brunzidor piezoelèctric

Un brunzidor piezoelèctric és un element capaç de generar un so d'una determinada freqüència quan se l'alimenta amb un senyal PWM de la freqüència desitjada. En el nostre cas emprem un brunzidor CUI o un CAF4. El connexionat és molt simple. Només cal connectar el positiu del brunzidor a la sortida PWM (RC5) i el negatiu a la pota VSS (negatiu de l'alimentació).

El PWM ha de tenir la freqüència de la nota desitjada i un temps d'activació proper al 50 %.

Els brunzidors són elements petits i molt senzills de fer servir però el seu so no és de gaire qualitat. Si volem un so més agradable, podem emprar un altaveu.

La taula següent indica els valors que cal configurar en el PWM (amb una prescala de 16) per obtenir les notes de l'escala central del piano:

piano
Nota Freqüència teòrica (Hz) PR2 CCPR1L DC1B Freqüència real (Hz)
do3 C4 261,626 238 119 2 261,506
do#3 re b3 C#4 Db4 277,183 224 112 2 277,778
re3 D4 293,665 212 106 2 293,427
re#3 mi b3 D#4 Eb4 311,127 200 100 2 310,945
mi3 E4 329,628 189 95 0 328,947
fa3 F4 349,228 178 89 2 349,162
fa#3 sol b3 F#4 Gb4 369,994 168 84 2 369,822
sol3 G4 391,995 158 79 2 393,082
sol#3 la b3 G#4 Ab4 415,305 149 75 0 416,667
la3 A4 440,000 141 71 0 440,141
la#3 si b3 A#4 Bb4 466,164 133 67 0 466,418
si3 B4 493,883 126 63 2 492,126
do4 C5 523,251 118 59 2 525,210

Malauradament, el microcontrolador no té prou precisió i les notes reals tindran una freqüència lleugerament diferent que és la que s'indica a la darrera columna.

La funció següent toca la nota que se li indica durant 0,2 s i després deixa un silenci de 0,2 s més. Per especificar la nota, cal escriure els valors corresponents a PR2, CCPR1L i DC1B a les respectives variables ValPR2, ValCCPR1L i ValDC1B.

A l'exemple NM la podeu veure en funcionament.

	cblock	0x20
Retard1			; Variables de retard	
Retard2
ValPR2			; Aquí hi guardarem el valor de PR2
ValCCPR1L		; Aquí hi guardarem el valor de CCPR1L
ValDC1B			; Aquí hi guardarem el valor de DC1B
ValCCP1CON		; Aquí hi guardarem el valor de CCP1CON
...
	endc
	org 0
Inici
	bsf		STATUS,RP0		; Tria el banc 1
	movlw		b'00100000'		; Definim com volem les E/S del port C
	movwf		TRISC			; RC5 (sortida del PWM) com a entrada
	bcf		STATUS,RP0		; Tria el banc 0
	clrf		PORTC			; Desactiva les sortides del port C
	movlw		b'00001100'		; Configura el PWM, bits P1M (bits 7-6) a 00 mode senzill
						; DC1B = 00 (bits 5-4) els dos bits de menys pes són 0
						; CCP1M = 11xx en mode senzill els bit 0 i 1 no afecten
	movwf		ValCCP1CON		; Ho guarda per fer-ho servir més tard
	movwf		CCP1CON			; Ho posa com a configuració del PWM
	movlw		b'00000011'		; Configura el Timer 2
						; bits T2KCPS (bits 1-0) a 11 prescalat de 16
						; bit 2 (TMR2ON) a 0, Timer aturat
						; Postscaler TOUTPS (bits 6-3) no afecten al PWM
	movwf		T2CON			; Ho posa com a configuració del Timer 2
...
	movlw		.141			; Valor que correspon aproximadament a 440 Hz (LA3)
	movwf		ValPR2			; Ho posem com a valor de PR2
	movlw		.71			; Valor que correspon a un cicle del 50 % a 440 Hz
	movwf		ValCCPR1L		; Valor de CCPR1L
	movlw		.0			; Valor dels bits de menys pes del CCP
	movwf		ValDC1B			; Valor de DC1B
	call		TocaNota		; Toca la nota configurada
...
					;
					; Funció per tocar la nota configurada
					;
TocaNota
	movf		ValPR2,w		; Valor de PR2 per a la nota desitjada
	bsf		STATUS,RP0		; Tria el banc 1
	bsf		TRISC,5			; Posem RC5 (sortida del PWM) com a entrada
	movwf		PR2			; Ho posem com a comparació al Timer 2
	bcf		STATUS,RP0		; Tria el banc 0
	movf		ValCCP1CON,w		; Agafa la configuració de CCP1CON
	andlw		b'11001111'		; Posa els bits que corresponen a DC1B a zero per precaució
	movwf		ValCCP1CON		; I ho torna a guardar
	swapf		ValDC1B,w		; Agafa el valor que ha d'anar a DC1B
						; I el guarda, permutat, a W
						; Els dos bits han de quedar a les posicions 4-5
	andlw		b'00110000'		; Posa els altres sis bits a zero per precaució
	iorwf		ValCCP1CON,w		; I ho afegeix a CCP1CON
	movwf		CCP1CON			; Ho posa com a configuració del PWM
	movf		ValCCPR1L,w		; Valor de CCPR1L
	movwf		CCPR1L			; Registre que ens dóna l'amplada de tON
	bcf		PIR1,TMR2IF		; Desactiva el bit d'interrupció del Timer 2
	bsf		T2CON,TMR2ON		; Activa el Timer 2
						; No convé engegar el PWM fins que el Timer 2 no ha fet un cicle
	btfss		PIR1,TMR2IF		; Espera l'activació del bit d'interrupció del Timer 2
	goto		$-1
	bsf		STATUS,RP0		; Tria el banc 1
	bcf		TRISC,5			; Posem RC5 (sortida del PWM) com a sortida
	bcf		STATUS,RP0		; Tria el banc 0
	call		RetM			; Espera 0,2 s
	bsf		STATUS,RP0		; Tria el banc 1
	bsf		TRISC,5			; Posem RC5 (sortida del PWM) com a entrada
						; Fem silenci
	bcf		STATUS,RP0		; Tria el banc 0
	call		RetM			; Espera 0,2 s
	return
RetM						; Funció de retard de 0,2 s
	decfsz		Retard1,f		
	goto		RetM		
	decfsz		Retard2,f	
	goto		RetM
	return
	end

 

 

Licencia de Creative Commons
This obra by Oriol Boix is licensed under a Creative Commons Reconocimiento-NoComercial-SinObraDerivada 3.0 Unported License.