miércoles, 18 de enero de 2012

HolaMundo en Hitech-C || Parpadeo de un led



El primer programa que se suele afrontar a la hora de entrar en el mundo de los PIC es hacer parpadear un led. En primer lugar debemos ser conscientes del funcionamiento del Led. En éste caso, partimos de un led que funciona a un voltaje de 1,7V y una intensidad de 10mA.

Habitualmente, la salida del PIC es de unos 5V. Eso es casi 3 veces mas de lo que soporta nuestro LED, y de conectarlo directamente, se quemaría enseguida. Para evitar esta catástrofe, haremos uso de la ley de Ohm para calcular la resistencia que debemos utilizar. De ésta manera, nuestra resistencia sera el cociente de V / I, donde V es la tensión óptima en el ánodo del LED, e I la intensidad de la rama en cuestión.

Dejándonos de tecnicismos, 3,3V / 10 mA = 330Ω, que pasado a código de colores estándar de las resistencias es Naranja – Naranja – Marrón – tolerancia.


Recordad que los LED (Light Emmiting Diode) como su propio nombre indica, son diodos, lo cual denota polaridad. Para que conduzcan, el ánodo ha de ser más positivo que el cátodo.

ATENCIÓN: Tanto para éste tutorial como para los demás, se parte de un PIC modelo 16F887 salvo que se especifique lo contrario. Los programas y las conexiones pueden variar entre modelos, por lo que, en caso de utilizar un dispositivo diferente al mencionado, deberéis comprobar que todo esté correcto antes de alimentar el circuito. 

Conectaremos a la pata 2 (RA0) de nuestro PIC el LED en serie con la resistencia de 330Ω y finalmente a GND.

Ya tenemos los conocimientos necesarios sobre el circuito. Ahora vamos con el programa:
#include <htc.h>
#define _XTAL_FREQ 8000000

void main(){

    ANSELH = 0;
    ANSEL = 0;
    TRISA = 0;
    PORTA = 0;

    while(1){
        RA0 = 1;
        __delay_ms(500);
        RA0 = 0;
        __delay_ms(500);
    }
}


Breve explicación del código:


  • Si no se establecen los valores de ANSELH y ANSEL, el programa no funciona, ya que si un PIN está seleccionado como analógico, automáticamente pasa a estar configurado como entrada. Por tanto, una modificación por software sobre PORTA en este caso, no tendría ningún efecto. Ésto pasa en éste modelo de PIC, al menos. He trabajado con su antecesor, el 16F877 y carece de éstos dos registros. No obstante, éstas configuraciones pueden comprobarse en el Datasheet, en el apartado de "I/O Ports".
  • Acerca de la librería <htc.h>, es la que define los nombres de registros, los nombres de los pines y algunas de las funciones estándar de hitech-c que se utilizan comúnmente como __delay_ms(). Por eso es necesario incluirla SIEMPRE.
  • La directiva #define _XTAL_FREQ hertzs es necesaria para la utilización de los delays, ya que lo que éstos hacen es generar instrucciones en función de la frecuencia a la que funciona el PIC. Tendréis que convivir con ella.
  • La función __delay_ms() lleva dos barras bajas al principio. Aún no me he molestado en indagar por que utilizan nombres tan feos para algunas cosas. Simplemente realiza una espera activa de los milisegundos pasados por parámetro.

Y dicho todo esto, ahora podemos simular nuestro proyecto con MPLAB SIM observando el valor del registro PORTA con un punto de debug en las instrucciones RA0 = 1 y RA0 = 0. Si todo está correcto, el bit menos significativo del puerto A debería alternar entre 0 y 1.

Probablemente algunos habréis pensado en simular con animación. Cuando utilicéis en vuestros programas la función __delay_ms o __delay_us, descartad inmediatamente ésta opción. La explicación es sencilla:

Cada paso del simulador es una instrucción. Cada instrucción dura medio microsegundo real (recordad: 8Mhz y 4 ciclos por instrucción). Si echamos cuentas, un delay de 500 milisegundos equivaldría a ¡un millón de instrucciones! Si ahora suponemos que vuestro simulador avanza una instrucción cada medio segundo, tendríamos que esperar la bonita cifra de 5,78 días para ver que nuestro LED cambia de apagado a encendido, y otro tanto para volver a apagarse.

Es por eso, que  vale mas prevenir, y poner un STOP en esas dos líneas, y darle al play normal.

En caso de duda, comentad.

Saludos – MarcosR. @IAmRutiger

No hay comentarios:

Publicar un comentario