Paso 3: El software
He incluido el código de abajo, así como una versión resaltado de sintaxis que me resulta más fácil
para leer.
Decidí usar un temporizador para generar una interrupción cada 1mS o algo así. Esto da alrededor de 1 mil
ciclos (el compilador será guardar/restaurar registros de interrupción, por lo que hay menos de 1 mil)
entre interrupciones. Esto debe ser adecuado para cualquier razonable luz intermitente horario!
Es necesario leer las especificaciones cuidadosamente para configurar el contador de tiempo y las interrupciones. No olvide activar
interrupciones en el bucle principal. El link de especificaciones es http://www.atmel.com/dyn/resources/prod_documents/doc2543.pdf .
La primera imagen de abajo muestra los tiempos escalonadas encendido para cada LED y los ciclos de trabajo
para cada uno. Para hacer la vida simple, decidí utilizar un período de 16mS, por lo que el ciclo de trabajo puede ser
a cualquiera de lo valores n/16, con n = 1,..., 16. Una variable count_ms se incrementa cada vez
terminado la rutina de interrupción. Elegí 16 porque sólo puedo enmascarar el fondo 4 bits
de count_ms a averiguar dónde estamos en el deber de ciclo. Los datos de la estructura llevó
(véase los archivos .h abajo) indica la escalonada empezar a tiempo para cada LED y cuánto se
debe permanecer en el.
Tengo algún código adicional alternar los LEDs amarillo, por lo que a lo más un LED amarillo
es en cualquier momento. La variable slow_count alterna cada 256mS, una cuarta parte de un
en segundo lugar.
Usando la primera imagen a continuación, puede calcular el máximo y promedio actual total LED.
El promedio (incluyendo el microcontrolador) es acerca de 22mA, que da unas 4 horas
de la luz. Puesto que el máximo son sólo 42mA, no hay necesidad de un condensador a través de la
fuente de alimentación (para la eliminación de transitorios de conmutación).
Ajusté los tiempos en así que el brillo de cada LED es aproximadamente la misma. El amarillo
y LED ' s rojos tienen difusores, el LED blanco tiene una lente, que resulta algo así como
un coche real. Los LEDs blancos eran muy brillantes. Hay un parpadeo ligeramente visible (a 1000/16 Hz),
pero es tolerable y llama la atención cuando el coche se mueve.
Un alcance de varios canales hace fácil el trabajo de depuración. No sé cómo habría encontrado
mis errores lo contrario. Hay realmente un sutil error en el código, pero no importa en
es una esquina que es irrelevante. Si pulse_on_time se establece en 0, entonces la correspondiente
LED permanecerá encendido todo el tiempo! La solución es también comprobar que un LED se enciende sólo si la
valor de pulse_on_time es distinto de cero. Sin embargo, esto alarga el código innecesariamente, si usted
Quiero un tiempo de 0, solo comente LED!
Los fusibles del ATtiny2313 deben configurarse adecuadamente para seleccionar el reloj interno de 1 Mhz. la
siguiendo el enlace http://www.engbedded.com/fusecalc/ es útil para simplificar un poco confuso
revertir la lógica utilizada para la programación de fusible. El archivo fuse.txt siguiente muestra el comando que utiliza
para programar el microcontrolador.
Las instrucciones de construcción están en el archivo build.txt a continuación. (Sólo para una comprobación cordura, imprimir la
tamaño de código y el mapa variable.)