Table of Contents....Portfolio of Work....Informes
 

informes de investigación

por Adam M. Hasler

 
sobre estos
informes
 
informes introductorios
diario de diciembre
 
introducción al Arduino y otras herramientas

 
informes de sensores y protocolos
Making Things Talk proyecto 1
 
Making Things Talk proyecto 2
 
informes de microcontroladores
microcontroladores parte 1: el fracaso
 
microcontroladores parte 2: el éxito
 
microcontroladores parte 3

El seminario de microcontroladores parte 1 o, "la historia de un fracaso"


describe: Intenté con este proyecto aprender todo sobre los componentes de un Arduino, con la intención final de construir una placa Arduino entera del principio. Para hacer esto, quise usar todos los tutoriales Beginning Embedded Electronics en el sitio de Sparkfun. Comenzando con las instrucciones de como construir el circuito necesario para proveer 5 voltajes a un protoboard desde la enchufe en el pared, continúa con todos los elementos de conectar un microcontrolador AVR a una computadora (usando Windows y las puertas paralelas y seriales), programación, y imprimir una tabla de circuito. Desafortunadamente, no podía realizar la meta de programar el AVR con el paralelo esa vez (lo pude hacer meses después).
fechas: 8-15 de febrero, 26 de febrero a 26 de marzo
materiales: protoboard, reguladora 5V, 500 mA fusible PTC, condensador 10uF, condensador 100uF, interruptor, diodo, 2 leds, 2 resistencias 330 ohms, enchufe de 9V DC, alambre negro y rojo, ATMega168, AVR programador de puerta paralela, cristal de 16MHz, cable de puerta paralela, botón interruptor, led, resistencia 10k Ohm, condensador cerámica .1uF, condensador cerámica 22pF, resistencia 330k Ohm.

la función de microcontroladores, fuente de poder, el circuito de programación

El seminario que usé está acá.

Puertas de lógica en circuitos has existido por muchas decadas. Estos circuitos operan según la satisfacción de varias condiciones, o una combinación de satisfacer y no satisfacer unas condiciones, para producir un resultado intentado. Antes del microcontrolador (desde ahora adelante escrito como uC), se creaba estas configuraciones con circuitos basados en los diodos o transistores. Por ejemplo, en una configuración en que hay dos entradas y una salida, si hay corriente en las dos entradas, corriente sale. Pero no sale nada si solo hay corriente en una o la otra entrada. Los uCs operan en el mismo principio, pero en vez de usar una configuración física, guarda código que dictan estas reglas. Este código lee las entradas, y si hay corriente, produce corriente en la salida. Originalmente solo se podía programar estos uCs una vez (One-time-programmable, o OTP). Con la introducción de memoria flash, se puede escribir y borrar la memoria muchas veces. Además, distinto que un circuito integrado común, se puede configurar cualquier patita como entrada o salida. La introducción de uCs hizo los circuitos usados en productos comunes más chicos, más rápidos, y menos caros debido a tanto menos material.

A pesar de estas avanzas en el tamaño y la simplicidad del componente físico de los circuitos, todavía se tiene que aprender una cantidad significativa para usar los uCs. El Arduino ha ayudado mucho este proceso. Fue diseñado para permitirle al usuario evitar preocuparse de las necesidades físicas de un circuito interactivo: fuente de poder, interfaz de protocolos, programación, etc. Sin embargo, queda varios razones para aprender como funciona el AVR en el centro de un Arduino, y que hace todos los componentes del sistema Arduino. Para aprender sobre estos componentes y como usar un AVR por lo general, empecé con el circuito que convierte la electricidad del pared a los 5V DC, la cantidad de poder que el AVR necesita para funcionar. Aprendí como armarlo con éste.

Un enchufe común hace el primer paso...convertir el 220V de corriente alternante que viene del pared en Argentina (son 110V en los EE.UU.) al 9V de corriente directa (es probable que vos tenés uno para cargar tu celular). Sin embargo, con el mayor parte de enchufes que convierte la cantidad de poder, la electricidad que produce todav&#a tiene características que pueden dañar el uC. Estas características incluyen un voltaje no exacto y variable, como 8V o 8.5 V, y una frecuencia todavía un poco alternante (no el directo que necesita el uC). Para más sobre esta conversión y las desventajas del corriente que provee una enchufe común, leí éste. Probé mi propia enchufe: 9.08V, y fue un poco variable. Mejor que el mayor parte de enchufes, pero no bastante bien para mis propósitos.

Power supply
Protoboard armado para proveer 5V
Construí el circuito basado en el uso de un regulador una entrada de más que 7V. Tenía la opción de usar un enchufe baríl para la enrada de la echufe 9V, pero lo rompí tratando de hacerlo caber en el protoboard y ultimamente tenía que cortar las alambres y ponerlas directamente en las filas de la tablita. Después de varias pruebas con el metro, y añadir condensadores (para estabilidad del circuito), un diodo (para seguridad), y un interruptor y led (para conveniencia), construí el circuito en la foto.

Puse todo el circuito en una forma compacta en el fin del protoboard, y todas las filas recibían 5V. El protoboard fue listo para el AVR. Seguí con la próxima lección, que describía el circuito para hacerle el AVR listo para recibir código, y como conectarlo a la computadora. Básicamente, tenía que hacer un circuito de in-system programming, o programación en sistema (ISP). El programador que usaba tenía puerta paralela y un conectador de 10 patitas, conectado por un circuito de ISP.

Basic ISP circuit
circuito básico ISP con led

En este punto, necesité conectar cuatro patitas del AVR a las circuitos del poder (7 y 20 al 5V, y la masa a 8 y 22). También, tuve que conectar la patita 1 al circuito reinicializar (reset) al circuito de poder, con la opción de empujar el botón y ponerle a masa. El programador conectó a la fuente de poder por hueco 5, y a la masa por huecos 4,6,8, y 10.

circuito completo
mi circuito completo
Las conexiones para señales de data fueron el MISO (Master in Slave out, o Amo Entrada Esclavo Salida, a través de que va un señal desde el AVR hasta la computadora, o AVR patita 18 a hueco 9), MOSI (Master out Slave In, o Amo Salida Esclavo Entrada, a través de que va un señal desde la computadora hasta el AVR, o AVR patita 17 a hueco 1), un señal de reset (hueco 7 al circuito reset), y el SCK (System Clock, o reloj de sistema: AVR patita 19 a hueco 7). A través de ésta, la computadora cuenta tiempo para el AVR, y sin ésta el AVR no puede entender el señal que envía la computadora. Esta configuración representa un ejemplo de la comunicación sincrónica.

En este punto, después de investigar un poco sobre armar un Mac con el software necesario para programar, me di cuenta que no tenía manera de conectar mi computadora a mi circuito. Yo tengo un Mac, que como el mayor parte de computadoras más modernas no tiene puerta paralela. Pensé que tenía muy pocas opciones...podía comprar un programador de USB (que analizándolo ahora debía hacer), comprar un convertidor USB a paralelo (que no hice, con suerte por que aprendí que no iba a funcionar), o encontrar otra compu con puerta paralela. Escogí la tercera opción. Pide permiso usar una de las computadoras en Lateral que tenía Windows y una puerta paralela. Empecé configurar aquella computadora para programar el AVR.

programación de microcontroladores

El proceso de configurar el AVR, según Sparkfun, se centra en compilar el código C (el idioma en que se escribe las direcciones para el AVR) y convertirlo a archivos HEX que el AVR puede leer. El compilador que se usa se llama el AVR-GCC. WinAVR, un software gratis que incluye el AVR-GCC y varias otras herramientas para la programación de AVRs, sirve para la interfaz con el AVR-GCC. La lección me proveyó un archivo, blink.c. Ya tenía el parte físico del sistema, ahora sólo hubo que poner el código en el chip con la computadora. No tuve éxito con este paso por el tiempo entero que estuve en Argentina (UPDATE: por fin, programé el microcontrolador, meses después mientras estuve quedándome en Texas. Para ver como lo hice, ve acá.

Primero, bajé WinAVR. Abrí blink.c (que bajé de la página de la lección) en Programmer's Notepad (incluido con WinAVR) y lo compilé por seleccionanar Tools>Make All. Esto creó varios archivos más, incluyendo la versión del código en hex. Después, abrí el makefile (el archivo con especificaciones para la compu sobre programar el AVR), y puse los siguientes ajustes para la puerta paralela:

AVRDUDE_PROGRAMMER=stk200
#AVRDUDE_PROGRAMMER=ponyser

#AVRDUDE_PORT=lpt1
#AVRDUDE_PORT=COM1
Después, seleccioné Tools>Program. Y....

...y error. Dijo Can't open device 'giveio'. Con suerte, ésta tenía solución. Aprendí del mismo seminario en Sparkfun que las nuevas versiones de Windows no les permite a los usuarios controlar directamente las puertas seriales y paralelas. Hay que copiar el archivo giveio.sys, incluido en la carpeta de WinAVR, a C:/Windows. Luego, en la función run se tecla install_giveio.bat. Esta comanda instala el archivo, y se permite usar las puertas externas.

Hice otra vez, y recibí un mensaje nuevo:

avrdude: AVR device not responding (No responde el dispositivo AVR)
avrdude: initialization failed, rc=-1 (fracasó la inicialización)
Double check connections and try again, (Revise conexiones y intentálo de nuevo)
or use -F to override this check. (o usa -F para hacer caso omiso de este prueba)
Chequé las conexiones, y fueron al revés. Los cambié, pero recibí el error rc=-1 de nuevo. Añadir -F al fin de la línea resultó en este, una respuesta más específica que el primero:
avrdude: AVR device not responding (No responde el aparato AVR)
avrdude: initialization faile, rc=-1 (fracasó la inicialización)
avrdude: Device signature=0x000000 (firma de aparato=0x000000)
avrdude: Yikes! Invalid Device signature (Caramba! Firma de aparato inválido)
avrdude: Expected signature for ATMega168 is IE9406 (Firma esperada para el ATMega168 es IE9406)
Note: Flash memory has been specified, an erase cycle
will be performed. To disable this function,
specify the -D option.
(Nota: Memoria flash ha sido especificado, un ciclo de borrar será actualizado. Para desactivar esta función especificá la opción -D)

Seguí recibiendo este mismo mensaje para las semanas que vinieron. Sin embargo, aunque me frustré muchísimo durante ese tiempo, aprendí más que aprendería si no tuviera problemas. En la siguiente sección, no continué con la lección de Sparkfun, y en vez de esa investigué todos los problemas posibles, revisando el circuito y cambiando los ajustes en la computadora.

revisar, probar, y parar

En este punto en el proceso, cambió a un proceso de diagnosticar los problemas. Sería significativamente más difícil que seguir las instrucciones de una lección...tuve que aprender cuales son todos los objetos y procesos que tiene algo que ver con poner código en el AVR, y probar cada uno y eliminar la posibilidad que fue la causa del problema. Sin embargo, la lección de Sparkfun no tenía bastante información sobre este proceso. Tuve que buscarla en otros lugares. Investigué más. Una fuente de información buena fue el sitio de Adafruit, Evil Mad Scientist, y AVR freaks, que tiene varias lecciones sobre configurar y usar AVRs. Leyendo la información en estos sitios, me di cuenta la amplitud del mundo de microcontroladores, y cuanto no sabía.

Antes de explorar las opciones de configuraciones en la computadora, revisé otra vez todas las posiciones de todas las alambres y las conexiones. Todas fueron puestas donde debían estar...usando mi metro y su ajuste de continuidad, probé todos los circuitos, y el voltaje (para ver si había 5V donde debía). Todo bien...sin problemas que podía ver. Buscando otras personas que tenían el mismo mensaje de error que yo, la respuesta de la ingeniera que maneja el sitio, Lady Ada, dió la respuesta: "do the fuses change the clock source settings?" (¿Les cambian los fusibles los ajustes de la fuente de reloj?). Lady Ada tiene mucho sobre fusibles acá. Porque no podía comunicar con el AVR en cualquier manera, y todavía jamás comuniqué, tenía que suponer que a) los ajustes de fusibles/reloj fueron los mismos que tenían cuando salió de la fábrica (más sobre mi trabajo sobre frecuencia y rapidez de bits acá) y b) aún si fueron diferentes, no podía comunicar con el AVR para cambiarlos, entonces no importaba en ese momento. De todos maneras, encontré éste que espero que me ayudará con problemas de fusibles en el futuro.

Para programar en la línea comanda, se usa cuatro comandas y argumentos variables:
-c: tipo de programador
-p: numero de parte que se quiere programar
-P: la puerta en la computadora
-U: tipo de memoria a que se interactúa : si se lee [r], se escribe [w], o se verifica [v] : nombre del archivo.
Aprendí una cosa muy interesante del sitio de Adafruit: como compilar y programar el AVR en el ambiente de línea comanda, sin usar el Programmer's Notepad. Usaba la línea comanda en proyectos antes, pero con la adición de AVRdude en mi sistema, tenía la opción de varias comandas más en la terminal. Teclar avrdude en la linea comanda hace asomarse las varias comandas incluidos en el paquete de AVRdude. Para compilar, se entra el directorio donde está guardado los archivos de C y el makefile, y se tecla make all. Por ejemplo:
C:\Code\Blink>make all
Para una lista de todos los programadores que apoya AVRdude y su código para el uso en la línea comanda, se tecla avrdude -c xxx (Según Sparkfun, de dónde compré mi programador paralelo, el tipo que usaba fue 'stk200'). Para averiguar los tipos de AVR que apoya AVRdude y sus códigos, se tecla avrdude -c avrisp. Se ve así, completo:
C:\avrdude -c stk200 -p m168 -P lpt1 -U flash:w:blink.hex
Aunque intenté programar mi microcontrolador con este metód en vez del Programmer's Notebook, recibí el mismo mensaje de error. Este me aseguré que el problema fue en la puerta paralela o el programador....la compu envió los datos correctamente, pero entre la puerta paralela y el protoboard, algo fue equivocado. Mi próximo paso fue en dos cosas: la puerta paralela y el programador que compré de Sparkfun, para probar si funcionaban.

parallel port diagram
Diagrama de este excelente tutorial
Tenía que saber más sobre las rutas que toman los datos, los pulsos de electricidad, para salir de la compu al chip para poder probar el circuito hasta la puerta paralela. Sin hacer eso, no sabría si la electricidad salía de la puerta, ni podría probar los ajustes ni eliminar posibilidades de problemas tampoco. ¿Para qué son los huecos en la puerta paralela? ¿Cómo llega a ser los 10 huecos en la interfaz con la tabla? Estas preguntas me llevó profundo en el funcionamiento de la puerta paralela...su uso original con la impresora, la dirección en hex de la memoria donde escribe, etc. Fui cierto que fue un problema con la puerta paralela.

Pablo González vino al lab para ayudarme diagnosticar. Tuve razón...no fue el circuito, pero la puerta paralela. La puerta que usaba no fue la original, conectada directamente con la placa madre. En vez de esa, fue una placa añandida después, con otras conexiones y otro 'chip set', o los espacios de memoria reservados para su uso. Abrimos la computadora y encontramos los patitas en la placa madre. Lo probamos por enviar datos a la puerta interna, con una led conectado a un patita y la masa. Funcionó...la información salío de la computadora. Sin embargo, hubo un problema todavía...los patitas estuvieron ubicados profundo en el cuerpo de la computadora, sin conexión al externo. Además, los patitas estuvieron configurados en dos filas, no en la configuración de la puerta paralela que tenía. Tendría que construir una cinta para alcanzar desde eso y crear una interfaz con los partes que tenían. Este proyeto hubo llegado a ser muy complicado.

Cinta
la cinta conectada a la placa madre
Construí la cinta que podía usar para conectar las patitas internas al cable con puerta paralela (llamado también el DB-25). Por fin, podía escribir directamente al chip set que toda mi investigación dijo fue necesario. Cambié los ajustes en el BIOS para permitirlo, y viendo un programa que lee los señales que pasan por la puerta paralela un monitor que bajé, llegué a ser cierto que la información salió por la puerta. Pero todavía, no programé el AVR.

Había pasado más que un mes en este proyecto, y tenía que dejarlo para trabajar en otras cosas. Sí puedo usar un USB, pero eso no quiero usar antes que sé como funciona un sistema así en su nivel más básico. Ahora me molesta que no sé porque el código nunca llegó al chip. Mi teoría es que en el proceso de cambiar tantas cosas, quemé el chip y ahora no funciona, que lo tengo que remplazar. Originalmente, tenía planes escribir todo que hubo pasado en una carta y ponerlo en los foros en el internet. Pero ahora, mi plan es empezar de nuevo....construir otro circuito con otra chip, usando un nuevo programador, con una interfaz en otra compu. La próxima capítulo de esta serie sobre microcontroladoras será, con suerte, sobre un éxito, no un fracaso.

El hecho que no programé el AVR no significa que fue un fracaso entero...solo es que no realicé una de las metas que tenía. Pero solo uno...además, quería aprender más sobre el AVR y la programación del microcontroladores. También trabajaba con un proceso y método, cuidadosamente eliminando posibilidades de la fuente del problema. Eso realicé, con mucho más éxito que si programé con éxito al primer intento. Estoy ansioso moverme adelante con esta tarea, porque estoy cierto que voy a entender tanto más después de esta experiencia.

 
contacto

amhasler[at]gmail[dot]com

 
textos
Making Things Talk
 
Getting Started with Arduino
 
seminarios de Sparkfun
 
otros vínculos
Processing
 
Arduino
 
Estado Lateral
 
Adafruit
 
AVRFreaks
 
Doing the Projects in Making Things Talk