Diferencia entre revisiones de «Buzzer - DEMOQE128»
(→Por interrupciones RTC) |
(→Generación de tonos manual (sin RTC)) |
||
Línea 158: | Línea 158: | ||
===Generación de tonos manual (sin RTC)=== | ===Generación de tonos manual (sin RTC)=== | ||
− | + | * Los primeros pasos de inicialización son exactamente iguales con o sin RTC | |
− | + | * Al momento de implementar las interrupciones, si no se posee el conocimiento para usar el RTC también se puede crear un periodo “manualmente”, se debe tener como parámetro la cantidad de ciclos de reloj que tendrá la onda cuadrada. Luego se debe “sincronizar” el tiempo que tarda cada instrucción del programa con respecto a la cantidad de ciclos de la onda. Para poder completar los ciclos faltantes (la onda usualmente se toma más ciclos de reloj que las instrucciones de cambio de periodo) se pueden utilizar “nops” iterados dentro de las mismas instrucciones si se trata de assembler, o ciclos si se trabaja con C. | |
− | |||
− | + | * Se puede utilizar una tabla de frecuencias para cada “nota” que se desea, si se quiere hacer un sonido específico ( esto para cuando se desea generar más de un tono), el programa leerá estas variaciones y las tomará como un cambio en el periodo, que en sí es lo que define que nota tomará como salida el ''buzzer''. | |
+ | |||
+ | |||
+ | |||
+ | * Aunque es posible generar una onda de esta manera, es mejor utilizar el RTC pues este diseño es muy poco eficiente y se desperdicia la verdadera capacidad del [[Tarjeta de Desarrollo - DEMOQE128|DEMOQE128]]. | ||
Línea 206: | Línea 209: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | Para el uso de esta instrucción también se necesita el uso de una tabla de frecuencias que representen una escala de notas o tonos, el programa leerá la "canción"que no será más que una combinación de las frecuencias de la tabla y las traducirá a cambios en periodo como se mencionó anteriormente. un modelo de dicha tabla podría ser: | |
<syntaxhighlight lang="asm"> | <syntaxhighlight lang="asm"> |
Revisión del 17:08 17 mar 2013
Contenido
Buzzer
Un buzzer es un transductor electroacústico, o dispositivo de señales de audio, que produce un tono intermitente o continuo, dependiendo de cómo se programe.Existe una gran variedad de modelos de buzzer, desde magnéticos hasta piezoeléctricos, con distintos precios y especificaciones. Elegir cuál de estos modelos es mejor depende enteramente del uso que se le quiera dar. Un buzzer puede servir como alarma, beeper, avisos de fallos o aciertos en ciertos programas o incluso se puede implementar para lograr tonos armónicos o canciones.
El corazón de unbuzzer piezoeléctrico es un disco de piezo el cual consiste en una placa cerámica recubierto de una capa metálica. Debe tener incluido un oscilador para ser consideradobuzzer.
La Tarjeta de Desarrollo DEMOQE128 contiene un piezo buzzer, el mismo se encuentra conectado al pin PTB5 del microcontrolador por medio de un Jumper. Para poder utilizar este buzzer es necesario que el Jumper esté habilitado.
Inicializaciones de Buzzer
Antes de empezar a codificar y trabajar con el buzzer se debe verificar que los Jumpers del DEMOQE128 posea la configuración adecuada para su funcionamiento:
• Colocar los jumpers de manera que se permita la salida de la señal al buzzer. El buzzer depende de que el jumper J19 este colocado de la siguiente manera:
• Tener en cuenta con qué puerto trabaja el Buzzer y activarlo como salida. Se debe colocar
el puerto PTBDD como salida ya que el buzzer funciona por medio de PTBD_PTBD5.
PTBDD= 0xFF;
Implementación
Antes de empezar a utilizar el buzzer se debe tener en cuenta un par de cosas importantes:
- El buzzer es parte del hardware del DEMOQE128, no depende del micro controlador implementado.
- El buzzer no posee una estructura definida de control
- La implementación del buzzer depende del código.
Como se mencionó anteriormente para implementar el buzzer no contamos con registros de control ni con secuencias de instrucciones de control, para poder utilizarlo debemos trabajar dentro del código.
Se debe programar el código de manera que emule una señal periódica, de esta manera podemos usar esta señal como salida para el dispositivo, el cual arrojará los tonos programados.
¿Cómo crear una señal periódica?
Se puede utilizar una señal periódica para implementar los tonos en el buzzer, dado que no se cuenta con un conversor Digital/Analógico en la Tarjeta de Desarrollo DemoQE, las señales de salida que se entregarán al buzzer serán digitales. Para efectos prácticos el buzzer recibirá una señal periódica que alternará entre 1 y 0. Una señal cuadrática sería un buen ejemplo para la implementación de este método de diseño.
Al momento de crear la señal hay que tomar en cuenta los siguientes aspectos para el tipo de tono que se quiera producir:
- El tiempo que va a durar un tono.
- La frecuencia del tono.
- El espacio de tiempo entre tonos para evitar que se solapen.
Generación de solo un tono
Por interrupciones RTC
Colocar como salida el puerto PTBDD. Esto permite generar una salida en el puerto que esta conectado al buzzer.
PTBDD = 0xff;
Habilitar interrupciones del RTC (Real Time Counter):
Las interrupciones RTC se usarán para determinar el periodo de la onda.
En assembler
LDA #$04
STA SCGC2 ; Habilita BUS clock para RTC.
LDA #$00
STA RTCMOD ;Se inicializa el Módulo de RTC.
LDA #$1E ;Para que active la bandera RTIF cada 1s.
STA RTCSC
En lenguaje C
SCGC2=0x04; //Habilita BUS Clock para RTC
RTCMOD=0x00; //Se inicializa el módulo Real Time Counter.
RTCSC=0x1E; //Para que active la Bandera RTIF cada 1s.
El periodo de la onda es determinado de la siguiente manera:
El programa entrará en la rutina de interrupción que asignada al RTC. Durante esta rutina se negará la salida PTBD_PTB5, esto determina la mitad del periodo. Si se observa la onda cuadrada se puede notar que con cada cambio de flanco o salida negada la amplitud de la onda cambia de “0” a “1”, cuando la onda haga dos cambios (vuelva al estado que se toma como referencia) se cumple un periodo, por eso cada interrupción por RTC representa medio periodo.
Se continúa negando la salida PTBD_PTBD5 por un tiempo indeterminado, esto genera un tono en la salida del buzzer, el cual reconoce los cambios en el periodo de la señal como el tono en cuestión.
Variación de tonos:
- Para cambiar el tono, se debe configurar el RTC de manera que module la duración entre interrupciones (esto cambiará el periodo de la onda).
- En el caso que se quiera programar más de una secuencia de tonos, o "canciones" juntas, un dato de interés podría ser que el buzzer no puede reconocer frecuencias (expresadas en periodos) muy altas o muy bajas, lo cual usualmente es útil para hacer "silencios" entre una canción y otra. Esto se puede realizar mediante la colocación de -1, que se refiere al valor de $FFFF (es una frecuencia muy alta, que el buzzer no reconocerá) y no emitirá sonido. Cuatro "-1" corresponden a 1 segundo.
Generación de tonos usando PWM
#define PRESCALAR 0
#define MODULO 32768 //4Mhz / MODULO / 1 (prescaler) = aprox. 122Hz
#define DUTY25 (MODULO/4)
void main(void)
{
// Inicializaciones
SOPT1_COPE=0; /*Desabilitar el watchdog*/
ADCSC1 = 0x20; // Se selecciona el canal ADCH0, Se selecciona modo de conversion continua y se habilitan las interrupciones
ADCSC2 = 0x00; // Se deshabilita la funcion de comparacion y se selecciona el software trigger
ADCCFG = 0x40; // Se selecciona Long Sample time y se divide el Bus Clock entre 2
APCTL1 = 0x00; // Se deshabilita el puerto asociado al canal ADCH0 ya que esta siendo usado como entrada analogica
ADCCFG_MODE=1; /*12bit conversion*/
//inicializacion pwm
TPM1SC_CLKSA = 1; // Se elige como source del reloj para el TPM el "Bus Rate Clock"
TPM1SC_CLKSB = 0;
TPM1SC_PS = PRESCALAR; //y dividido entre 1
TPM1MOD = MODULO; // Se guarda el valor del modulo para el contador
TPM1C0SC_MS0B = 1; // Se elige la modalidad "PWM edge aligned"
TPM1C0SC_ELS0A = 1; // Corresponde a la configuración de pulso "Low-True"
TPM1C0V = DUTY25; // Con esto obtendremos un duty cycle aprox del 25%
for(;;)
{
ADCSC1_ADCH=0x0;
while(ADCSC1_COCO==0); // Esperar que la conversion se ejecute
TPM1MOD = ADCR; //Cambio el Valor del módulo
TPM1C0V = TPM1MOD/4; //25%dutycicle
}
}
Nota: Falta probar el código
Generación de tonos manual (sin RTC)
- Los primeros pasos de inicialización son exactamente iguales con o sin RTC
- Al momento de implementar las interrupciones, si no se posee el conocimiento para usar el RTC también se puede crear un periodo “manualmente”, se debe tener como parámetro la cantidad de ciclos de reloj que tendrá la onda cuadrada. Luego se debe “sincronizar” el tiempo que tarda cada instrucción del programa con respecto a la cantidad de ciclos de la onda. Para poder completar los ciclos faltantes (la onda usualmente se toma más ciclos de reloj que las instrucciones de cambio de periodo) se pueden utilizar “nops” iterados dentro de las mismas instrucciones si se trata de assembler, o ciclos si se trabaja con C.
- Se puede utilizar una tabla de frecuencias para cada “nota” que se desea, si se quiere hacer un sonido específico ( esto para cuando se desea generar más de un tono), el programa leerá estas variaciones y las tomará como un cambio en el periodo, que en sí es lo que define que nota tomará como salida el buzzer.
- Aunque es posible generar una onda de esta manera, es mejor utilizar el RTC pues este diseño es muy poco eficiente y se desperdicia la verdadera capacidad del DEMOQE128.
Un ejemplo de este diseño sería:
;************************************************************************** ;
;*** Rutina de generación de ondas cuadradas, de 30 ciclos de reloj *******;
;*** se llevará a cabo tantas veces como indique PERIODO, ******* ;
;*** Luego negará la salida del ''Buzzer'' y repetirá el conteo de PERIODO ****;
;*** 30 ciclos * 250 ns (Tiempo de cada ciclo) = 7.5uS *****************;
;**************************************************************************;
MOV 0, COUNTER;
MOV 0, COUNTER_2
Flanco: NOP ;1 ciclo - Los NOP son para compensar los Ciclos usados en cambiar el Flanco.
LDA COUNTER
INCA
STA COUNTER
BNE COUNTER, #12,Flanco
Cambio: NOP
LDA COUNTER
INCA
STA COUNTER
BNE COUNTER, #10,Cambio
AIX #-1 ;2 ciclos.
CPHX #$0000 ;3 ciclos - Revisa si el contador llega a cero, compare HX con el valor.
BNE Flanco ;3 ciclos - Si aun no se termina el periodo, decrementar contador, NECESITA DE RESULTADO DE LA Función anterior para actuar.
COM PTBD ;5 ciclos.
LDHX periodo ;5 ciclos.
BRA Cambio ;3 ciclos - Si ya terminó el periodo, pasar al siguiente flanco.
;**************************************************************
Para el uso de esta instrucción también se necesita el uso de una tabla de frecuencias que representen una escala de notas o tonos, el programa leerá la "canción"que no será más que una combinación de las frecuencias de la tabla y las traducirá a cambios en periodo como se mencionó anteriormente. un modelo de dicha tabla podría ser:
;Tabla de Notas musicales ordenadas por octava: do, do#,re,re#,mi,fa,fa#,sol,sol#,la,la#,si
;do, do#,re,re#,mi, fa, fa#,sol,sol#,la,la#,si
SILENCIO: DC.W $FFFF
OCTAVA1: DC.W 509,480,454,428,403,381,359,339,320,302,285,269 ;3
OCTAVA2: DC.W 254,240,226,213,201,190,179,169,160,151,143,135 ;4
OCTAVA3: DC.W 126,119,113,106,100,94,89,84,79,75,71,66 ;5
OCTAVA4: DC.W 63,59,56,53,50,47,44,42,39,37,35,33 ;6
•Aun así se recomienda de nuevo no utilizar este método sino uno que implique la variación del periodo por medio de RTC, lo que haría que la cantidad de líneas de código de el programa disminuya significativamente ademas de ser la manera correcta de programar y aprovechar eficientemente las funciones del DEMOQE128.
Programa de Prueba
A continuación se puede observar un enlace a Youtube con un video de la implementación del buzzer, está programado para reproducir dos fragmentos de canciones del juego "ZELDA", primero "Serenade Of Water", luego, y con un silencio de segundo y medio, sonará un fragmento de "Song Of Storms".
http://www.youtube.com/watch?v=jyfUEQ8zmCY
Referencias
Contributors
AK, Anny, Aromero, Arpm92, Dalak, Eduardo suarez, Francjsalanova, JCaceres, Leofragachan, Manypuig, Minleung, Misato, Racuna, Ramor, SalvadorV