Paso 3: Cómo funciona:
En primer lugar, aquí hay un montón de incluye. Por supuesto hay los del procesador, así como algunas bibliotecas estándar. Lo que es importante que aquí es la cabecera de archivos que corresponden a las muestras. Esto es una manera de cargar convenientemente los datos del ordenador en el microcontrolador en tiempo de compilación. Escribí un script MATLAB que lee archivos .wav y declara una gran variedad por ejemplo:
int [] mydata = {1, 2, 3, 4};
Luego está la sección:
__attribute__((__interrupt__)) void _T2Interrupt (void)
{
Se trata de la interrupción por Timer 2, que conduce el PWM. Un PWM (modulador de ancho de pulso) genera una forma de onda tipo de análogo cambiando rápidamente el ciclo de trabajo de una forma de onda de pulso. Esto es debido a que las salidas digitales del microcontrolador pueden generar solamente un 0 lógico (que es en el voltaje de tierra) o un 1 lógico (que es en el voltaje de la batería). Si queremos decir, aproximar una tensión entre los podemos utilizar el PWM para activar el pin la mitad del tiempo y lo apague a la mitad del tiempo. Mientras esto se hace muy rápidamente, podemos aproximamos la tensión lo suficientemente bien como para sonar como la forma de onda original.
La función T2Interrupt es un manejador de interrupción por Timer 2. Básicamente, significa que el PWM necesita otra muestra, por lo que leemos otra muestra de la memoria de programa y rellenar en el registro de OC1RS. Se trata de cómo PWM sabe qué tensión para aproximar para la próxima muestra.
__attribute__((__interrupt__)) void _CNInterrupt (void)
{
Esta sección es un manejador de interrupción para la notificación de cambio. La notificación de cambio lanza una interrupción (es decir, se ejecuta la función anterior) cuando uno de los pasadores activó el estado de cambios (va alto -> bajo o viceversa). Esto es cómo detectamos el interruptor está pulsado. Observe que podríamos tu votación aquí, pero la notificación de cambio periférico funciona incluso cuando el microcontrolador está dormido, lo que nos permite ahorrar mucha energía. Lo que hacemos aquí depende de si ya se está reproduciendo un sonido. Si ya se está reproduciendo un sonido y estamos en la primera 375ms de la muestra, simplemente reiniciará el índice de la muestra (tal modo reiniciar la reproducción al principio de la misma muestra). Si no hay ninguna reproducción de sonido o están más allá de la primera 375ms, al azar se elija un nuevo sonido de la 10 y jugar. Esto permite que el Lil Jon Button para repetir la misma muestra pero todavía tiene suficiente comportamiento aleatorio a ser interesante (por ejemplo, Ya-Ya-¡ sí! ESTÁ BIEN!).
void setupHS()
void setupCN()
void setupPWM()
Aquí están algunas funciones de configuración. Esto es bastante complicado y es mejor consultar la hoja de datos para exactamente lo que sucede aquí. Basta con decir la primera establece el reloj del procesador a 66,33 Mhz, la segunda establece la notificación de cambio y la tercera establece el PWM. Para su referencia, la hoja de datos se puede encontrar aquí:
http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en532296
Finalmente el:
int principal)
{
Que es el bucle principal. Código empieza ejecutando aquí, así que lo primero que hace es configurar los periféricos. Luego el bucle principal no lo mucho. Básicamente sólo espera alrededor de un poco y se va a dormir. Todo el trabajo ocurre porque las interrupciones anteriores se han registrado, por lo que cuando algo necesita atención (por ejemplo el PWM necesita la siguiente muestra), automáticamente se llamará la interrupción correcta. Por lo general cuando el microcontrolador va a dormir, no se ejecuta ningún código. Sin embargo, debido a la notificación de cambio de periféricos ha sido activada, una pulsación en el botón hará que el microcontrolador e inmediatamente esa interrupción del servicio y empieza a jugar una muestra.
Nota final: Otra nota final:
Un ingeniero observador podría preguntar, ¿por qué usted no utilizó la función DAC del microcontrolador? De hecho el dsPIC33FJ128GP802 tiene un DAC de audio diseñado para este tipo de cosas. La razón es para simplificar el diseño. Aviso que para conducir un altavoz de un PWM, lo único que se necesita es solo digital interruptor (un BJT en este caso no hay resistencias de polarización). Si en cambio la salida fue un DAC, un amplificador lineal de transistores (con resistencias adicionales) o sería necesario un op-amp. Esto aumenta la complejidad del diseño y el número de parte. Tenga en cuenta que las formas de onda de entrada son simplemente 8kHz 8 bits archivos de audio, un completo CD-calidad DAC es excesiva en términos de calidad de audio, pero aumenta el gasto total.
Rango de voltaje de dsPIC33FJ128GP802 es solo 3.0-3.6V. He observado que corren aproximadamente 2.8V sin problemas con este código, pero no se puede garantizar estabilidad de largo plazo. Te recomiendo si es experimentar con el código para utilizar algunas pilas de litio AAA: http://www.amazon.com/Energizer-Ultimate-L92BP-4-Lithium-Battery/dp/B0002DUQDQ . Mantienen 1.5V por mucho más tiempo que AAAs alcalino.
Edit: problema resuelto mediante el uso de PIC18, que desciende a 2V