Paso 2: Creación de prototipos y archivos!
Si desea construir el proyecto de este paso no es demasiado necesario. Voy a hablar sobre cómo funcionan el código y hardware.
Voy a pasar ahora por el código línea por línea :D
ATtiny24, 44, 84 serie sólo tiene 1 interrupción externa (INT0) [Página 48 de la hoja de datos]. Se trata de la interrupción que estamos más familiarizados con el uso de la Arduino. Puede utilizar esta interrupción simplemente diciendo "attachInterrupt()"
Mientras que sólo tenía 1 interrupción, quería tener dos botones en mi reloj: un botón para aumentar el tiempo y otro para disminuir el tiempo. Mirando hacia atrás en la hoja de datos, el ATtiny tiene dos puertos de Interrupción de cambio de Pin : PCINT0 y PCINT1 [Página 48].
La diferencia Externa interrumpe Interrumpe el cambio de Pin es que una interrupción externa tiene su propio ISR (rutina de servicio de interrupción). PCINTerrupts compartir un ISR para todos los pines en un puerto. Esto significa que con Pin cambio interrumpe podemos hacer cualquier perno ser una interrupción, pero luego tenemos que pasar por el problema de determinar qué pin causó la interrupción en el puerto.
Aquí hay dos muy buenos artículos para leer. Se trata de cómo aprendí:
- http://thewanderingengineer.com/2014/08/11/Arduino... PCINT en general
- http://thewanderingengineer.com/2014/08/11/PIN-Cha... PCINT sobre el ATtiny
Cada una de estas variables determina lo que el número se muestra en cada uno de los cuatro dígitos en la pantalla de burbujas.
Les declaré volátil porque cambiaron en las rutinas de interrupción.
Ajuste a 0 significa cuando enciendo mi reloj, la cuenta comenzará a las 00:00 (12:00 AM).
Pernos físicos 8(A5), 9(A4) y 10(A3) se utilizará con el 74HC595 shift registro.
El registro de desplazamiento permite a control los segmentos a, b, c, d, e, f, g y dp con pernos Q0, Q1, Q2, Q3, Q4, Q5, Q6 y Q7 respectivamente.
Para mostrar cada dígito, se ser multiplexado.
La burbuja es cátodo común. Esto significa que cuando el dígito es conectado a tierra o tiró para un bajo digital, la cifra se ilumina. Estaremos usando pernos de físicos 13(A0), 12(A1), 11(A2) y 7(A6) para controlar la visualización de cada dígito en la pantalla de burbujas.
Estos son algunos valores que utilizaremos a debounce los dos botones cuando la interrupción se activa. Sin contra rebotes, una pulsación puede ser registrado como cinco, y utilizando el reloj sería molesto.
Compruebe hacia fuera el Arduino ejemplos/Digital/Debounce si quieres.
Arduino puede contener variables de largo. Utilizaré las variables largo currentMillis y lastMillis leer millis(); Después de 49 días, el valor de millis() conseguirá demasiado grande para el microcontrolador y el desbordamiento a 0.
Esto es algo malo si estoy comparando currentMillis y lastMillis a debounce y el valor de currentMillis se convierte en 0. Voy a explicar un poco más adelante.
Inicialización de algunas cosas. secTime es el contador de segundos y tictoc determina si el punto o no cada segundo.
En la función de configuración, yo declarando los pernos de registro cambio y multiplexación pines como salidas
La siguiente es cómo inicializar la interrumpe el cambio de Pin.
CLI(); es una función que debemos llamar para desactivar las interrupciones.
GIMSK es el Registro General de interrumpir la máscara, un registro sobre el ATtiny. Revisa la hoja de datos para mirar lo que hace cada bit del registro GIMSK en la página 51.
0b00110000 activa los bits 4 y 5 en el registro, que encienda PCIE0 y PCIE1. PCIE0 permite interrumpe el cambio de Pin del puerto que tiene pernos de 0 a 7. PCIE1 permite interrumpe el cambio de Pin por la parte que tiene los pines 8 y 11.
PCMSK0 es el Pin cambio habilitar máscara para los pernos de 0 a 7. Se activa de PCIE0. Quiero habilitar una interrupción en PCINT7 o A7 en el ATtiny44.
Para ello activar bit 7: 0b10000000 [Página 53]
PCMSK1 es igual a PCMSK0 excepto los pines 8 y 11. Se activa de PCIE1. Quiero habilitar una interrupción en PCINT10, o pin 8.
Para ello, habilitar el bit 2: 0b00000100 [Página 52]
SEI(); activa las interrupciones.
Display() es una función que voy a explicar en el siguiente paso. Lo hace solo lo que piensa que lo hace.
El soporte de código cambia básicamente el punto en pantalla 2 siempre en segundo lugar para simular tics y TOC.
Básicamente, cada 1000 milisegundos, el código comprueba si el tictoc es 1 o 0. Si es 0, el punto se enciende y tictoc se establece en 1. Si es 1, se desactiva el punto y establece tictoc a 0.
los + 10 y -10 harán sentido después
En este soporte es también un incremento de secTime, que cuenta cuántos segundos han pasado.
Si secTime alcanza 60, aumentamos dig4 (minutos)
Lo siguiente si lazos básicamente determinan cuándo se desborda el dígito y debe ser reajustado. Por ejemplo, si tenemos 9 en dig4, el siguiente debe ser 0 y dig2 debe ser incrementado en 1.
Si dig1 (decenas de horas) es 2 y dig2 (horas unos) es 4, reajustar el reloj a las 00.
{ISR(PCINT0_vect)} es la rutina de interrupción que se ejecuta cuando se activa PCINT0 por pin A7.
Esta función ajusta básicamente secTime 0 y dig4 decrementos de 1.
El siguiente si lazos básicamente manejar desbordamiento.
La función entera es envuelto por un if debouncing lazo.
{ISR(PCINT1_vect)} es la rutina de interrupción que se ejecuta cuando se activa PCINT1 por pin 8.
Esto básicamente hace lo mismo que la otra interrupción salvo incremento en lugar de disminuir.
Esto es lo que está pasando en el bosquejo de WATCHG.ino. Para mantenerse organizado, hice otro dibujo ShiftDatas.ino algunas variables y funciones. En el siguiente paso va pasar.