Programació en mpasm del PIC 16F690

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

Exemple NS - Fem sonar notes musicals

En aquest exemple farem sonar unes notes musicals en un brunzidor piezoelèctric o un altaveu.

El següent programa toca la seqüència do - re - mi, fa una pausa de 0,2 s i la torna a tocar.

#include <p16F690.inc>
	__config (_INTRC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_OFF&_MCLRE_OFF&_CP_OFF&_BOR_OFF&_IESO_OFF&_FCMEN_OFF)
	cblock	0x20
numbuc			; Nombre de bucles per fer 0,2 s
bucles			; Comptador de bucles
numcicL			; Nombre de cicles de 771 us
numcicC			; Nombre de cicles de 3 us
port			; Variable per gestionar el port C
Retard1			; Variables de retard	
Retard2
	endc
	org 0
Inici
	bsf		STATUS,RP0		; Tria el banc 1
	clrf		TRISC			; Tot el port C és de sortida
	bcf		STATUS,RP0		; Tria el banc 0
	clrf		port			; Desactiva les sortides del port C
	clrf		PORTC			; Desactiva les sortides del port C
Bucle
	movlw		.105			; Valors que correspon aproximadament a do3
	movwf		numbuc			; Nombre de bucles per fer 0,2 s
	movlw		.2
	movwf		numcicL			; Nombre de cicles de 771 us
	movlw		.120
	movwf		numcicC			; Nombre de cicles de 3 us
	call		TocaNota		; Toca la nota configurada
	movlw		.117			; Valors que correspon aproximadament a re3
	movwf		numbuc			; Nombre de bucles per fer 0,2 s
	movlw		.2
	movwf		numcicL			; Nombre de cicles de 771 us
	movlw		.50
	movwf		numcicC			; Nombre de cicles de 3 us
	call		TocaNota		; Toca la nota configurada
	movlw		.132			; Valors que correspon aproximadament a mi3
	movwf		numbuc			; Nombre de bucles per fer 0,2 s
	movlw		.1
	movwf		numcicL			; Nombre de cicles de 771 us
	movlw		.245
	movwf		numcicC			; Nombre de cicles de 3 us
	call		TocaNota		; Toca la nota configurada
	call		RetM			; Espera 0,2 s
	goto		Bucle
			;
			; Funció per tocar una nota
			;	numbuc	Nombre de bucles per fer 0,2 s
			;	numcicL	Nombre de cicles de 771 us
			;	numcicC	Nombre de cicles de 3 us
			; Aquestes tres variables no es modifiquen
TocaNota
	movf		numbuc,w		; Nombre de cops que ho hem de repetir
	movwf		bucles			; Variable per comptar-los
TN0
	movlw		b'00100000'		; RC5 correspon al brunzidor
	xorwf		port,f			; Inverteix el bit
	movf		port,w			; Agafa port
	movwf		PORTC			; i ho copia al port C
						; Retard de numcicL x 771 us
	movf		numcicL,w		; Nombre de cicles que cal fer
	movwf		Retard2
	btfsc		STATUS,Z		; Mira si és zero
	goto		TN2			; No fem aquest retard
TN1	
	decfsz		Retard1,f
	goto		TN1
	decfsz		Retard2,f
	goto		TN1
TN2
						; Retard de numcicC x 3 us
	movf		numcicC,w		; Nombre de cicles que cal fer
	movwf		Retard1
	btfsc		STATUS,Z		; Mira si és zero
	goto		TN2			; No fem aquest retard
TN3	
	decfsz		Retard1,f
	goto		TN3
TN4
	decfsz		bucles,f
	goto		TN0
			; Fi del bucle
	bcf		port,5			; En acabar, deixem la sortida desactivada
	movf		port,w			; Agafa port
	movwf		PORTC			; i ho copia al port C
	return
RetM						; Funció de retard de 0,2 s
	decfsz		Retard1,f		
	goto		RetM		
	decfsz		Retard2,f	
	goto		RetM
	return
	end

 

 

Llicència de Creative Commons
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.