Saltar al contenido

Programar PIC desde Cero en C

En esta entrada vamos a comenzar a aprender a Programar PIC desde Cero utilizando lenguaje C con nuestro compilador PIC C Compiler. Con este articulo aprenderás programación de PIC en C desde cero.

Hoy aprenderás a crear tus primeros programas en lenguaje C para nuestro microcontrolador. Recordemos que aunque sea un curso básico para programar microcontroladores, debemos tener un mínimo de conocimiento en lenguaje C y en Electrónica.

También explicare como pueden programar el PIC utilizando el quemador PicKit 3 para que graben los programas que vamos a comenzar a hacer en sus microcontroladores.

Si es tu primera vez aqui, te cuento que tenemos un curso COMPLETO de MICROCONTROLADORES PIC desde CERO y PASO A PASO (GRATIS) Es solo dar click en el siguiente enlace para ver todas las clases disponibles y conviértete en un experto Programando PIC:

👉🏻 CURSO DE MICROCONTROLADORES PIC

Programar PIC en C – Primeros Pasos

A continuación vamos a ver unos programas de ejemplo para Programar PIC donde usaremos las instrucciones básicas de como preguntar por una entrada y como activar una salida. Configurando nuestro PIC y colocando nuestro encabezado. Recuerda que todo esto lo vimos en la entrada pasada, si aún no lo has visto da click aqui 👉🏻 Instrucciones básicas en PIC C

Kits Economicos

A continuacin te dejo una lista de KITs económico directamente desde la CHINA para que lo adquieras desde cualquier parte del mundo.

Encender y Apagar un led con pic

Con base en el siguiente esquema electrónico que consta de un PIC16F887, un switche y un Led hacer.

Proyecto1

Encender el LED conectado a RB0 si el switche conectado a RB1 está Activo.

#INCLUDE<16f887.h>
#USE DELAY(CLOCK=4000000)
#FUSES XT,PROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
#DEFINE SW PORTA,1
#DEFINE LED PORTB,0
#BYTE PORTA= 5
#BYTE PORTB= 6
MAIN()
{
   SET_TRIS_A(0B10);          //Configura el puerto A
   SET_TRIS_B(0B11111110);    //Configura el puerto B
   WHILE(TRUE)                // Haga por siempre
   {
      IF(BIT_TEST(SW))        // Si SW esta activado
      {
         BIT_SET(LED);        // Active el led
      }
      ELSE                    // Sino, es decir si SW esta desactivado
      {
         BIT_CLEAR(LED);      // Apagar led
      }
   }
}

Como vemos es un código sencillo, donde se pregunta en todo instante si el SW(PortA,1) está activo. Si esta sentencia es cierta, se activa la salida LED(PortB,0). Todo lo usado en este código fueron las sentencias basicas vistos en los post anteriores. (al final de la página se muestra el video con la implementación de este ejemplo)

Retardo en PIC – Programar PIC

Para este segundo ejemplo, veremos una nueva instrucción básica, llamada «delay_ms(tiempo en milisegundos)». Esta es un instrucción de retardo que es muy útil ya que me permite dejar al microcontrolador esperando por un lapso de tiempo, sin hacer nada, para que luego continúe con su rutina.

En muchos programas que vamos a hacer, vamos a necesitar que el PIC se quede quieto esperando bien sea una visualizacion o esperando un tiempo para continuar con su programa. La instrucción del retardo se declara de la siguiente forma.

delay_ms(1000);   //Retardo de 1 Segundo (1000 ms)

Dentro de los parentesis, se coloca el numero de milisegundos que va a durar el retardo, en este caso, se coloco 1000 milisegundos que corresponde a 1 segundo.

delay_us(1000);   //Retardo de 1 mili-segundo (1000 us)

También puede hacerse en microsegundos colocando en paréntesis lo que va a durar el retardo, en este caso 1000 micro-segundos corresponden a 1 milisegundo.

Estas instrucciones son dependientes de la directiva que colocamos en el encabezado de todo programa para determinar la velocidad a la que va a correr el microcontrolador, que lo detallaremos en otra entrada más especificamente.

use delay (clock=4000000);   //Reloj del CPU a 4MHz

Si queremos usar un cristal de cuarzo externo, para mejorar la presición de tiempo de nuestro microcontrolador, usamos cualquiera de las siguientes instrucciones:

use delay (clock=4000000,crystal);   //Reloj de cuarzo a 4MHz

o también:

use delay (crystal=4000000);   //Reloj de cuarzo a 4MHz

En el siguiente ejemplo, vamos a encender y a apagar un LED conectado a RB0 cada medio segundo.

Microcontroladores PIC
#INCLUDE <16f887.h>
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
#DEFINE LED PORTB,0
#BYTE PORTB= 6

MAIN()
{
   SET_TRIS_B(0B11111110);    //Configura el puerto B
   WHILE(TRUE)                // Haga por siempre
   {
      BIT_SET(LED);           // Active el led
      DELAY_MS(500);          // Retardo de 0.5 segundo
      BIT_CLEAR(LED);         // Apagar el led
      DELAY_MS(500);          // Retardo de 0.5 segundo
   }
}

Programando PIC usando Output Toggle CCS

En este ejemplo aprenderemos a usar una instrucción que nos permite cambiar el estado lógico de una salida, Es decir que si el Pin esta en 1 cambia para 0 y viceversa. La instrucción es output_toggle(pin_x) donde ‘x‘ se remplaza por el pin que queremos cambiar de nivel. Ejemplo: portb,1 se colocaria pin_b1.

output_toggle(pin_b1); //Cambia el estado logico del pin b1
output_toggle(pin_c4); //Cambia el estado logico del pin c4
output_toggle(pin_a2); //Cambia el estado logico del pin a2

En el siguiente ejemplo, emplearemos 3 leds conectados al PORTB, la idea del ejemplo es hacer con que cada led prenda y apague con una frecuencia diferente, y para eso utilizaremos la instrucción output_toggle y delay_ms. La idea entonces es hacer que el LED 1 prenda y apague cada 233 ms, el LED 2 cada 592 ms y el LED 3 cada 879 ms.

PIC C
#INCLUDE <16f887.h>
#USE DELAY(CLOCK=4000000)
#fuses XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
#byte PORTB= 6

long led1,led2,led3; //crea tres contadores para llevar el tiempo


//Programa Principal
VOID MAIN()
{
   SET_TRIS_B(0);    //Configura PUERTO B como salida
   //Inicializa los 3 contadores en cero
   led1=0;  
   led2=0;  
   led3=0;  
   
   WHILE(TRUE)       //Haga por siempre
   {
      
      delay_ms(1); //Coloco el retardo en 1 ms
      led1++;      //aumento contador del led 1
      led2++;      //aumento contador del led 2
      led3++;      //aumento contador del led 3
      if (led1==233){        //si el contador llego a 233 ms entonces...
      output_toggle(pin_b0); // cambie de estado el Pin B0
      led1=0;
   }
   
   if (led2==595){      //si el contador llego a 595 ms entonces...
      output_toggle(pin_b1); // cambie de estado el Pin B1
      led2=0;
   }
    
   if (led3==879){      //si el contador llego a 879 ms entonces...
      output_toggle(pin_b2); // cambie de estado el Pin B2
      led3=0;
   }
   }
}

Programar PIC usando el PICKIT 3

Para poder programar los códigos de los ejemplos anteriores en nuestro PIC, vamos a necesitar de un quemador. En esta entrada voy a enseñarles a usar el Quemador PICKIT3 el cual vemos a continuación:

    pickit3

    El datasheet o manual del PICKIT3 puede se encontrar a través del siguiente link (click aca) El PICKIT3 es un programador en circuito, es decir podemos programar nuestros microcontroladores directamente en el circuito o en la protoboard, sin necesidad de tener que colocar el PIC en una base especifica.

    La programación es sumamente sencilla, el PICKIT3 posee 6 lineas como puede ser observado en la sigiente figura:

    PicKit3 PinOut

    Vemos que tiene una flecha indicando el Pin 1, que es el Master Clear. Ahora para programar nuestro PIC solo basta con conectar cada pin del PICKIT3 con su respectivo pin del PIC, así por ejemplo el Pin1MCLR debe conectarse con el MCLR del pic, el pin2 va a positivo (+5v), el pin3 va a tierra (GND), el pin 4 va al ICSPDAT del PIC y el pin5 va al ICSPCLK del PIC, el pin 6 del PICKIT3 no es necesario conectarlo. A continuación muestro los pines del PIC que deben ser conectados al 16F887:

    pickit3 + pic16f887

    Descargar PICKIT 3

    El software para programar el PIC, sera la versión PicKit3 StandAlone, el cual es una versión lanzada por Microchip para programar los PIC sin necesidad de instalar el MPLAB.

    Puedes descargar el PicKit3 StandAlone V1.0 dando click aca.

    Puedes descargar el PicKit3SatandAlone V3.1o dando click aca

    La primera vez que ejecutamos el programa, nuestro PICKit 3 estará configurado unicamente para ser usado por el MPLAB X, como lo vemos en la siguiente figura:

    Para eso deberemos descargar el firmware para que el Standalone funcione, de la siguiente forma:

    Instalamos entonces el sistema operativo que se encuentra en la carpeta de instalación del PicKit3 Standalone, en mi caso por defecto está instalado en: C:\Program Files (x86)\Microchip\PICkit 3 v3

    A continuación se muestra un video con la primera configuración que debe hacerse en el Programa del PICKIT3 Standalone:

    IMPORTANTE: Si se desea trabajar con el MPLAB X, despues de haber cambiado el sistema operativo del PICKit 3, se debe revertir esta operación, de lo contrario el PICKit 3 NO VA A TRABAJAR CON MPLAB X, y saldrá el siguiente ERROR:

    The programmer could not be started: Could not connect to tool hardware: PICkit3PlatformTool, com.microchip.mplab.mdbcore.PICKit3Tool.PICkit3DbgToolManager

    Para eso, basta clicar en el Standalone donde dice Revert to MPLAB Mode:

    En el siguiente video vemos la implementación práctica del Ejemplo 1 – Encender y apagar un led, en la vida real:

    En el siguiente video vemos la implementación práctica del Ejemplo 2 – Retardo con PIC, en la vida real:

    Eso es todo por la entrada del dia de hoy, espero les haya gustado y hayan aprendido algo nuevo. Si te ha servido el contenido de esta entrada, de los videos y los códigos de implementación y deseas apoyar mi trabajo invitandome a un café super barato, puedes hacerlo en el siguiente link:

    👉 Invitar a Sergio a un Café ☕️

    Que esten muy bien, nos vemos en la siguiente entrada.

    Entradas relacionadas

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

    Comentarios (31)

    Buenas tardes
    Deseo aprender programación en Pic Compiler usando el 18F4550

    Responder

    Bienvenido al Curso José, espero le saques el mayor provecho y aprendas mucho. Saludos.

    Responder

    Agradesco mucho su aporte a la enseñanaza y aprendizaje ,de verdad son de mucha importancia su literatura y practica.

    mil gracias

    jose pozo

    Responder

    !HOLA AMIGO¡
    Me gustaría que hicieras un video sobre como usar el modulo bluetooth HC-05.
    (Ya que estoy tratando de hacer una lampara de leds controlada mediante bluetooth y no he encontrado un video que explique tan claramente y detallado como usted).

    De antemano muchas gracias por subir estos videos :).

    Responder

    Muy buena explicación….gracias

    Responder

    De nada Luis, gracias por comentar. Saludos.

    Responder

    muy bueno , los videos me interesa

    Responder

    hola buenas tardes me gustaría saber si pudiera ayudarme en la programación de un pic para que salgan flechas en todas las direcciones tanto arriba como abajo, derecha e izquierda en un tiempo X, estoy haciendo una matriz led y no se programar el pic. Muchas gracias. si pudiera ayudarme se lo agradezco

    Responder

    Hola que tal! Estoy realizando un proyecto de letrero de leds con relays y C.A, pero la parte de los pulsos de reloj para activar el relay la quiero hacer con PIC en lenguaje ensamblador pero no tengo mucha idea de como realizar el programa sólo necesito pulsos de reloj tal y como lo haría un timer 555 aestable. Gracias. tengo el PIC16F887

    Responder

    Muchas gracias por ofrecernos tus conocimientos Sergio, te lo agradecemos bastante.

    Consulta: tengo entendido que los procesos «bootload» y «programar» son distintos, en bootload se cargan los ficheros para que el pic (que está vacío desde fabrica) pueda nacer por decirlo de alguna forma, y el proceso programar es cuando le enviamos un código programado por nosotros, el cual explicaste en este capítulo. Mi duda es si puedo usar el mismo Pickit 3 para hacer ambos procesos a un PIC que tengo que no está booteado (totalmente nuevo), y usando los mismos pines que has descrito.

    Gracias por tu tiempo
    Saludos!

    Responder

    Hola Carlos, NO, realmente lo que estamos haciendo aca es programar el PIC (bien sea que esté totalmente NUEVO o sea un PIC antiguo que tienes hace tiempo) de esa forma pasas el código que has programado a través del pickit3. El bootloader es algo diferente, y también necesitarás del pickit3 o otro programador para ejecutarlo la primera vez. Con el bootloader podrás programar tu microcontrolador a través de un puerto de comunicación serial sin la necesidad de continuar usando el pickit3 en tus futuras programaciones. Es parecido a como lo realiza el Arduino. No obstante para cargar el bootloader en el microcontrolador necesitarás usar el programador (pickit 3) la primera vez.

    Responder

    Me encantaría aprender Microcontroladores .

    Responder

    Bueno Lauro, puedes seguir todo el curso que tenemos aquí en el sitio WEB para dar los primeros pasos en la programación de microcontroladores. Saludos.

    Responder

    Muy buena la estructura de enseñanza, me ha ayudado mucho, es mucho más simple que el Lenguaje Assembler. Gracias por su gran apoyo

    Responder

    Gracias Teodoro. Saludos

    Responder

    Sergio, me gustaria proyectos con stepers y motores de ca. gracias

    Responder

    buen día

    amigo, para conectar al pickit3 un dspic33fj128mc802, donde no es claro en el datasheet los ICSPDAT y el ICSPCLK, a que pines los debería conectar?

    Responder

    Pagina 19 del Datasheet Juan. El ICSPDAT = PGED y el ICSPCLK= PEGEC,puedes usar cualquiera de los 3 que tiene PGED1, PGEC1 PGED2, PGEC2 PGED3, PGEC3

    Responder

    Profesor necesito activar dos entradas mediante push botón con sus respectivas salidas .en el ejemplo simplemente nos explico con un Led y un push botón puede ayudarme para desarrollar el código de dos entradas y dos salidas

    Responder

    Luis es lo mismo explicado aquí. Cada entrada en el trisA por ejemplo se configura con 1, cada salida con 0. Por ejemplo dos entradas en el puerto A sería (SET_TRIS_A(0B11);) y debes preguntar independientemente por cada entrada con dos (if) por ejemplo «if(bit_test(porta,0)){ …….} else {……..}» y luego la misma pregunta para el segundo push button «if(bit_test(porta,1)){ …….} else {……..}»

    Responder

    hola amigo buen tutorial una consulta estoy haciendo un timer en c estoy usando el oscilador interno del pic16f628a es un temporisador doble el detalle es en simulacion funciona pero en board no muestra nada en el lcd
    aqui el inicio no se si esta bien la cabecera
    #define LCD_ENABLE_PIN PIN_A3
    #define LCD_RS_PIN PIN_A2
    #define LCD_RW_PIN PIN_A5
    #define LCD_DATA4 PIN_B4
    #define LCD_DATA5 PIN_B5
    #define LCD_DATA6 PIN_B6
    #define LCD_DATA7 PIN_B7
    #use standard_io(A)
    //#use fixed_io(a_outputs=PIN_A1,PIN_A2,PIN_A3,PIN_A6)
    #include
    #define CRISTAL 4000000
    #define FRECUENCIA_TIMER1 CRISTAL/4 //
    int32 Ticker;
    int8 Segundos=0;

    Responder

    Parece estar definido bien. Tal vez en el montaje práctico no has conectado los pines de contraste del LCD o depronto no has colocado el master clear a positivo. Lo digo es porque si te simula bien, debe ser algún problema en el hardware.

    Responder

    hola sergio un gusto saludarte …hermano necesito tu ayuda estoy programando con ccs y pues no se como hacer para usar una funcion en un pic que cumpla lo siguiente en este caso con el pic 12f508 yo deseo que por un puerto funcione constantemente un pulso y que a la vez en otro pin haga otra funcion sin que sea afectada por la primera instruccion por decir que un led apague y prenda por 10ms y se mantenga alli y a la vez por otro pin salga otro pulso 200ms …cuando procedo hacer el programa se mezcla el tiempo de uno con el otro no logro independizar …espero me entiendas y agradezco mucho me puedas ayudar

    Responder

    Para eso no puedes usar el daly_ms() pues forzas a que el pic se detenga sin hacer nada y por eso se te mezclan los tiempos. Para tu aplicación deberás usar el TIMER0, puedes crear una rutina con una interrupción que vaya incrementando un contador cada 10ms por ejemplo para encender el led y cuando la cuenta llegue a 200 activas el estado lógico del pulso generado en el otro pin. Para aplicaciones precisas con tiempo, siempre es recomendable usar los Timers.

    Responder

    Hola, disculpa cuál es la función de la línea «#BYTE PORTB= 6», ¿Qué pasa si se pone?

    Responder

    Hola Rodrigo, esa linea le dice al compilador donde se ubica los pines del puerto B. Le esta diciendo que para hacer alguna cosa con el puerto, tiene que dirigirse al banco de memoria en la posición 6. A medida que vayas avanzando en el curso, se te será mucho más familiar estos conceptos.

    Responder

    Muy buen tutorial, pero tengo una duda si en el banco de memoria no fuera 05h sino por ejemplo f80h ¿como escribiria eso en #byte?

    Responder

    Hola Daniel, en ese caso lo escribes en Hexadecimal:
    #byte PORTA= 0x80

    Responder

    parcero como siempre gracias excelente

    Responder

    De nada Emerson, que bueno que te sirve el contenido del blog.

    Responder

    muy buen exelente

    Responder