Reproducir un sonido "beep" con PIC

Hola, alguien puede ayudarme o indicarme como reproducir un sonido tipo "beep" como el de los relojes o las alarmas utilizando un PIC. La idea es que sea lo mas simple posible. Solo tengo disponible un bit de salida por el puerto A, ya que todos los demás puertos los tengo ocupados en otras funciones. Estaba pensando que el bit de salida lo conecto a una resistencia y esta a la base en un transistor NPN, el emisor a tierra y en el colector el parlante conectado a VCC. No se que tan correcto sea este diseño y tampoco como tendria que mandar las señales por el PIC. Ayuda porfavor. Muchas gracias.
 
Código:
;******************************** Int_Cuadradas_02.asm **********************************
;
;	===================================================================
;	  Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;	  E. Palacios, F. Remiro y L. López.
; 	  Editorial Ra-Ma.  [url]www.ra-ma.es[/url]
;	===================================================================
;
; A la línea de salida se conecta un altavoz que produce el sonido de una sirena que será fijado
; por el diseñador. En esta solución la frecuencia es de 300 Hz, subiendo hasta 4 kHz y bajando
; después, más lentamente, a su valor inicial y repitiendo el proceso.

; ZONA DE DATOS **********************************************************************

	__CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC
	LIST	   P=16F84A
	INCLUDE  <P16F84A.INC>

	CBLOCK 0x0C
	ApuntadorFrecuencia
	SentidoFrecuencia		; (SentidoFrecuencia)=0 (frecuencia ascendente).
	ENDC				; (SentidoFrecuencia)=1 (frecuencia descendente).

MaximoPeriodo	EQU	d'200'		; Corresponden a una frecuencia entre 300 Hz y 
MinimoPeriodo	EQU	d'15'		; 4 kHz tal como se demuestra posteriormente.
#DEFINE  Salida	PORTB,3

; ZONA DE CÓDIGOS ********************************************************************

	ORG 	0
	goto	Inicio
	ORG	4
	goto	Timer0_Interrupcion
Inicio
	bsf	STATUS,RP0
	bcf	Salida
	movlw	b'00000010'		; Prescaler de 8 asignado al TMR0.
	movwf	OPTION_REG
	bcf	STATUS,RP0
	clrf	SentidoFrecuencia	; Inicializa el sentido de la variación de
	movlw	MaximoPeriodo		; frecuencia ascendente en la sirena.
	movwf	ApuntadorFrecuencia	; Inicializa a la frecuencia mínima.
	sublw	.0			; Carga en el Timero 0 con signo negativo.
	movwf	TMR0	
	movlw	b'10100000'
	movwf	INTCON			; Activa interrupción del TMR0 (TOIE).
Principal
	btfss	SentidoFrecuencia,0
	goto	FrecuenciaAscendente
FrecuenciaDescendente
	call	Retardo_20ms		; Mantiene la frecuencia durante este tiempo.
	incf	ApuntadorFrecuencia,F	; Aumenta el periodo, disminuye la frecuencia.
	movlw	MaximoPeriodo		; ¿Ha llegado a su máximo valor de periodo?
	subwf	ApuntadorFrecuencia,W	; (W)=(ApuntadorFrecuencia)-MaximoPeriodo
	btfsc	STATUS,C		; ¿C=0?,¿(W) negativo?, ¿(ApuntadorFrecuencia)<Maximo.
	clrf	SentidoFrecuencia	; No. La siguiente pasada entra en "FrecuenciaAscendente".
	goto	Fin
FrecuenciaAscendente
	call	Retardo_10ms		; Mantiene la frecuencia durante este tiempo.
	decf	ApuntadorFrecuencia,F	; Disminuye el periodo, aumenta la frecuencia.
	movlw	MinimoPeriodo		; ¿Ha llegado a su mínimo valor de periodo?
	subwf	ApuntadorFrecuencia,W	; (W)=(ApuntadorFrecuencia)-MinimoPeriodo
	btfss	STATUS,C		; ¿C=1?,¿(W) positivo?, ¿(ApuntadorFrecuencia)>=Minimo.
	incf	SentidoFrecuencia,F	; No. La siguiente pasada entra en "FrecuenciaDescendente".
Fin	goto 	Principal

; Subrutina "Timer0_Interrupcion" -------------------------------------------------------
;
; Con un prescaler de 8 el periodo variará según el valor de ApuntadorFrecuencia entre:
; - Para (ApuntadorFrecuencia)=15, frecuencia = 4 kHz.
;   (efectivamente 15 x 8 = 120 µs de semiperiodo que son 4 kHz aproximadamente).
; - Para (ApuntadorFrecuencia)=200, frecuencia = 300 Hz.
;   (efectivamente 200 x 8 = 1600 µs de semiperiodo que son 300 Hz aproximadamente).

	CBLOCK	
	Guarda_W
	Guarda_STATUS
	ENDC

Timer0_Interrupcion
	movwf	Guarda_W		; Guarda el valor de W y STATUS.
	swapf	STATUS,W
	movwf	Guarda_STATUS
	bcf	STATUS,RP0
	movf	ApuntadorFrecuencia,W
	sublw	.0			; Carga en el Timer 0 con signo negativo.
	movwf	TMR0
	btfsc	Salida
	goto	EstabaAlto
EstabaBajo
	bsf	Salida
	goto	Fin_Timer0_Interrupcion
EstabaAlto
	bcf	Salida
Fin_Timer0_Interrupcion
	swapf	Guarda_STATUS,W		; Restaura el valor de W y STATUS.
	movwf	STATUS
	swapf	Guarda_W,F
	swapf	Guarda_W,W
	bcf	INTCON,T0IF
	retfie
;
	INCLUDE  <RETARDOS.INC>
	END

;	====================================================================
;	  Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS".
;	  E. Palacios, F. Remiro y L. López.
; 	  Editorial Ra-Ma.  [url]www.ra-ma.es[/url]
;	====================================================================
 
hay una librería en el compilador de ccs llamada tones.h que ejecuta perfectamente el beep que mencionas utilizando una función el la cual vos pones la frecuencia y la duración de la frecuencia
si vos queres que el beep sea de 1khz y te dure 1 seg pones tone(1000,1000); (el tiempo en ms y la f en hz)
 
Hey! muchas gracias, el programa lo tenia justamente en c, asi que me sera mucho mas facil. Y tienes alguna idea de como conectar el hardwre? osea solo le conecto el parlante? o con algunos otros elementos?
 
La salida del pic la tenés que conectar a un transistor a travéz de una resistencia y de ahí al buzzer o parlante
una cosa a tener en cuenta es que la librería que te dije es bastante pesada al momento de compilar ocupa bastante memória pero si vás a usar un pic con bastante memoria digamos 2k en adelante estás sobrado
 
Hola espero te ayude esta respuesta aqui esta "el diagrama" de conexion de salida al parlante una esta activada con un pulso alto y la otra con pulso bajo(D1 seria la salida del controlador), lo q se nesecita crear con el programa seria el equivalente a prender y apagar algo, esta secuencia debe ser rapida para crear una frecuencia y asi llegar al sonido, aunque no soy un experto en asm podria ser algo asi:

Código:
Cuadro    mov b, 8h
               mov A, 1
               Out (20h), A

Loop        dec B
                jmp NZ; Loop
                mov b, 80h
                mov a; 0

loop 1      Dec B
                jmp NZ, loop1
                jmp Cuadro


si deseas aumentar o disminuir La Frecuancia del tono debes aumentar o decrementar el numero asignado a b en este caso 80h


Saludos
 

Adjuntos

  • conexion_815.jpg
    conexion_815.jpg
    5.6 KB · Visitas: 614
Gracias, ya lo arme y funciona excelente, el diseño era para un reloj digital y para los sonidos de alarma.
Ya termine con ese proyecto, pero ahora estaria muy interesado en reproducir audio, podria ser mediante el PIC o quiza algun otro integrado que no sea muy dificil de conseguir. Solo quiero que reproduzca una frase pregrabada, maximo 20 segundos. No necesita ser de buena calidad, ni estero ni nada asi, basta que se escuche claro. Alguna idea?
 
uhmmmmm existen unos integrados de winbond q hacen ese proceso, vea datasheets del ISD1420P(20seg) ISD2560P(60) ISD25120P(120seg), etc . Almacenan Datos en forma de voz en una memoria no volatil y la reproducen son buenisimos.



Saludos
 
Si, he leido de ellos y he visto en su pagina web sus especificaciones, creo que esa seria la mejor opcion, pero lamentablemente no los encuentro en la ciudad donde vivo :(
Estaba pensando que tal seria comprar uno de esos juguetes para niños o bebes que reproducen audio, como por ejemplo me acuerdo que mi hermanita tenia un celular de juguete que tenia varias frases pregrabadas. Y desarmarlo quiza con alguno de sus integrados se pueda hacer algo, que les parece?
 
Busca algún mp3 player en desuso (funcional) y en los botones de play, estop, rec soldale cables para luego en ves de accionar los botones mecánicamente usas algún microcontrolador para poder grabar sonidos y reproducirlos. No es que accedas al mp3 vía software sino que reemplazes el contacto mecánico del botón y uses uno electrónico.
 
Jonathan, una pregunta como podría hacer el contacto electrónico para accionar el botón de un mp3 player, por cierto ya conseguí uno nuevo muy económico unos 12$us. La idea que se me ocurre es con un rele. Pero podría ser solo con transistores? osea que funcionen como "switch"?
 
Ya lo hice utilice BC547 y las conexiones del "boton" las puse en el colector y emisor, con una resistencia de 3.3k a la base funciona bien. La verdad no se si esto es correcto, pero funciona. Nunca había utilizado el transistor de esta forma. He probado todas las configuraciones posibles pero solo esta funciono. Es correcto o hay algo que estoy haciendo mal?
 
fjireh dijo:
Ya lo hice utilice BC547 y las conexiones del "boton" las puse en el colector y emisor, con una resistencia de 3.3k a la base funciona bien. La verdad no se si esto es correcto, pero funciona. Nunca había utilizado el transistor de esta forma. He probado todas las configuraciones posibles pero solo esta funciono. Es correcto o hay algo que estoy haciendo mal?

10K en la base también va muy bien y sin preocupaciones. Transistor en parkdarlington con el BC547 y BD139 va bien o un 2N2222
 
Atrás
Arriba