Paso 5: Software con Asamblea
El flujo de la lógica del SW para el reloj se muestra arriba. Programación se realizó enteramente en Asamblea, implementar las características de interrupción, ADCs, administración de energía, GPIO y temporizador del ATmega328P. Las razones que elegir que Asamblea para mi lenguaje de programación fue para optimizar mi programa lo mejor podía y ya mí orgullo en el trabajo más difícil, bajar los niveles para proyectos.
5.1. primer prototipo
Un sistema de desarrollo que aproximadamente emulaba el ChronosMEGA final fue construido para implementar el SW que funcionaría en el reloj. La fuente de alimentación del reloj fue creada por separado en un PCB fabricado Diseñé y fue utilizado para alimentar el circuito. Esta unidad fue luego incrustada al producto final.
A continuación se muestra un video que muestra el circuito de protoboard:
5.2. interrupciones
Hay 4 rutinas de interrupción diferentes para el ChronosMEGA: uno para la hora + y MIN + botones, uno para el sueño y botones de la pantalla, uno para el Timer2 comparar partido y el último para el Timer1 comparar partido.
El módulo del Timer2 de 8 bits está programado para contar 10ths de segundo asincrónica del sistema. Cuando cuentas un 10 de un segundo interrumpe y aumenta el 10 de un segundo valor.
Se utiliza el módulo Timer1 de 16 bits se apague en 5 segundos cuando el usuario presiona el botón de tiempo de pantalla para ver la hora. Cuando este temporizador interrumpe, se apaga la pantalla y el ChronosMEGA vuelve a su estado inactivo.
5.3. power Management y modo Sleep
Una meta grande era hacer tan eficiente como sea posible, con una batería 400mAh grande el ChronosMEGA, el reloj tiene la capacidad de durar un tiempo muy largo en una sola carga. Con el proyecto terminado, el ChronosMEGA dibuja un desinteresado 4 microamperios en su reposo y se calcula que hace 11 años con una sola carga.
La ChronosMEGA pistas todavía tiempo en esta etapa del sueño, despertándose sólo para incrementar el contador de segundos y al pulsar un botón. El reloj del sistema se detiene completamente, y sólo el módulo del Timer2 con su cristal de 32,768 kHz asíncrono sigue funcionando.
Cuando el usuario presiona el botón "Sleep", el programa establece una marca y se apaga la pantalla LED. En el bucle principal, el programa comprueba la bandera del sueño y comienza a dormir preparaciones si es 0 x 01. Abajo se encuentra el bucle principal:
Los registros de sueño se establecen antes del bucle principal para entrar en modo "Ahorro de energía" estableciendo el SM [2:0] bits en 0b011. Modo "Ahorro de energía" apaga el ATmega328P pero permite el Timer2 seguir funcionando siempre y cuando sea asincrónica. Compara partido y las interrupciones externas se despertarán el ATmega328P temporalmente, con el fin de la rutina de interrupción del servicio y volver a dormir si es necesario.
5.4. una cuestión de variación y parpadeo de LED
Después de subir el programa inicial a la ChronosMEGA, noté algunos débil parpadeo en algunos de los LEDs cuando no debían para estar. Esto me molestó y llegué a la conclusión de que debe haber algo mal con mi convenios de programación que causó el problema.
La fuente del problema fue descubierta cuando observan la pila durante simulaciones y notó que mi propósito general registros no fueron ser empujado y extraen de la pila, así despeinarte mi proceso. Esto fue solucionado presionando registros en la pila cuando se llama a una rutina de servicio de interrupción, y estallidos los registros cuando se acaba la rutina. A continuación se muestra un ejemplo de interrupción:
Cuando se llama a la función "IncSec10", la pila aparece como a continuación:
Finalizada la "IncSec10", se extraen los registros hacia atrás por la pila de restaurar su valor original.