Paso 1: Funcionamiento del programa.
La siguiente sección analizará cómo funciona el programa. 3.1 sección irá sobre la parte de inicialización del código que sucede antes del bucle principal. Una vez que el programa entra en el bucle principal es hacia fuera a 4 funciones diferentes: potread, keypress, bankchange y RGB. Las secciones 3.2, 3.3, 3.4 y 3.5 discutirá estas funciones por separado. Consulte el código en el paso 6.
3.1 inicialización de
Cualquier microcontrolador debe configurarse en primer lugar antes de entrar en un bucle del programa principal. Esto incluye la creación de la dirección de los pines, poniendo los valores correctos en cualquiera de los registros de control y definir el reloj principal que el microcontrolador se va a utilizar. El primer paso de mi programa era establecer los registros de configuración. Estos registros suelen controlan cosas como el temporizador de vigilante, cualquier master reset claro pins, marrón a detectan y configuraciones de oscilador. En este ejemplo particular lo configuro para que un cristal de 20Mhz oscilador externo se utiliza como el reloj principal para el PIC. El PIC tiene osciladores internos y puede ejecutar hasta 8Mhz, pero debido a la velocidad de los datos midi, necesitaba ejecutar el microcontrolador en una velocidad más alta para evitar cualquier error de datos. Tenga en cuenta la ubicación del oscilador en el diseño de placa PCB principal en la sección 7.1. Había soldado el cristal directamente debajo de la placa por lo que no es visible en la figura 2.0.
El siguiente registro que configuré fue el registro RCSTA y TXSTA. Estos registros son responsables de controlar comandos serie de hardware. La razón que utilizan comandos serie de hardware, software serial para enviar los comandos midi, es porque estoy enviando los datos a la Junta de convertidor de midi a 31250 baudios. He intentado enviar datos primer uso comandos de software solamente y yo estaba saliendo y el equipo estaba recibiendo datos que tenía falta de bits y piezas perdidas de información. El puerto serial del hardware tiene un búfer interno que se utiliza para dirigir el flujo de datos y por lo tanto es más confiable. La única limitación del uso de los comandos serie de hardware es que se limita a usar sólo ciertos pines en el microcontrolador donde como si envía comandos de software, puede usar cualquier pin disponible que desea. La pantalla LCD utiliza sólo requiere los datos a ser enviados a 9600 baudios, cualquier comando que enviado a la LCD estaba comandos serie software.
Luego configurar los pines que se iban a utilizar para controlar las fichas de LTC2309. Estos chips son controlados utilizando pernos de comandos tan sólo dos son necesarias para el control de los dos chips I2C.
Después de esto define todas las variables globales utilizadas en el programa. Luego he configurado la dirección de los pines pero cargando los bytes correctos en los registros TRISA, TRISB y TRISC en el PIC. Cargando un cero define el pin de este puerto para una salida. Cargar uno, lo define como una entrada. Por ejemplo: Si carga el valor 00000001 en el registro TRISB, Pin cero en PORTB sería una entrada mientras pins uno a través de siete se definen como salidas.
Como el PIC también tiene a bordo ADCs necesitaba desactivar aquellos por lo que es lo que hice. La pantalla entonces se enciende y aparece una pantalla de introducción. El comando serial software es una función incorporada en Picbasic Pro que es el compilador que usa. Cada vez que quiero ejecutar un comando serial software, necesito que me especifique el pin que quiero enviar el comando, la velocidad en baudios y los datos que quiero enviar. He encontrado la manera de controlar el LCD a través de su hoja de datos.
Los botones luego recorrer los diferentes colores. El propósito de esto es para asegurarse de que todo está conectado correctamente. Si se muestran todos los colores sé que RGB LED estén conectado correctamente. El programa entonces entra en el bucle principal.
3.2 Potread
Puesto que hay 8 canales en cada LTC2309, configurar el programa para los 8 canales de IC2 se leen en un bucle for, y los 8 canales de IC4 se leen en otro bucle for. Ya que estos chips son controlados mediante comandos I2C se utilizan sólo dos pines. Uno es un pin de reloj, que funciona a 100Khz, y el otro pin es un pin bidireccional, que se utiliza para enviar y recibir datos.
Para leer el valor analógico de cualquier canal dado, necesita decirle a la ADC qué canal quieres leer por lo tanto, antes de leer cualquier canal primero debe enviar dos bytes de información al chip. El primer byte, que el microcontrolador envía a la ADC es el marco de la dirección. Hay dos pernos en la LTC2309, que puede configurar la dirección. Estableciendo el AD1 patillas y AD0 en alta, baja o flotante, puede obtener hasta 8 diferentes direcciones, lo que significa que puede conectar hasta 8 diferentes LTC2309s' en un bus I2C. Si hace referencia a la figura 6.0 puede ver las diferentes configuraciones. Ya he indicado que dirección estoy usando. 7 bits se utilizan como la dirección, y el LSB (Bit 0) se utiliza para indicar el tiempo es un comando comando o escritura lectura. Establezca este bit en uno prepara al ADC para un comando de lectura y ajuste a cero pone a un comando de escritura.
El byte siguiente a la ADC es una broca de 6 palabra "Din". Esto es responsable de la configuración de canal. Ver Figura 8.0 para configuraciones de estruendo. Yo he destacado las diferentes palabras que he usado. En mi programa, el bit S/D se encuentra siempre porque estoy haciendo una terminó las mediciones. La broca de la UNI también siempre se encuentra ya solamente estoy usando el chip en modo unipolar. Figura 7.0 es el diagrama de tiempo de un comando de escritura en la hoja de datos.
A continuación el ADC envía el valor analógico al microcontrolador. Sin embargo, cualquier momento cualquier información intercambiada de la ADC en el microcontrolador, debe todavía enviar la estructura de dirección, excepto el LSB en el marco de dirección se cambia a uno, lo que significa es un comando de lectura. El valor analógico de 12 bits se envía en dos bytes. Figura 9.0 es el formato de los datos. He leído el valor analógico en dos variables diferentes. Una variable contiene los 8 bits más significativos, y el otro byte contiene los 4 bits menos significativos de la variable. Sin embargo los bits menos significativos son emplazamiento 4 lugares a la izquierda en esa variable, y los 4 bits a la derecha son sólo ceros. Para obtener este valor en una forma usable, cambio los 8 lugares más significativos de bits 4 a la izquierda. Soy capaz de hacer esto ya que la variable que estoy usando es una palabra de 16 bits. Entonces cambio la variable con los 4 puntos de bits 4 menos significativos a la derecha. Estos dos valores son entonces Unidos juntos y el resultado es una variable de 16 bits con un valor analógico de 12 bits. Sin embargo todavía debe reducir el valor ya que un valor de señal de control midi es sólo un byte. El máximo valor del ADC es 4095 en decimal y por lo tanto debe ser reducido a 128. Para hacer esto multiplicar el valor de ADC por 4095 entonces se dividen es por 128. Tengo otra variable, que utilizo para guardar el anterior valor de ADC. Cuando llega el lazo otra vez comprueba si ha cambiado el nuevo valor de ADC. Si cambió más de cierto valor umbral, envía una señal midi con el nuevo valor de ADC. Si está por debajo de este valor, se salta todo junto y continúa leyendo el siguiente canal. Guardar el valor sin escala, por lo que este umbral es 50. Tuviera que elegir un valor que era bastante grande por encima del ruido, pero no ser tan grande que los valores analógicos enviados al controlador midi están muy lejos unos de otros, dando así un sonido entrecortado. Un comando de control midi es una serie de 3 bytes. El primer byte especifica que es un comando de control que se envía. El segundo byte es el canal que se envía el comando de control. El último byte es el valor analógico. Por ejemplo, permite decir dentro de mi programa de música asignar un volumen en un determinado canal para aceptar las señales midi entrantes de canal 16. Como enciendo el potenciómetro, el controlador midi está continuamente enviando estos 3 bytes a un ritmo muy rápido. Primeros dos bytes quedan igual cada vez que estos bytes se envían pero cambiará el último valor. La idea es que quieres este valor para mover hacia arriba o hacia abajo en pequeños incrementos. Los incrementos que cambia es el valor de umbral se discutió anteriormente. Incrementar el canal por 1, después de cada ciclo, pues todos los potenciómetros están escribiendo a su propio canal midi. Este bucle es entonces continuo 7 veces más para ADC de la viruta. Sigo un lazo diferente otro 8 veces para leer los valores de la otra viruta ADC. La única diferencia entre los dos lazos es la dirección que utiliza para comunicarse con el chip y los números de canal que se están actualizando.