Paso 4: Software
El código fuente en el 12F609 es realmente complicado. Estoy usando siempre última posición de memoria! Los 64 bytes se han consumido por mi código. Tengo una friolera 32 bytes de izquierda flash encima como de repuesto. Por lo tanto, estoy usando 100% del RAM y el 97% de la flash. Sin embargo, es increíble cuánta funcionalidad tienes que complejidad.
Comunicación a cada lámpara se archiva mediante el envío de paquetes de datos de 8 bytes. Cada paquete de datos termina con una suma de comprobación - así que en realidad, hay siete bytes de datos además de una suma de comprobación final. A 9600 baudios, un paquete de datos tarda unos 8 milisegundos en llegar.
El truco está en multitarea mientras que llega el paquete de bytes. Si alguno de los LED se activa con una señal PWM, la salida PWM debe ser mantener actualizados incluso mientras recibe bytes de paquete nuevo. Ese es el truco. Me llevó semanas y semanas para arreglar esto. Pasé una gran cantidad de tiempo trabajando con mi LSA Logiport tratando de seguir cada bit. Esto es parte del código más complicado que nunca he escrito. Es porque el micro es tan limitado. En micros que son más de gran alcance es fácil escribir código fácil flojo y el rápido micro rip a través de él sin quejarse. Con el 12F609, cualquier código suelto con costarle un montón. El micro código está escrito en C excepto la rutina de servicio de interrupción.
Por qué tienen tales usted puede pedir los paquetes de datos grandes. Bueno, porque queremos tener la rampa LED arriba y abajo en su propio acuerdo. Una vez que se carga un perfil de rampa, el LED puede ir y comenzar incrementando incluso mientras se reciben nuevos comandos para el otro LED. Cada lámpara tiene que recibir y decodificar todos tráfico de paquetes de datos incluso si el paquete no es para él.
Un perfil LED consiste en un nivel de inicio, comienzo habitan tiempo, rampa, tiempo de detención superior, nivel superior, rampa de bajada tasa, de nivel inferior. Ver la figura adjunta. Wow, eso es mucho para un LED. Ahora, multiplicar eso por el número de LEDs. Se convierte en demasiado - podría solamente hacer un seguimiento de tres LEDs con perfiles de rampa completo. La cuarta (LED blanco en el tablero de dev) sólo tiene rampa de capacidad. Es un compromiso. Echar un vistazo a la foto adjunta de un perfil de rampa.
La señal PWM se genera un temporizador que se ejecuta en 64uS por garrapatas. El temporizador de 8 bits se vuelca cada 16.38mS. Esto significa que la señal PWM está funcionando en 61.04 Hz. Esto no es bueno para tocar video! Por lo tanto, utilicé un truco de software y saltó un par de cuentas adicionales en el controlador estirar a 60Hz. Esto hace tapping video mirar mucho mucho mejor.
En cada vuelco del temporizador PWM (16.67mS) actualizar los perfiles de la rampa. Por lo tanto, cada señal de rampa/dwell es 1/60 de segundo, o 60Hz. El segmento más largo de perfil (mediante una cuenta de 255) lo últimos segundos 4,25 y el más corto (usando una cuenta de 1) dura 17ms. Esto da una gama agradable para trabajar dentro. Echar un vistazo a la foto adjunta desde el analizador de lógica. Para ver el detalle en la foto, abrir el pic en el modo de alta resolución. Esto toma un par de clics adicionales en el sitio web instructable. También hay un dibujo de un perfil que se muestra a continuación.
Documentación del Protocolo de comando está en mi lista de todo. Planeo escribir un hoja de datos tipo de documento a describir para protocolo completamente. He empezado una hoja de datos para el chip - una versión preliminar en mi sitio web ahora.