Paso 2: Software
Los fusibles del ATtiny2313 deben configurarse adecuadamente para seleccionar el reloj interno de 1Mhz. El siguiente enlace www.engbedded.com/fusecalc es útil para simplificar la lógica inversa ligeramente confusa utilizada para programación de fusible. El archivo fuse.txt siguiente muestra el comando que utilizó para programar los fusibles.
Otra cosa es que los puertos de programación flashes se superponen a PORTB, que tal vez necesite desconectar los LEDs mientras programa el ATtiny2313. Las instrucciones de construcción están en el archivo build.txt a continuación. (Sólo como una comprobación de cordura, imprimir los tamaños de código y el mapa variable.)
Usé un alcance de varios canales para la depuración. Habría sido difícil para mí encontrar algunos de los 'errores' de lo contrario. Me tomó un tiempo para averiguar que el efecto estroboscópico LED interfería con la conversión. Para depurar este tema, que sospeche fue relacionadas con las interrupciones, utilicé el puerto sin usar de PORTD y ponerlo en el inicio de la interrupción y es justo antes del final. El problema era que mientras que era fácil de leer y entender, tomó sobre 500μS para ejecutar el código del efecto estroboscópico en la rutina de servicio de interrupción. Reescribió el código por lo que tuvo pocas líneas (pero más complicado y menos comprensible), y esto se convirtió en menos de un problema. También decidió deshabilitar las interrupciones de efecto estroboscópico durante la conversión.
La configuración es sencilla, timer1 se utiliza para provocar la interrupción del efecto estroboscópico (1000 ciclos a 1Mhz). El comparador se activa para activar un temporizador de captura en un flanco ascendente. Todos los bits del PORTB y PORTD son tri-indicó inicialmente. Las unidades de LED (6 pedacitos en PORTB, 4 en PORTD) están habilitadas. Los puertos de conducción las resistencias de carga y descarga se establecen en alta y baja respectivamente. El condensador se descarga, luego se habilitan las interrupciones. Esto es seguido por un bucle infinito de las conversiones que siguieron mostrando el resultado.
El efecto estroboscópico LED es conceptualmente simple, pero un poco complicado por el hecho de la los bits están divididos en dos puertos. El efecto estroboscópico funciona en un ciclo de 10 ms. En el primer ciclo, LED0 y LED1 están activados, en el próximo ciclo, LED1 y LED2 se activan y así sucesivamente, hasta que el último ciclo en el cual LED9 y LED0 están habilitados. Las máscaras permiten se almacenan en un arreglo estático previamente computada display_mask_B y display_mask_D y los ciclos de rutina de interrupción a través de cada una de las 10 máscaras.
La conversión ADC funciona deshabilitando la interrupción del timer1, carga el condensador (y el tiempo de inicio que es el valor de timer1) hasta la salida del comparador. Entonces el condensador se descarga para 5 * R_DIS * C_CHR que se trata de 60μS. Se mide el tiempo tomado para la conversión por la interrupción de captura del timer1 (provocada por un flanco ascendente en la salida del comparador). La interrupción del timer1 está habilitada y la diferencia de tiempo calcula. El cálculo es sencillo, ya que la conversión tarda menos de 1mS. (Recuerde que el contador envuelve cada 1000 garrapatas).
Inicialmente traté de calibrar la salida de medición y cálculo, pero comenzó a complicarse demasiado, así que decidí mostrar temporalmente el resultado usando una rutina de debug_led_value (que muestra el valor de 10 bits binario, mantenga la pantalla por un segundo) y jugar con ciertos parásitos atmosféricos. Esto le dio una gama (subjetiva) de tiempos de garrapatas 136-351. Luego escribió algunos código de ramificación para asignar este rango en un número entre 0 y 10 y utiliza esto para mostrar las barras. Esto trabajó satisfactoriamente. (Calibrado el dispositivo antes de ensamblar, ya que esto involucra volver a grabar el ATtiny2313.)