Experimento con AVR ATTiny25-20

Hace ya algunos años asistí a un pequeño curso llamado “Programación de Microcontroladores AVR en lenguaje C”. La verdad el curso en cuestión era bastante aceptable, pero entre que no le sé mucho a la electrónica y dejé un poco lo aprendido en el curso ya se me estaba olvidando (o mas bien se me olvidó) gran parte de lo que ahí me enseñaron.

Actualmente estoy haciendo un pequeño robot con Arduino (que espero sea el primero de muchos) y como la verdad no me gusta usarlo (el Arduino) pensé que era el momento ideal para desempolvar los apuntes de aquel curso (poco a poco espero ir usando menos Arduino y más programación en C).

Así pues, para las luces del pequeño robot decidí usar un pequeño AVR ATTiny 2520-PU. Cómo funcionarán esas luces es algo sencillo: el microcontrolador hará parpadear 4 LEDs cuando uno de sus puertos de entrada esté en alto. Nótese que el Arduino será el que haga cambiar el estado de ese puerto.

El circuito en cuestión es el siguiente:

Circuito para las luces del robot

Circuito para las luces del robot

Para comprender un poco el esquema mostrado arriba debemos analizar la hoja de datos del ATTiny 25.

De acuerdo a los datos de Atmel, el ATTiny tiene solo un puerto (PORTB) y de sus 8 pines debemos quitar los de GND y VCC, con lo cual nos quedará de PB0 a PB5

*

Distribuición de pines del ATTiny 2520

Si ahora analizamos esquema y pinout tenemos que:

  • Los LEDs parpadearán cuando PB2 (pin 7) esté en alto
  • Los LEDs estarán conectados en PB0 (pin 5), PB1 (pin 6), PB3 (pin 2) y PB4 (pin 3)
  • Se incluye una resistencia pulldown(?) de 10K para evitar que los LEDs comiencen a parpadear “sin motivo aparente” debido a lecturas erróneas provocadas por ruido (efecto antena)
  • VCC debe ser 4.8V, 5.0V como máximo

El código en Atmel Studio 6.2 es el siguiente:

#include <avr/io.h>
void apagar(void);
void encender(void);
void parpadear(void);
int main(void){
   DDRB = 0b11011; // PB0 PB1 y PB3, PB4 como salidas, PB2 como entrada
   apagar();
   while(1){
      if(PINB & 0b00100){ Leemos el estado de PB2
         parpadear();
      }else{
         apagar();
      }
   }
}
void apagar(void){
   PORTB = 0;
}
void encender(void){
   PORTB=0b11011;
}
void parpadear(){
   apagar();
   for(volatile int i=0; i<=30000;i++){} // Pausa
   encender();
   for(volatile int i=0; i<=30000;i++){}
}

El uso de for(volatile int…) en vez de funciones del tipo delay() para hacer las pausas es recomendación empedernida del profe del curso. Él comentaba que las funciones del tipo delay() no son nada amigables con el ahorro de energía, incluso comentó que existe alguna fórmula para calcular las vueltas necesarias del for para pausar por un segundo.

*

El circuito montado en el protoboard

Después subiré un video a mi canal de Youtube con el robot terminado.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s