2020/06/06

Compartiendo el zócalo para programar ATMega328p y ATtiny85


En el marco de necesitar programar un ATtiny85 con usbasp, como ya tengo armado el circuito para ATMega328p, quiero aprovecharlo y programar ambos con el mismo. Como siempre, puedo buscar en Internet como se hace, pero para aprender no me sirve, así que a arremangarse...



Por si no sabés, los arduinos normalmente se suelen programar con el chip en la placa, aprovechando la conexión serial existente y utilizando un pequeñísimo programa que se encarga.

Cuando tenés el chip pelado y/o lo podés sacar de la placa, prescindís del programa y utilizás una interfaz llamada Serial Programming Interface. Para comunicarte con ésta, necesitas algo que entienda SPI por un lado y encima de eso que "sepa" como programar lo que le enviás. Eso lo hace usbasp.

Desde la línea de comandos usás avrdude, desde ArduinoIDE, le decís que

Sketch -> Upload Using Programmer

que usa avrdude.



Este es el conector del programador usbasp:


        +------+------+------+------+------+
        | MISO |  SCK | RESET|  N/C | MOSI |
        +------+------+------+------+------+
        | GND  |                    |  5V  |
        +------+                    +------+

Este es pinout del ATMega328p:


      +-----------------+
RESET ->  1          28 -
      -        A        -
      -        T        -
      -        m        -
      -        e        -
      -        g        -
           - Vcc    a   GND  -  GND
 GND  - GND    3        -
          -        2  AVcc  -  5V
           -        8   SCK <-  SCK
            -        p  MISO <-> MISO
            -           MOSI  -> MOSI
       -                 - 
       - 14           15 - 
      +-----------------+



Este el del ATtiny85:


          +---------------+       
 RESET -> 1       Vcc  -  5v
        -          SCK <-  SCK
         -         MISO <-> MISO
     GND - GND     MOSI  -> MOSI
   +---------------+


Y este es el programador como está ahora:



Los pines del atmega328p


Lo natural es aprovechar el espacio libre y cablear ahí:


ATtiny85 en sus propios pines


Si te fijás bien, hay una alta superposición que no debe ser accidental:



        +-----------------+
 RESET  ->  1          28 -
        -        A        -
        -        T        -
        -        m        -
        -        e        -
        -        g        -
   A         - Vcc    a   GND  -  GND
T     GND - GND    3        -  
  t  RESET  - PB6    2  AVcc  -  5V
   i         -        8   SCK <-  SCK
    n         -        p  MISO <-> MISO
    n     GND - PD6       MOSI  -> MOSI

8         -                 -  
5         - 14           15 -  
        +-----------------+


Mmmh, qué interesante, puedo ponerlo superpuesto y con dos jumpers determinar si habilitar los RESET y GND en PB6 y PD6 al programar ATtiny85.


Attiny85 compartiendo pines



Apuesto a que los pines coincidentes con ATMega328p arranca en alta impedancia y ni hacen falta los jumpers.


El incentivo que tengo para no usar los jumpers es que es menos trabajo y que si no hay jumpers no me voy a olvidar de ponerlos. Esto me debería obligar a consultar y entender la documentación.

La documentación dice:

"The Port X pins are tri-stated when a reset condition becomes active,
even if the clock is not running."

y con respecto a RESET:

"A low level on this pin for longer than the minimum pulse length
will generate a Reset,
even if the clock is not running."


¿Qué signica esto? Que si el programador tiene el RESET en bajo está todo ok, ¿pero quien llega primero? ¿Cómo está cuando arranca?

Me imagino que usbasp ni sabe ni le interesa nuestras superposiciones y que incluso debe preveer que se pueda utilizar en un chip que esté colocado en su circuito, así que debe activar y desactivar RESET en lugar dejarlo fijo, si no, ¿para qué tiene control sobre este pin si no lo va a ejercer?


Ahora tengo el estímulo de fijarme y el experimento será observar el comportamiento de RESET por un lado y ver si PB6 y PD6 arrancan en modo input o triestado.

Como siempre, aclaro que mis conocimientos de electrónica en general son escuálidos y en particular los de analógica.


Experimento 1


Programar un ATMega328p y observar el comportamiento de RESET.

Deseo que siempre esté bajo, pero por lo expresado más arriba, espero que cambie.

Resultados


El programador baja RESET


Arranca en alto, no lo puedo ignorar.




Experimento 2


Conectar un ATMega328p y observar las características eléctricas de PB6 y PD6.

Momento de replanteo, si el usbasp arranca con RESET en alto, lo que haya en PB6 y PD6 dependerá del programa almacenado previamente.

Pero si lo estoy alimentando por AVcc y no por Vcc, ¿se activa ese programa?


Subexperimento 2.1


Programar un ATMega328p con un programa que haga blinky en  PB6 y PD6 y ver si estando en el zócalo de programación se manifiesta.

void setup() {
DDRD |= B01000000;
  DDRB |= B01000000;
}

void loop() {
  PORTB |= B01000000;
  PORTD |= B01000000;
  delay(1000);
  PORTB &= B10111111;
  PORTD &= B10111111;
  delay(1000);
}


Resultado


El chip conectado en un circuito completo:


Con alimentación correcta corre blinky


El chip conectado al circuito programador:



Con AVcc no hay actividad



El programa no se activa, eso es bueno.

Subexperimento 2.2


Programar un ATMega328p con un programa que haga blinky en  PB6 y PD6, sin configurar los pines como salida y ver si se manifiesta. De no hacerlo, podemos deducir que el estado inicial no es output.

void setup() {
DDRD &= B10111111;
  DDRB &= B10111111;
}

void loop() {
  PORTB |= B01000000;
  PORTD |= B01000000;
  delay(1000);
  PORTB &= B10111111;
  PORTD &= B10111111;
  delay(1000);
}


Resultado


Se manifiesta, pero tengo dudas


Subexperimento 2.3


Programar un ATMega328p con un programa que haga blinky en  PB6 y PD6, configurando los pines como entradas y ver si se manifiesta.

void setup() {

}

void loop() {
  PORTB |= B01000000;
  PORTD |= B01000000;
  delay(1000);
  PORTB &= B10111111;
  PORTD &= B10111111;
  delay(1000);
}


Resultado


Se manifiesta, entonces sigo sin saber como arranca.



Subexperimento 2.3



Confeccionar un programa que ponga los pines en todos los estados posibles, luego tomar mediciones y usarlas para comparar con

Aunque no lo documenté en la otra experiencia con los modos de los pines, hay que tener presente que las transiciones de input a output tienen un cierto orden, no es que podés pasar directamente.

Resultado


No lo voy a hacer, se me está complicando mucho, yo sólo quería ahorrarme unos jumpers para poder programar el chip para ver si lo podía usar para controlar la velocidad de unos coolers de un switch, voy a volver a mirar la documentación. Y dice:


"The I/O ports of the AVR are immediately reset to their initial state
when a reset source goes active"

Pero no encuentro cuál es el estado inicial...


Finalmente me rendí y busqué en internet, no cómo resolver mi cableado sino como detectar si algo está en triestado y Crutshow el 2009-08-28 lo dijo:

Place two large (say 100K ohm) resistors in series between the +5V and ground. Connect the junction of the resistors to the tri-state output. If the output is in the tri-state mode, then the output will be about +2.5V. Otherwise the output will be high or low depending upon its output logic level.



Voy a considerar que está triestado y si rompo algo, eso me enseñará a aprender electrónica analógica.

Agregué los cables, programé un ATMega328p con el código del subexperimento 2.1 y, redoble de tambores...

Funciona, recién ahora, puedo programar el ATtiny85.

Tengo dos caminos, tomar el bare metal o como venía con ArduinoIDE.

El problema con el primer camino es que no sé como incluir las librerías para el serial, el DHT11, el PWM que ya tiene resuelto arduino.

El problema con el ArduinoIDE es que para ATMega328p uso Arduino Nano como referencia, pero ninguno existe que use ATtiny85.


Es todo un problema. En realidad es el problema de cómo agregar un board propio a ArduinoIDE, que vengo postergando desde la otra experiencia, para mi problema actual de la velocidad de cooler, optaré por baremetal y lo del "bare chip" resolveré en otro momento.

1 comentario: