La ChromoDisk (7 / 8 paso)

Paso 7: Un paseo por el código

Uno de los puntos del diseño de este dispositivo era hacer "hackeable".  Que he proporcionado el código fuente para que tanto puede aprender cómo estas cosas se programan y también para modificarlo como quieras.  Si eres como yo, resulta difícil leer el código de otra persona, independientemente del idioma.  Lenguaje ensamblador es quizás un poco más difícil, pero es rápido y usted tiene control completo.

El código se estructura en un nivel alto en parámetros, el código y datos.  la sección de parámetros está destinada a traer a todos los contactos claves que afectan el funcionan de los modos de color en la parte superior donde usted fácilmente puede modificarlas sin bucear en el código.  La primera parte de la sección de parámetro adapta el código en el hardware y, aunque le invitamos a diseñar su propio tablero como lo hice, voy a suponer que usted desea utilizar para esta placa y cualquier cambio de uno de los modos que ya hay, o escribir tu propia.  Así que saltar a:

.equ initialMode = 4
maxModes .equ = 6

La primera ecuación establece el modo de que la ChromoDisk salta a cuando primero encendido o cuando presiona el botón de Reset.  Modo 4 es el modo de color de ondulación.  La siguiente ecuación es sólo el número de modos de ejecución en el código.  Recuerde que debe cambiar si se añade un modo de su propio diseño.

El resto de las EQUs son específicos para cada modo.  Al principio quería escribir un programa genérico que me permitió generar nuevos modos sólo cambiando unos parámetros.  No averiguar una manera de hacerlo, por lo que cada modo tiene su propia sección de código especial que veremos más adelante.  He siempre comentarios que espero sean bastante fáciles de entender, una vez que sabes cómo funciona el modo.

Verás que hay ecuaciones aritméticas en algunos de los EQUs.  Hay dos cosas que recordar aquí y en todo el código: el microcontrolador es un número entero, y sabe dos formas básicas de trabajar con números.  Si usted escribe una ecuación que resulta en un número con una fracción, que va a ser truncada.  No esperes 2/3 para darle 0.666667.  Le dará 0.  Esto puede parecer obvio, pero en algún momento te vas a olvidar y me pregunto por qué algún trozo de código no está funcionando bien.  Con respecto a los sistemas de numeración: se puede interpretar que un número de 8 bits como un número absoluto (0-255) o como un entero con signo (0 - 127 y -128-1).  Yo lo sé bien, y aún todavía a veces sale disparado para arriba en él.  Una cuestión aún más sutil es que el procesador tratará a un entero como absoluta o firmado dependiendo sobre qué instrucción se utiliza.  Ramificación es un gran ejemplo.  Que se puede esperar que si lees el temporizador y conseguir 132, eso si en comparación con 120 con 132 y rama inferior, BRLT (rama si más), tomaría el poder.  No tan rápido.  BRLT asume que los números están firmados, 132 es realmente -125.  Para números sin signo, como en este caso, necesitará usar BRLO (rama si es inferior).  Téngalo en cuenta al leer el código.

La sección ejecutable comienza con la declaración de .cseg.  El código contiene, en orden:
-la interrupción vectores de ese punto a las rutinas de servicio de interrupción (ISRs)
-el código de inicialización, ejecutado después de un reset
-el código principal
-el código de inicialización para cada modo de
-los ISRs
-el área de datos, que comienza con .dseg

No quiero hacerlo demasiado largo, así que voy a intentar resumir.  El programa es totalmente impulsado por la interrupción, así que todo lo que sucede en las rutinas de servicio de interrupción.  El código principal sólo pone el procesador a dormir.  Despierta cuando se presiona el botón Mode, o cuando un temporizador de tiempo.  Contador de tiempo 0 se utiliza para debounce el conmutador de modo.  Temporizador 1 se utiliza para hacer los colores cambiar utilizando una sola línea de control PWM y el color encendido/apagado salidas.

El interruptor de modo ilustra el hardware / intercambio de software mencionado anteriormente.  Contactos del interruptor rebotan cuando presionas, así que tienes que ser capaz de manejar una serie de pulsos cortos, en lugar de sólo una entrada de alta o baja.  Terminé haciendo esto en software porque no pude encontrar una manera fácil de hacer con el espacio y el hardware que tenía.  Básicamente, el interruptor de modo restablece el temporizador 0.  Si temporizador 0 el tiempo de espera antes de que se consigue restablecer, el código asume que los contactos han dejado rebotando y actuar con el código.  Esto es un hack y tienes que escoger con cuidado el valor de tiempo de espera.  Verás que el dispositivo salta a veces un modo, por lo que el ajuste del temporizador no es perfecto.  Es una relación inversa entre tiempo de respuesta al presionar el botón y con qué frecuencia salta un modo.

Si quieres ver cómo se implementa cada modo, mirar el temporizador 1 ISR.  Hay una variable en memoria que guarda la pista de modo que está en.  El ISR se ve en ese número y salta a la parte derecha del código, tipo de como una declaración de caso o el interruptor.  Cada modo necesita hacer un seguimiento de su propio estado, almacenado en la memoria RAM, como el color que está en.  Mayoría de los modos gire en el rojo, luego verde luego el azul y de nuevo a rojo.  En general, ellos no todos se enciende al mismo tiempo porque solo hay una salida PWM controla todo y la anchura depende de la luminosidad del color que está en.

Así es un resumen rápido, sin necesidad de escribir un libro.  Traeré intentar responder preguntas más detalladas si registrarlas.   ¡Que te diviertas!

Artículos Relacionados