Programando AVR - Lecturas analógicas e hiperterminal

Si has programado en Arduino y ahora estás programando en mikroC, lo más probable es que hayan muchos comandos que eches de menos, como "AnalogRead()" y Serial.print(). Pues bien, en este tutorial cubriremos cómo leer señales analógicas y cómo hacernos de una consola, para poder debuggear nuestros proyectos.


Es importante que si no sabes programar en mikroC y solamente has programado en Arduino, entonces es requisito que hayas leido mi primer post, de lo contrario no sabrás de lo que estamos hablando, si ya sabes, no he dicho nada.

Para esta parte necesitaremos:
  • Nuestro programador (el de la primera parte)
  • Un Atmega168 o Atmega328
  • Cristal de 20 Mhz
  • Potenciómetro 1 MegaOhm o inferior
  • Cable FTDI o placas FTDI
 Antes de comenzar, vamos a aclarar algunas cosas. En este post ocuparemos un ATmega168 (puedes ocupar tanto el 168 como el 328, da lo mismo). Este micro, a diferencia del Attiny13 o el 2313, necesita un cristal externo, por lo tanto una de las cosas que debes hacer desde un principio (Ahora) es colocar el cristal en los pines 9 y 10, da lo mismo la posición.

NOTA: Es posible ocupar el Atmega sin cristal, pero para ello tenemos que quemar los fusibles. Lo mejor por ahora es ocupar un Cristal

La segunda cosa que debes hacer de inmediato es conectar el pin 21 a 5 volts. Este pin es el voltaje de referencia y según sea el voltaje al que esté conectado, será el resultado de la lectura analógica.

Una vez hechas estas 2 cosas podemos continuar...


  1. ¿ Cómo hago AnalogRead() en MikroC ?
La función que en Arduino conocemos como AnalogRead(), en MikroC la llamamos ADC_Read(x). ADC viene de Analog Digital Conversor y es importante que cada vez que invoques esta función te fijes en el datasheet de tu micro AVR, ya que hay algunos que tienen 2 puertos ADC, otros tienen 5 (Atmega168, Atmega328) y otros que tienen  muchos más.


Otro punto importante es que antes de ocupar la función ADC_Read(x), debes poner como primera línea de tu código, la siguiente línea

#include <built_in.h>

No olvides que la opción ADC debe estar habilitada, para eso fijate en las pestañas de la parte derecha, una de estas pestañas se llama "Library Manager", haz click y busca la opción ADC, si su respectiva caja no tiene check, tu márcala, debe estar chequeada.

Lo único que me falta por explicar es la "x", fijate que el pin 23,24,25,26,27 y 28 tienen una etiqueta que dice ADCX, esta X es el número de conversor ADC asignado, en este caso el Atmega168 y 328 tienen 6 ADC. El primero es el ADC0 y el último es el ADC5. Por lo tanto si quieres leer una señal que está conectada al pin 26, debes hacer ADC_Read(3), Claro? Perfecto.



2. ¿ Cómo hago Serial.print() en MikroC ?

Esta es otra de las funciones que nos hacen terminar nuestros proyectos en Arduino, la posibilidad de ir debuggeando nuestros proyectos, pues bien, en MikroC podemos hacer lo mismo, pero muchas veces lo olvidamos o lo evitamos ya que tiene una dificultad extra la primera vez que la ocupamos.
Lo primero es lo primero, recuerdan que en Arduino en el void setup hacemos "Serial.begin(9600)", pues bien, acá haremos lo mismo, acá ocupamos "UART1_Init(9600)". El objetivo de esta línea es decirle al chip que la comunicación serial será a 9600 bits por segundo.
Para escribir en la consola tenemos 2 opciones...

UART1_Write_Text("pon tu texto aquí"): Con este comando escribimos un texto definido por el usuario.

UART1_Write(char[i]):  Con este comando escribimos un char que fue definido dentro del código. Este es el comando equivalente a Serial.print(), pero la diferencia es que aquí no podemos ingresar un número entero o un resultado, esta función sólo acepta char´s, por lo tanto, si queremos saber que valor nos da una función, deberemos pasar el número (int, long, double) a un string y luego mandar cada char por separada a la consola. 

Acá también debes ir a Library Manager y chequear la opción UART

Para pasar de int a string es super fácil. Supón que tengo el siguiente valor

int val = 12345678

entonces lo que quiero es definir un string el cual tendrá 8 chars, y en cada char irá cada caracter de nuestro número. Lo primero que hacemos es definir el arreglo de chars, así

char cadena[8];

Ahora hacemos

IntToStr(val, cadena);

Y listo, ahora cada char tiene un caracter de nuestro número. Es importante notar que estos arreglos son "zero indexed", es decir, el primer char es cadena[0]. Cuando el primer char es cadena[1] se le llama "one indexed", pero no es nuestro caso.


Perfecto, ahora toma el cable FTDI y fijate que tiene 6 cables. 


  
El cable negro, debes conectarlo a la tierra de nuestro circuito (GND) y el cable amarillo debe ir al pin TX (transmisor) de nuestro chip, el cual en el atmega168/328 le corresponde el pin 3.

Conecta el cable FTDI al computador y fijate que puerto COM le asigna tu computador, ahora abre la hyperterminal e inicia una conexión en el mismo número de puerto que se le asigno al cable FTDI y define la velocidad a 9600 bits/segundo.

Si tienes windows vista o windows 7, entonces te darás cuenta de que la hyperterminal ya no está, pero la puedes descargar desde aquí


Casi terminamos, es hora de armar el wiring


Ojo, la placa roja cumple la misma función que el cable FTDI, hay muchas opciones de reemplazo para el cable, tu elije la que te sea más fácil de conseguir, lo importante acá es que la tierra vaya conectada tanto la del cable o placa junto a la del chip, es decir haya tierra común, y lo otro importante es que el pin Tx de tu chip debe ir al pin Rx de tu placa o cable FTDI.

Listo, es hora de cargar nuestro código final. Haz click aquí, cópialo, pégalo y cárgalo con nuestro programador.



En el video se muestra que al hacer variar el voltaje con el potenciómetro, este voltaje es medido por el ADC de nuestro chip y luego este valor es enviado a nuestro computador a través del cable FTDI.

A modo de conclusión, Tal como lo dije en el video. Arduino es mucho más rápido al momento de ver resultados en consola y otras cosas, pero una vez que ya se conoce este truco, todo es más fácil. Además la gracia de programar en MikroC es que puedes trabajar con cualquier chip de la familia AVR y esto te dará una ventaja al momento de enfrentar un proyecto que va por sobre las capacidades un Atmega328.

Se agradecen comentarios, Saludos!

Si te gustó el post o te fue de utilidad, te agradecería expresar tu apoyo como fan de 555riente en facebook, es sólo un click. Gracias!!!

5 comentarios:

  1. Muy buen post ya me estoy armando de un programador y de avrs para poder iniciarme en avr, consulta en entorno arduino existe la función analogReference, que nos permite cambiar la referencia analógica de lectura (interna 1.1v o externa "X" )del atmega en cuestiona, cual seria el comando en este entorno para cambiar esto, serviría de mucho para inspeccionar a través de divisor de voltajes el estado de baterías con una precisión muy buena, bueno te dejo mi duda y gracias por el post.

    ResponderEliminar
    Respuestas
    1. Otra cosa, en la universidad quiero hacer un taller con Arduinos, y quiero adquirir unas 20 placas. Tu sabes si van a tener en stock pronto del Arduino UNO (no SMD).
      Gracias Ricardo

      Eliminar
  2. Sí, de he hecho lo hay es ''analogReference(tipo)'' donde

    tipo = INTERNAL1V1 toma 1.1 V la referencia
    tipo = INTERNAL2V56 toma 2.56V la referencia
    tipo = EXTERNAL toma el voltaje en el pin AREF como referencia (este creo que te sirve para tu idea)

    http://arduino.cc/it/Reference/AnalogReference

    ResponderEliminar
    Respuestas
    1. genial, se agradece.(respecto a lo de arriba ornamente te tendré respuestas).
      saludos!

      Eliminar
  3. hola que tal...
    es estado practicando un poco con los atmega de atmel en especial con el atmega48 y el attiny2313 pero encuentro problemas para poder programar los fuses me podrias dar una orientada como cambiar estos fuses, te comento que ya dañe 2 por lo mismo... gracias mi e-mail es bet_zai_007@hotmail.com

    ResponderEliminar

Comenta aquí...