M68HC08: Hola LED

Recientemente empiezo a manejar los microcontroladores de 8 bits de la familia Nitron de Freescale (antes de Motorola), en particular el QY4. Me han agradado bastante pues ha sido la primera vez que programo un microcontrolador en lenguaje C (antes había usado algún PIC y el HC12 también de Motorola pero sólo con ensamblador), además de que aunque es bastante pequeño (16 pines) tiene unas características bastante interesantes (incluyendo convertidor analógico-digital).

Esta es la tarjeta que estamos utilizando:

Y, similar a cuando uno hace su primer programa en algún lenguaje en el que de alguna forma mostramos en pantalla el mítico “Hola mundo”, en microcontroladores lo que normalmente hacemos es prender y apagar un led, y aquí está el código para hacerlo con CodeWarrior:


#include // Se definen los registros de I/O y sus direcciones
#include // Contiene instrucciones en ensamblador
#include // Inicializa pila, variables, etc. es un subprograma

// Declaración de funciones
// Es necesario declarar explícitamente los parámetros,
// aún siendo void.
void inicializacion( void );
void delay( int ); // A mí me gusta usar un delay con parámetro.

void main( void ) {
inicializacion();

// Ciclo infinito (para que el código se ejecute
// indefinidamente).
// En realidad, el código dentro de la función main()
// se cicla, aunque yo prefiero usar un ciclo infinito
// para evitar realizar la inicialización más de una vez,
// aunque con el obligado mensaje "Warning" del compilador 😀
while( 1 ) {
// Invertimos el valor del pin 1 del puerto A.
// En dicho pin está conectado el led
// ¡Recordar usar una resistencia!
PTA_PTA1 = ~PTA_PTA1;

delay( 30000 ); // Retardo
}
}

void inicializacion( void ) {
CONFIG1 = 0x09; // Deshabilita el perro guardián
OSCTRIM = 0x80; // Oscilador interno.

// Todo el puerto A como salida.
DDRA = 0xff;
// También, se puede configurar un sólo pin a la vez:
// DDRA_DDRA1 = 1; // Pin PTA1 como salida
// Además, hay que recordar que PTA2 es siempre
// una entrada.
}

void delay( int ciclos ) {
static unsigned int i;

// Retarda n ciclos de reloj.
for ( i = 0; i < ciclos; i++ ); }

Por supuesto que este es un código muy simple, pero es como el "Hola mundo" de los microcontroladores :D. Ya luego iré colocando algunos programas más complicados. Por ahora he realizado unas secuencias de encendido de 8 leds, un contador 0-999 con salida a tres displays de 7 segmentos y un sumador/restador de 4 bits mostrando el resultado en dos displays de 7 segmentos; este último utilizando dos microcontroladores QY4 en cascada, uno trabaja como sumador y el otro como el decodificador a los displays.

Ahora estaré ocupado con algo de interrupciones y manejo del convertidor analógico digital, a ver cuándo puedo volver a poner algo por aquí :D.

Por cierto, otra cosa en la que estoy pensando, es en convertir a Scilab unas prácticas que estamos realizando con Matlab, esto pensando en que pueda uno trabajar también con Linux para las prácticas (desde que empiezan las clases ni he tocado Linux 🙁 ), o al menos como un primer acercamiento a este SO en el curso :).

Leave a Reply