Tabla de contenido:

Reutilización de pines de interfaz ATtiny84 / 85 SPI: 6 pasos
Reutilización de pines de interfaz ATtiny84 / 85 SPI: 6 pasos

Video: Reutilización de pines de interfaz ATtiny84 / 85 SPI: 6 pasos

Video: Reutilización de pines de interfaz ATtiny84 / 85 SPI: 6 pasos
Video: Programador para ATtiny85 con Arduino 2024, Mes de julio
Anonim
Reutilización de pines de interfaz ATtiny84 / 85 SPI
Reutilización de pines de interfaz ATtiny84 / 85 SPI

Este instructable es un seguimiento del instructable "Depuración en circuito ATtiny84 / 85 con salida serial" y extiende esa configuración de hardware y software para abordar el problema de la reutilización de los pines de descarga de programación por parte del programa de aplicación. En total, entre este y el instructable de la parte 1, se discuten / demuestran los siguientes temas:

Tema ATtiny84 ATtiny85
Comunicación serial usando la clase SoftwareSerial X X
Compartir los pines del dispositivo entre la aplicación y la descarga X X
Interrupción de cambio de pin X
Interrupción externa X
Dormir en modo POWER_DOWN; despertar al interrumpir X
Solución alternativa para el error de enlace de vector de interrupción "definido de forma múltiple" relacionado con SoftwareSerial X
Modificación, descarga, depuración,… ciclo de desarrollo en circuito para los dispositivos ATtiny X X

Agregar un componente de E / S de hardware a uno de los pines dedicados a la interfaz de programación SPI a veces está bien, a veces no. Por ejemplo, agregar un LED a MISO solo hace que el LED parpadee durante la descarga y luego está disponible para la aplicación. Sin embargo, agregar un zumbador piezoeléctrico a MISO resultará en un chirrido horrible seguido de una falla en la descarga.

Este instructivo explica cómo usar un multiplexor 4x2: 1 para "recuperar" el uso de los pines asignados a las señales MISO, MOSI y SCK de la interfaz SPI protegiéndolos durante la descarga. La reutilización del pin RESET requiere un cambio de fusible y no está cubierto por este enfoque. La asignación dual de los pines se logra usando el multiplexor para cambiar entre la aplicación y las entradas de programación dependiendo de si la descarga está en curso. Se incluyen código y esquemas tanto para ATtiny84 como para ATtiny85. La configuración de ATiny84 se aborda en primer lugar, ya que tiene dos puertos de E / S y se puede utilizar para ilustrar algunos problemas / soluciones adicionales. Después de la discusión de tiny84, se discuten los mismos escenarios para el ATtiny85.

Paso 1: hardware necesario

Imagen
Imagen

La mayor parte del hardware requerido se enumeró en el instructable de la parte 1, por lo que solo el nuevo hardware se enumera a continuación.

Nombre Posible fuente ¿Cómo se usa?
Multiplexor 4x2: 1 Mouser Contiene cuatro interruptores de 2 entradas y 1 salida que son el mecanismo por el cual se comparten las señales de la interfaz SPI y las E / S de la aplicación.
Interruptor unipolar Cualquier tipo de interruptor (momentáneo o bloqueado) funcionará. El interruptor se utiliza para ilustrar el uso compartido de pines para una entrada de aplicación.
Resistencia de 10K Resistencia pull-down para el interruptor SPST para evitar una entrada flotante
Imagen
Imagen
Imagen
Imagen

El multiplexor es la clave para aislar el uso de descarga de pines del uso de aplicaciones. La funcionalidad general del multiplexor 4x2: 1 es bastante sencilla y consta de 2 señales de control y 4 interruptores que funcionan de manera idéntica. El comportamiento de cada pin del multiplexor se analiza a continuación:

Alfiler Nombre Función
15 GRAMO Como se indica en la tabla de verdad, el multiplexor solo funciona cuando el pin de habilitación G está bajo. Como nunca queremos deshabilitar totalmente el multiplexor, el pin 15 se conectará directamente a tierra.
2-4; 5-7; 9-11;12-14 A (entrada), B (entrada), Y (salida) Hay cuatro de 2 entradas; Interruptores de 1 salida con cada grupo de 3 pines numerados consecutivamente en el orden A (entrada), B (entrada), Y (salida) p. Ej. para el interruptor 1; pin 2 = 1A; pin 3 = 1B; pin 4 = 1Y.
1 Seleccione Cuando la selección es baja, la entrada del interruptor A se conecta al pin de salida del interruptor asociado, Y. Cuando la selección es alta, la entrada del interruptor B se conecta a la salida en su lugar. Los interruptores son controlados simultáneamente por la señal de selección y funcionan de manera idéntica.
8 GND tierra del IC del multiplexor
16 VCC potencia IC del multiplexor

Paso 2: descripción general de los casos de prueba

Imagen
Imagen
Imagen
Imagen

Los dos escenarios para la reutilización de pines se basan en si el pin es una entrada o salida de la aplicación. El procedimiento para manejar cualquier entrada es siempre el mismo; Además, el procedimiento para las salidas de la aplicación es idéntico independientemente del componente de hardware. Aun así, la explicación es más fácil y, con suerte, más clara, si se dan ejemplos específicos. Los diseños minimalistas para los dos casos se muestran arriba. Para las configuraciones detalladas más adelante, las conexiones se convierten en un nido de ardillas, por lo que podría ser útil consultar estos diagramas más limpios.

RESET es la elección perfecta para la señal de selección del multiplexor, ya que es baja durante la descarga, pero vuelve a ser alta cuando se completa la descarga. Tenga en cuenta que cualquiera de los conmutadores multiplexores se puede utilizar en cualquier caso, ya que todos los conmutadores se comportan de forma idéntica. Además, ninguno de los ejemplos es "realista"; En cambio, fueron elegidos como la forma más sencilla de ilustrar las técnicas de aislamiento.

  1. Caja de salida: la salida LED del pin 4 de ATtiny84 (SCK) se aísla mediante el interruptor multiplexor 2

    • conecte el pin 2A del multiplexor a tierra
    • conecte la clavija 2B del multiplexor a la clavija 4 de ATtiny85
    • conecte la salida 2Y al ánodo LED

      • Resultados previstos:

        • El LED está apagado durante la descarga desde que está conectado a 2A, tierra
        • LED conectado al pin de salida de la aplicación 4 después de la descarga a través de 2B y comienza a parpadear
  2. Caso de entrada: La entrada del interruptor SPST al pin 6 de ATtiny84 (MOSI) se aísla mediante el interruptor multiplexor 3

    • El cable MOSI del cabezal del programador AVR se mueve a 3A
    • La entrada del interruptor 3B está conectada a la salida SPST
    • la salida 3Y está conectada al pin 6 de ATtiny84

      • 3A, MOSI, está conectado al pin 6 durante la descarga
      • 3B, salida SPST, se conecta al pin 6 después de la descarga

El caso 1 tiene éxito si el LED no parpadea durante la descarga del programa y luego parpadea cada dos segundos después de la descarga como se esperaba bajo el control del programa. Sin aislamiento, el LED parpadearía durante la descarga, ya que está conectado directamente a la señal SCK, que cambia de estado a la recepción / transmisión de datos del reloj.

El caso 2 tiene éxito si la señal MOSI se envía al ATtiny84 durante la descarga, es decir, la descarga no falla y el LED responde al encendido / apagado del SPST después de la descarga. El caso 2 evita un error de descarga poco probable. Sin aislamiento, el interruptor unipolar causará fallas si 1) se usa un interruptor enganchado y 2) el interruptor se deja en la posición de encendido durante la descarga. Cuando está aislado por el multiplexor, el conmutador no puede causar fallas en la descarga bajo ninguna circunstancia. Un poco exagerado pero reconfortante para nosotros los viejos.

Una consecuencia del uso del multiplexor es que el componente de hardware ya no se puede conectar directamente al pin de E / S del microcontrolador. Esto es algo inconveniente, pero permite que el componente permanezca en la placa durante la prueba junto con el otro hardware de la aplicación, y se puede mover de nuevo a su ubicación correcta cuando se completa la prueba.

Paso 3: ATtiny84 Caso 1 - Aislar la salida de la aplicación

Imagen
Imagen

Este paso describe la configuración para compartir un pin de salida de la aplicación con una señal de descarga. El ejemplo utilizado es el LED adjunto al pin 4 (SCK). El uso del LED existente como ejemplo permite enfatizar la adición del multiplexor al entorno de hardware y software de la parte 1.

  • Hardware

    • Agregue el multiplexor a la placa en la ubicación relativa que se muestra en el diagrama de fritzing de arriba. El multiplexor se coloca hacia el centro para dejar espacio para el interruptor SPST necesario en el Caso 2.
    • Extienda la señal RESET al multiplexor agregando un cable conductor (sugiera amarillo) desde el pin 11 de ATtiny84 al pin 1 del multiplexor.
    • La configuración de hardware restante es como se indica en el Paso 2

      • conecte el pin 2A del multiplexor directamente a tierra
      • conecte el pin 2B al pin 4 de ATtiny84
      • conecte la salida 2Y al ánodo LED

        • Resultados previstos:

          • durante la descarga 2Y está conectado a tierra (2A) por lo que el LED permanece apagado
          • Después de la descarga, 2Y se conecta al pin 4 de ATtiny84 - control de LED de aplicación
  • Software

    • El código de la parte 1 se reutiliza; disponible en la parte 1 instructable en lugar de duplicar aquí
    • Cargue y compile el programa de la parte 1 en el IDE de Arduino
    • Conecte el programador Tiny AVR a un puerto USB de la PC
    • Conecte el cable Adafruit USB a serie a un segundo puerto USB

      • Se crea un puerto COM y está disponible automáticamente en la lista de puertos IDE
      • Inicie la ventana COM
    • Descargue el código compilado al ATtiny84

Los resultados del programa de aplicación son los mismos que para la parte 1, ya que el único cambio fue mover el LED a una ubicación "protegida": el LED parpadea a intervalos de 2 segundos; la salida en serie es la misma. La única diferencia que debería ocurrir es que el LED ya no parpadea durante la descarga ya que, durante ese tiempo, está conectado a tierra a través del pin 2A del multiplexor.

Imagen
Imagen

Paso 4: ATtiny84 Caso 2 - Aislar la entrada de la aplicación

Imagen
Imagen

Este paso se basa en la configuración del caso de aislamiento de salida anterior. Los cambios de hardware consisten en conectar un interruptor SPST al pin 6 de ATtiny84 (MOSI) a través del multiplexor. Por lo tanto, los cambios de hardware son mínimos, pero hay varios cambios de software para permitir que el interruptor SPST controle el LED mediante una interrupción de cambio de pin. El código actualizado se incluye al final de esta sección. El código debe copiarse en el IDE de Arduino; sugiero guardarlo con el nombre Multiplexer_Input. (Pido disculpas por la extensión de esta sección, pero es el corazón del propósito del instructable y creo que se lee mejor como un monolito en lugar de insertar descansos artificiales).

Actualizar Localización Objetivo
incluir la clase SoftwareSerial "pirateada" incluir sección El LED ahora está controlado por el interruptor SPST a través de una interrupción de cambio de pin. La clase SoftwareSerial debe modificarse ya que, de lo contrario, asigna TODOS los vectores de interrupción de cambio de pin. Esto provoca un error de enlace de "definición múltiple" para el vector (puerto 0) asignado al conmutador SPST. La versión de SoftwareSerial pirateada debe colocarse en el mismo directorio que el programa para que afecte solo a esta aplicación.
Definición de pin de entrada SPST incluir / sección de definición asignación de entrada SPST a un pin de dispositivo. El pin es específico del dispositivo, por lo que se agrega a las secciones #ifdef ATtiny8x.
Modo pin de entrada SPST función de configuración El pin SPST está configurado como ENTRADA
Configurar la interrupción del pin SPST función de configuración El vector de interrupción se asigna al pin de entrada SPST para que un cambio de estado del interruptor provoque una interrupción. Los registros de configuración y el tipo de interrupción son específicos del dispositivo. Para que el código sea lo más sencillo posible, las diferencias se manejan dentro de una sección #if definida
Configurar mensaje de serie completo función de configuración El mensaje de configuración de salida en serie completa se cambia para reflejar la aplicación de entrada del multiplexor
Agregar función ISR del interruptor SPST sección de código Se agrega el ISR para la interrupción de cambio de pin SPST. El código es común, pero el vector utilizado es específico del dispositivo y se define en las secciones dependientes del dispositivo en la parte superior del programa. Para verificar que el ISR está activado, se cambia el estado del LED. Aunque es un no-no en una aplicación real, se genera un mensaje de salida en serie que refleja el nuevo estado del LED.
Modificar el procesamiento de bucle función de bucle El ISR ahora controla el encendido y apagado del LED para eliminar la funcionalidad de la rutina de bucle. Se agrega una llamada a la rutina de sueño para ATtiny84 como una especie de "extra". Para esta aplicación, ATtiny85 sleep no funciona; tal vez debido a la interferencia de la clase Software Serial, ya que funciona con SoftwareSerial eliminado.
Agrega una rutina de sueño sección de código La funcionalidad de suspensión no es necesaria para demostrar el uso del multiplexor. Se acaba de agregar porque normalmente querría esperar una entrada en el modo POWER_DOWN para ahorrar energía en lugar de continuar corriendo a través del ciclo del programa sin hacer nada hasta que se produzca una entrada.

Modificar el código de clase SoftwareSerial

La clase SoftwareSerial debe cambiarse para que no acabe con todos los puertos de interrupción de cambio de pines. El código de clase SoftwareSerial se encuentra en

C: / Archivos de programa (x86) Arduino / hardware / arduino / avr / libraries / SoftwareSerial / src

Haga una búsqueda en PCINT0_vect en SoftwareSerial.cpp para encontrar la ubicación de inicio para los cambios de código. Agregue el siguiente código inmediatamente antes de la declaración #if definida (PCINT0_vect) existente.

#si está definido (_ AVR_ATtiny84_)

#define MYPORT PCINT1_vect #elif defined (_ AVR_ATtiny85_) #define MYPORT PCINT0_vect #endif ISR (MYPORT) {SoftwareSerial:: handle_interrupt (); }

Ahora comente el bloque de código existente que asigna los vectores de interrupción del puerto como se indica a continuación (solo agregue los símbolos de comentario de bloque de inicio y finalización / * y * /):

/*

#si está definido (PCINT0_vect) ISR (PCINT0_vect) {SoftwareSerial:: handle_interrupt (); } #endif #if definido (PCINT1_vect) ISR (PCINT1_vect) {// SoftwareSerial:: handle_interrupt (); ISR (PCINT1_vect, ISR_ALIASOF (PCINT0_vect)); } #endif #if definido (PCINT2_vect) ISR (PCINT2_vect, ISR_ALIASOF (PCINT0_vect)); #endif #if definido (PCINT3_vect) ISR (PCINT3_vect, ISR_ALIASOF (PCINT0_vect)); #terminara si */

Configurar el hardware

El interruptor SPST está conectado al pin 6 de ATtiny84 (MOSI) como se describe en el Paso 2. El procedimiento se duplica aquí para mayor comodidad.

  • conecte la entrada del interruptor 3A al cable MOSI del encabezado del programador Tiny AVR
  • conecte 3B a la clavija de salida ON del interruptor SPST
  • conecte 3Y a ATtiny84 pin 6

    • RESULTADOS:

      • 3A, MOSI, se conectará al pin 6 de ATtiny84 durante la descarga
      • 3B, salida SPST, se conectará al pin 6 después de la descarga

Ejecuta el programa

Antes de correr, coloque el interruptor SPST en la posición de apagado. De lo contrario, el LED se encenderá cuando se apague el interruptor y viceversa. Siga el procedimiento del paso 3 para cargar, compilar y descargar el programa de entrada de la aplicación utilizando el IDE de Arduino. Como antes, el LED no debería parpadear durante la descarga, por lo que la única indicación de que el programa está en funcionamiento será el mensaje en serie al final de la rutina de configuración: CONFIGURACIÓN completa - Ejemplo de entrada

En este punto, el programa está esperando una entrada del interruptor SPST. Colocar el interruptor en la posición ON hará que el LED se encienda; volver a la posición de apagado apaga el LED. Los mensajes de salida verifican que se invocó el ISR (ISR: Led HIGH, ISR: Led LOW). Observe que el orden de los mensajes seriales es IR A DORMIR primero esperando un cambio de estado del interruptor; cuando se obtiene una entrada de conmutador, se invoca el ISR, conmuta el LED y documenta el cambio; luego, el procesamiento se reanuda después de la llamada de suspensión, ya que la interrupción despierta el procesador.

Imagen
Imagen

PROGRAMA PARA ESTE INSTRUCTABLE:

//************************************************************************

// PARTE 2: Uso compartido de pines de dispositivo de descarga / aplicación //. Modifica el código de la Parte 1 para admitir la reutilización de aplicaciones de los pines // asignados a la interfaz de programación SPI //. Código "Comon" para ATtiny85 y ATtiny84 // ************************************* ******************************** #include "SoftwareSerial.h" // Modified Arduino SoftwareSerial class #include // While el código de procesamiento es común, los pines utilizados son específicos del dispositivo #si está definido (_ AVR_ATtiny84_) || definido (_ AVR_ATtiny84A_) #define ledPin 4 // Activado / desactivado para encender el LED conectado #define rxPin 9 // Pin usado para recepción serial #define txPin 10 // Pin usado para transmisión serial #define SpstPin 6 // Entrada desde el interruptor SPST (MOSI) #define ISR_VECT PCINT0_vect // vector de interrupción de cambio de pin del interruptor SPST #elif definido (_ AVR_ATtiny85_) #define ledPin 1 #define rxPin 4 #define txPin 3 #define SpstPin 2 // Input from SPST switch (INT0) #define // Interruptor SPST Vector de interrupción de cambio de pin #else #error Solo ATiny84 y ATtiny85 son compatibles con este proyecto #endif // Cree una instancia de la clase Software Serial especificando qué dispositivo // pines se utilizarán para recibir y transmitir SoftwareSerial mySerial (rxPin, txPin); // ------------------------------------------------ ------------------------ // Inicializar recursos de procesamiento // ------------------- -------------------------------------------------- --- configuración vacía () {mySerial.begin (9600); // Inicio del retardo de procesamiento en serie (2000); // Dar tiempo al puerto de comunicación serie para completar el inicio. // de lo contrario, es probable que falte la primera salida o que esté distorsionada pinMode (ledPin, OUTPUT); // Configurar el pin led para OUTPUT pinMode (SpstPin, INPUT); // Configure el pin del interruptor SPST como INPUT # si está definido (_ AVR_ATtiny84_) || (_AVR_ATtiny84A_) // configura la interrupción de cambio de pin para manejar la entrada del interruptor en el pin 6 (MOSI) GIMSK | = (1 <

Paso 5: ATtiny85 Caso 1 - Aislar la salida de la aplicación

Imagen
Imagen

En lugar de construir una configuración de hardware duplicada para el ATtiny85, probablemente sea más fácil comenzar con la configuración terminada para ATtiny84 del Paso 4 y reemplazar el chip tiny84 con el tiny85. Todo el hardware necesario ya está disponible. Si utiliza este enfoque, ubique el tiny85 de modo que los pines 3 y 4 se alineen con el cable serie tx y los cables de recepción. Entonces es solo cuestión de reubicar los cables conductores de la interfaz SPI para que coincidan con las ubicaciones requeridas para el ATtiny85.

Si comienza desde cero, simplemente siga los pasos generales del Paso 3 y el diagrama de fritz de arriba. El código es el mismo que se usó para el ATtiny84 en el Paso 3 con los mismos resultados esperados: sin parpadeo durante la descarga; cuando se ejecuta, el LED parpadea a intervalos de 2 segundos y los mensajes de salida en serie siguen el estado del LED.

Imagen
Imagen

Paso 6: ATtiny85 Caso 2 - Aislar la entrada de la aplicación

Imagen
Imagen

Para la configuración del hardware, comience con la configuración del Paso 5 y agregue el interruptor SPST como se indica en el diagrama de fritzing anterior. De hecho, utilicé un interruptor momentáneo para la versión tiny85 y hace que la verificación sea un poco más fácil. Observe que la salida del interruptor se gira 180 grados desde la configuración ATtiny84. Este cambio facilita el enrutamiento de los cables de conexión, ya que las 3 señales SPI están en el mismo lado para el ATtiny85.

Use el mismo programa que para ATtiny84 Paso 4. Se esperan los mismos resultados generales: el LED cambia de estado cuando el interruptor SPST se enciende / apaga y los mensajes de salida en serie documentan los cambios. Faltan los mensajes GO TO SLEEP ya que la función de suspensión no se invoca para el ATtiny85. Aunque se utiliza el mismo programa, existen diferencias significativas en la implementación para tener en cuenta el hecho de que el ATtiny85 tiene un solo registro de puerto (Puerto 0):

  1. SoftwareSerial ahora asigna la interrupción de cambio de pin del puerto 0 para la comunicación en serie (recuerde que pudimos usar el puerto 1 para el ATtiny84).
  2. La interrupción del interruptor SPST debe implementarse con la interrupción externa 0 (INT0) ya que SoftwareSerial asigna la única interrupción de cambio de pin. Esto ilustra el punto de que las interrupciones de cambio de pin y las interrupciones externas son lógicamente independientes y pueden usarse dentro del mismo registro de puerto.
  3. No se gana nada con el uso de una versión de SoftwareSerial modificada: solo hay un puerto y la clase SoftwareSerial lo tomará. Sin embargo, la clase modificada todavía se usó solo para evitar un cambio no relacionado directamente con el objetivo de este paso.

Recomendado: