Bienvenido a mi blog

  Hola! soy un aficionado a la electrónica y desde hoy me he propuesto aprender a programar microcontroladores PIC y la finalidad de este blog es simplemente ir plasmando los conocimientos que vaya adquiriendo durante mi aprendizaje para mi persona y para todo aquel que se tope con este blog. 

Estarán disponibles los códigos y simulaciones que he hecho junto a una explicación para que cualquiera pueda repetir las experiencias.

 

ORDEN DE CONTENIDOS

1. Elección del Lenguaje de Programación.
2. Primeros pasos con CCS encender un LED.
3. Utilizar un Display de 7 segmentos.
4. Aprender a trabajar con LCD
5. Teclado + LCD
6. Interrupciones
7. El Timer0
8.El Conversor Análogo Digital ADC
 

 

ANEXOS

1. Compilador C CCS.
2. Simulador PROTEUS.
3. Libro Compilador C CCS
4. Grabador de PICs.

 

Primeros Pasos con CCS encender un LED

    En la "entrada anterior" aprendimos a descargar e instalar el Compilador CCS, ademas  crear nuestro primer código fuente (vacío), en esta entrada aprenderemos un poco mas sobre como empezar a programar, para esto vamos a hacer el hola mundo de la electrónica, encender y apagar un LED.   Pero primero vamos a conocer un poco mas sobre este lenguaje de programación.

 Gestión de los puertos de Entrada y Salida: 

  Los puertos son el punto de comunicación entre el microncontrolador y el mundo exterior , a través de ellos se pueden recibir y enviar señales al exterior para efectuar procesos de control electrónico sobre otros dispositivos.
En el lenguaje CCS se pueden gestionar los puertos de 2 formas:

 1.- Declarando los registros TRISX y PORTX.

Se definen los registros PORTx y TRISx como bytes y se sitúan en la posición correspondiente de la memoria RAM. La directiva utilizada de C es #BYTE

 #BYTE variable=constante;
#BYTE TRISA = 0x85  //dirección del registro TRISA en el banco de memoria
#BYTE PORTA = 0x05  //dirección del registro PORTA en el banco de memoria
#BYTE TRISB = 0x86  //dirección del registro TRISb en el banco de memoria
#BYTE PORTB = 0x06  //dirección del registro PORTB en el banco de memoria
Una vez definidas estas variables se pueden configurar y controlar los puertos.
TRISA = 0xFF;   // todos los pines de entrada
TRISB = 0x00;   // todos los pines de salida
TRISC = 0x0F;   // 4 terminales de salida, 4 terminales de entrada
También podemos trabajar bit a bit con los registros o variables definidas previamente.
bit_clear(PIN_B0) ; //Pone a 0 el bit especifico de la variable
bit_set(PIN_B0); //Pone a 1 el bit especifico de la variable
bit_test(PIN_B0); //Muestra el bit especifico de la variable
o podemos definir todos los bits del puerto de una vez con:
PORTC = 0xFF;  //define todo el puertoA a 1 

2.- Utilizando las directivas especificas del compilador.

  El Lenguaje C admite unas directivas de compilación que le dicen al compilador cómo debe tratar los TRIS del puerto, esta es la manera mas simple de hacerlo y es la que usaremos.

Estas directivas son: USE FAST_IO, USE FIXED_IO, USE_STANDARD_IO

Si declaramos un puerto cómo #USE FAST_IO(PUERTO) 
Es el usuario quien debe asegurarse de que el sentido del pin es el correcto y para ello debe colocar antes de leer o escribir en el puerto correspondiente el SET_TRIS_X(0b00000000) para indicar el uso de entrada o salida de cada bit del puerto.

Si declaramos un puerto cómo #USE FIXED_IO(PUERTO_OUTPUTS=1,3,5,7) 

  El compilador genera e inserta en tu código los SET_TRIS_X(0b10101010) correspondientes a dicha declaración independiente del uso que tus instrucciones hagan después de dichos pines. Si has declarado con FIXED_IO de salida el pin 1 del puerto X y después lo lees el compilador no hará nada y estarás leyendo un puerto de salida.

Si por último declaramos el puerto cómo #USE STANDARD_IO(PUERTO)
   El compilador generará automáticamente e insertará antes de cualquier operación de entrada o salida de cualquier pin del puerto X los SET_TRIS_X() correspondientes a la instrucción que le sigue. Esto hace que los TRIS siempre estén de acuerdo con la instrucción a ejecutar. Si colocamos en nuestro código un OUTPUT_HIGH(PIN_B0) y el puerto B está declarado como #USE STANDARD_IO(B) justo antes del output habrá un TRIS declarando el PIN_B0 como salida, si a continuación ponemos un INPUT_(PIN_B0) el compilador pondrá ahora un TRIS para declarar PIN_B0 como entrada.

Este #USE STANDARD_IO(X) es el modo POR DEFECTO de todos los puertos en CCS si no se declara lo contrario.

Gestión de los puertos a través de Directivas:
output_X(valor);         //Por el puerto correspondiente saca el valor (0-255).
input_X();               //Se obtiene el valor en el puerto correspondiente.
set_tris_X(valor);       //Carga el registro TRISx con el valor (0-255)
port_b_pullups(true);    //Habilita  las  resistencias pul-up en el PORTB .        
get_trisX();             //Devuelve el valor del registro TRISx (x es A,B,C,D…)

Las funciones para trabajar bit a bit son:
output_low(pin*)  //Pin a 0.
output_high(pin*)  //Pin a 1
output_bit(pin*,valor)   //Pin al valor especificado
input(pin*);   //Lee el valor del pin.

Estructuras de Control Repetitivas

  Las estructuras de control repetitivas o iterativas, también conocidas como bucles se pueden usar cuando se quiere repetir  cierta parte del código n veces, otras permiten repetir un segmento de código cuando se cumplen ciertas condiciones.  

Bucle WHILE
  Este bucle ejecuta una instrucción o un conjunto de instrucciones mientras la condición se cumpla, generalmente a la condición se le coloca el valor true, para que siempre se repita.
while(condición)
 {
 segmento de código a repetir
 }
Bucle FOR
Este bucle permite ejecutar una instrucción o un bloque de instrucciones una cantidad determinada de veces. se suele reemplazar por el ciclo while cuando se conoce o se desea un cierto numero de iteraciones.
for(int i=0;i<10;i++)
 {
 bloque;
 }

Configuración de los FUSES

 La directiva FUSES establece los distintos bits de configuración del micro, los mismos que puedes seleccionar en tu software de grabación.
Cada micro tiene los suyos, y los podrás encontrar en el apartado "Configuration Word" del correspondiente datasheet, En CCS puedes encontrar los fuses correspondientes al microcontrolador que estamos usando en el menú VIEW > CONFIG BITS.

Nos aparecerá una lista con todos los fuses de microcontrolador que seleccionamos.

 
De esta lista los mas importantes son: 

WDT (Watchdog Timer):
#fuses WDT
#fuses NOWDT
El famoso "perro guardian" del pic. Esta es una capacidad del pic de autoresetearse. Es muy útil, por ejemplo si un Pic, por un descuido de programación, se queda en un bucle infinito, esta "utilidad" lo sacará de él. Su funcionamiento es sumamente sencillo. Simplemente es un registro que debemos borrar cada cierto tiempo. Si transcurrido un cierto tiempo el registro no ha sido borrado el pic se resetea.

OSC (Oscilador):
#fuses HS
#fuses XT 
Es el modo de oscilación que va a usar el Pic, los mas usados son:
XT:  viene de XTAL (cristal). Este modo de funcionamiento implica que tendremos que disponer de un cristal de cuarzo externo al Pic y dos condensadores.
HS: Para cuando necesitemos aplicaciones de "alta velocidad", mas de  8Mhz. Se basa también en un cristal de cuarzo, como el XT.

 PUT (Power Up Timer Reset):
#fuses PUT
#fuses NOPUT
Si activamos este FUSE, lo que conseguimos es que se genere un retardo en la inicialización del Pic. Esto se usa para que la tensión se estabilice, por lo que se recomienda su uso.

 Ahora  ya tenemos los conocimientos básicos necesarios para realizar nuestro primero proyecto el hola mundo de la electrónica encender y apagar un LED, vamos allá.


PROYECTO: Encender y apagar un LED, ademas agregar un retardo para que el encendido y apagado del led pueda ser visualizado correctamente. 

Código:
#include <16f886.h>         //definimos que microncontrolador usaremos     
#fuses nowdt                //no usar el WDT (watchdog timer)
#use delay(clock=20M)       //definimos un cristal de 20Mhz. 
void main()                 //declaramos la función principal
{
   while(true)              //bucle infinito
   {
   output_high(pin_b0);     //Pin B0 en alto
   delay_ms(200);           //retardo de 200ms
   output_low(pin_b0);      //Pin B0 en bajo
   delay_ms(200);           //retardo de 200ms
   }
}
Esquema Proteus:

Como Incorporar una Pantalla LCD

En esta entrada aprenderemos a utilizar una pantalla LCD la mas común es la 2x16


Esta es la manera de conectar la LCD generalmente usaremos 4 lineas para los datos (D4-D7) los bits RS,RW , GND VDD y VEE pin al cual ira un potenciómetro para regular el contraste, ademas de los pines bk+ y bk- para el blackligth en las pantallas que traen iluminación LED de fondo.
  
 

 PROYECTO: Enviar un mensaje a una pantalla LCD conectada al puertoC de microcontrolador.

CCS dispone de una librería para trabajar con pantallas LCD llamada lcd.h la cual llamamos con la
 instrucción: #include <lcd.c>     

La abrimos como muestra la imagen y dentro encontramos los comandos necesarios para controlarla:

lcd_init()   Must be called before any other function.               
                                                                       
lcd_putc(c)  Will display c on the next position of the LCD.         
                 \a  Set cursor position to upper left                 
                 \f  Clear display, set cursor to upper left           
                 \n  Go to start of second line                        
                 \b  Move back one position                            
lcd_gotoxy(x,y) Set write position on LCD (upper left is 1,1)        
lcd_getc(x,y)   Returns character at position x,y on LCD                                                        
                                                          
CONFIGURACION                                                        
Nos dice que podemos controlarla de 2 maneras utilizando 
                
a.) acceso por puerto                                 
con este codigo le decimos que utilizaremos un completo.  
ejemplo:                                        
#define LCD_DATA_PORT getenv("SFR:PORTC")           
                                                                       
b.) acceso por pines
aquí podemos usar los pines de la manera que queramos.   
ejemplo:                                       
     #define LCD_ENABLE_PIN  PIN_C0                                    
     #define LCD_RS_PIN      PIN_C1                                    
     #define LCD_RW_PIN      PIN_C2                                    
     #define LCD_DATA4       PIN_C4                                    
     #define LCD_DATA5       PIN_C5                                    
     #define LCD_DATA6       PIN_C6                                    
     #define LCD_DATA7       PIN_C7                                    

El codigo queda como sigue:
#include &lt16F886.h&gt
#FUSES NOWDT                                 //No Watch Dog Timer
#use delay(crystal=20000000)                 //reloj de 20Mhz
#define LCD_DATA_PORT getenv("SFR:PORTC")    //indicamos lcd conectada a PuertoC
#include &ltlcd.c&gt                         //librería LCD viene con el compilador

void main()
{
   lcd_init();                 //inilicializar LCD
 
   while(TRUE)
   {
      lcd_gotoxy(1,1);                 //ir a la linea 1 posicion 1
      printf(lcd_putc,"LCD 16x2");     //mensaje en linea1
      delay_ms(50);                    //retardo de 50ms
      lcd_gotoxy(1,2);                 //ir a la linea 2 posicion 1
      printf(lcd_putc,"hacermirobot"); //mensaje linea 2
      delay_ms(50);                    //retardo de 50ms
   }
}

Montaje en PROTEUS



PIC C Compiler CCS


Descripción

PIC C Compiler es un inteligente y muy optimizado compilador C que contienen operadores estándar del lenguaje C y funciones incorporados en bibliotecas que son específicas a los registros de PIC, proporcionando a los desarrolladores una herramienta poderosa para el acceso al hardware las funciones del dispositivo desde el nivel de lenguaje C.

El compilador CCS contiene más de 307 funciones integradas que simplifiquen el acceso al hardware, mientras que la producción eficiente y altamente optimizado código. Se incluyen funciones de hardware del dispositivo de características tales como:
  • Temporizadores y módulos PWM
  • Convertidores A / D de datos on-chip 
  • EEPROM.
  • Controladores LCD
  • Memoria externa buses
  • Entre otras... 

Link de Descarga: Compilador C CCS 5.015 Full
https://mega.nz/#!d0x2QbKb!Wb6v1rCbWh5hSQX_fzcktgFg3vZw1UdiHh__fGDGVJc

Link de Descarga: Manual CCS C Ingles.pdf
http://www.mediafire.com/view/o2xvod4w97c41ox/Manual_CCS_C_Ingles.pdf

Link de Descarga: Manual CCS C Español.pdf
http://www.mediafire.com/view/bho4vtm67t419rr/Manual_CCS_C_espa%C3%B1ol.pdf

Pasos de Instalación Compilador C CCS:
  1. Descomprimir el archivo descargado
  2. Ejecutar el archivo "ideutilsupd.exe", siga los pasos de instalacion
  3. Ejecutar el archivo "pcwhdupd.exe", siga los pasos de instalacion
  4. Para aplicar el crack primero abrimos la carpeta crack y copiamos los archivos:    "pcb.crg", #pcd.crg", "pch.cgr", "pcm.crg" luego copiamos en la carpeta donde se instaló el programa:     c:\program files (x86)\picc
  5. Reiniciamos nuestra pc y listo!!  
Una vez Instalado CCS procedemos a crear nuestro primer proyecto:
para esto Vamos a FILE > NEW > Source File nos aparece una ventana donde intrudicimos el nombre y la ubicación del archivo fuente que crearemos.


Nos aparece una ventana en blanco como la siguiente, donde podemos empezar a escribir nuestro primer código CCS.



Simulador PROTEUS



Descripción
    Proteus es un entorno integrado diseñado para la realización completa de proyectos de construcción de equipos electrónicos en todas sus etapas: diseño, simulación, depuración y construcción.

Con Proteus podrás realizar circuitos impresos con la mayor calidad. Si estás trabajando en el desarrollo de algún producto electrónico, esta aplicación te será de gran ayuda. Junto a ella diseñarás y simularás PCBs  con las mejore herramientas y en un entorno completamente funcional.

   Este software está conformado por dos dispositivos principales: ISIS y ARES. El primero de ellos será el encargado de la generación de circuitos reales. Una ventaja que te ofrecerá esta herramienta es la de evaluar el funcionamiento de tu trabajo en un PCB. De ese modo prevendrás errores y corregirás fallas.
En cuanto a ARES, su función consistirá en enrutar, situar y editar los diferentes componentes que hacen a la fabricación de placas PCB. En este sentido, convertirá tu diseño de modo que pueda ser aplicado en cada pieza de un circuito impreso. Además, dispondrás de un calificado espacio de simulación generado con la mejor tecnología.

Link de Descarga:
https://mega.nz/#!0lJy3D4S!Z3E-T7b4YsOLwDVlGYrbZJCGCknsXXqP0-YlNnhaU-8

Libro Compilador C CCS


  

[APORTE] Tutorial proteus y libro para programar PIC en C Título: Compilador CCS y simulador Proteus para microcontroladores PIC.
[APORTE] Tutorial proteus y libro para programar PIC en C Autor: Eduardo García Breijo.
[APORTE] Tutorial proteus y libro para programar PIC en C Idioma: Español.
[APORTE] Tutorial proteus y libro para programar PIC en C Tipo de archivo: pdf
[APORTE] Tutorial proteus y libro para programar PIC en C Tamaño: 27,73 MB.

Descripción

 Es un libro orientado a la programación de microcontroladores PIC utilizando el compilador CCS y el lenguaje C. También incluye tutoriales para probar los ejemplos y simularlos en el Proteus, un excelente programa que permite la simulación y prueba de circuitos. Una característica muy interesante es que permite utilizar microcontroladores y simular la ejecución del programa.


  Está enfocado a todos aquellos lectores movidos por el interés acerca de los microcontroladores PIC sin necesidad de tener conocimientos muy profundos en la materia. Los ejemplos desarrollados no tienen una excesiva complejidad, son breves y permiten ir afianzando los conocimientos capítulo a capítulo.

Contenido


En el capítulo 1 de este libro se hace una breve, pero intensa, descripción del ISIS de PROTEUS, de forma que el lector pueda afrontar la simulación de diseños sin ning·n problema. En el capítulo 2 tambien se realiza un repaso del compilador C para PIC de CCS; obviamente no puede explicarse este lenguaje en un solo capítulo,
pero tras su lectura cualquier lector podrá afrontar los pequeños programas de diseño que se exponen en los siguientes capítulos.

Del capítulo 3 al 7 se desarrollan los distintos módulos que integran un PIC (ADC, USART, CCP, etc.) a nivel hardware, enlazándolos con las correspondientes directivas y funciones del C. En cada capítulo se plantean y desarrollan sencillos ejemplos de aplicación que el lector podrá estudiar y, como no, modificar para completar sus conocimientos.

En el capítulo 8 se expone la gama alta (PIC18) y en el capítulo 9 una aplicación más compleja, el RTOS (Real Time Operating System). también en estos capítulos se incorporan distintos ejemplos de aplicación. Por ultimo, en el capítulo 10 se desarrolla el USB de reciente incorporación al ISIS.


Índice

1. ISIS de PROTEUS VSM
2. Compilador CCS C
3. La gestión de los puertos
4. Las interrupciones y los temporizadores
5.Convertidor Analógico Digital y Digital Analógico
6. Módulo CCP Comparador, Captura y PWM
7. Transmisión serie
8. Gama Alta PIC18
9. RTOS Real Time Operating System
11. ARES de PROTEUS VSM{

Link de Descarga:
http://www.mediafire.com/view/zz6bu4nhry36th4/Libro_Compilador_C.pdf



Que lenguaje usar para programar Microcontroladores PIC


Es la primera pregunta que debemos contestarnos al querer programar un microcontrolador, frente a esta pregunta eres tu el que debe decidir el lenguaje de programación, en esta entrada expongo el porque he elegido hacerlo en CCS.
 ASSEMBLER
 En mi opinión este es el mejor lenguaje para comenzar a programar, esto si queremos saber exactamente que estamos haciendo con el microcontrolador.
Mi recomendación es comenzar con lenguaje ensamblador aprender a utilizar los puertos a configurar registros etc, todo lo básico. Y luego pasarse a un lenguaje de alto nivel como CCS o C18. Esto es opcional si quieres comenzar directamente con CCS puedes hacerlo.

Ventajas

 - Precisión: Controla totalmente la operación del microcontrolador y permite al programador precisión en las operaciones.
- Herramienta educacional: permite conocer a detalle la arquitectura interna del microcontrolador, el set de instrucciones, los registros y su funcionamiento interno.
- Tamaño: los compiladores  generan más código máquina del necesario; por ello, el programa ejecutable crece. Por lo tanto cuando es importante reducir el tamaño del ejecutable, optimizando el uso de la memoria y teniendo también beneficios en velocidad, puede convenir usar el lenguaje Ensamblador.

Al ser un lenguaje más primitivo, el Ensamblador tiene ciertas desventajas:

- Códigos mas complejos desde el punto de vista del programador: en assembler debemos declarar correctamente todo lo que usaremos a diferencia de los lenguajes basados en C, esto hace que veamos nuestro código mas extenso y complejo.
- Tiempo programando: Para aplicaciones complejas no recomendaría asembler ya que se debe  invertir una cantidad de tiempo muchísimo mayor que con otros lenguajes.
- Falta de potabilidad:  debido a que depende de la estructura interna del microcontrolador, el código de un microcontrolador no puede correr en otro de diferente arquitectura.

Ejemplo de código assembler
PROCESSOR 16f886            ;seleccionamos que microcontrolador usaremos
#INCLUDE <16f886.inc>       ;carga librería del microcontrolador

     ORG 0x00               ;origen de programa            

     bsf STATUS,RP0         ;acceso al banco 1 de la memoria
     movlw b'0001111'
     movwf TRISA            ;configura el puertoA como entrada
     clrf TRISB             ;configura el puertoB como salida
     bcf STATUS,RP0         ;RP0 a 0 para acceder al banco 0

inicio
    movf PORTA,W            ;mueve el contenido del PuertoA a W
    movwf PORTB             ;mueve el dato de W al puertoB
    goto inicio             ;salta a inicio y entra en un bucle
    END                     ;fin del código

EL LENGUAJE C
Ventajas:

 - Facilidad de uso: Los programas en C son más fáciles de mantener (revisar, modificar, ampliar).
Existen muchísimas librerías libremente disponibles para el uso de cualquier programador, lo cual facilita el desarrollo de una aplicación.
- Potabilidad: Generalmente un programa escrito para un tipo de microcontrolador puede correr con mínimas modificaciones en otro microcontrolador de diferente arquitectura.

- Eficiencia: Es más rápido y eficiente que otros lenguajes de alto nivel usados también para programar microcontroladores  y su uso está altamente difundido en aplicaciones profesionales. Con compiladores modernos puede llegar a ser tan rápido como el ensamblador dependiendo de la habilidad y los recursos del programador.


Desventajas: 
- El código escrito en C ocupa más memoria que el escrito en ensamblador. 
 Los programas al compilarlos pueden resultar un poco extensos y pesados por ello debe tenerse en cuenta la capacidad de memoria de programa del PIC a utilizar.
- Control:Con este lenguaje no se puede controlar del todo los tiempos y los registros bit a bit.

 

Compilador CCS PCW HD

 Este es un compilador de punto flotante que puede integrarse al ambiente MPLAB IDE de Microchip.

  Un dato importante de este compilador, es que abstrae del hardware, y con ello sacas muy rápido tus proyectos, no tienes que conocer tan finamente al microcontrolador  que programas y sus "modulos", ademas trae una cantidad de librerías y programas de ejemplos,esto acorta increíblemente los tiempos de aprendizaje y desarrollo de los proyectos.

A continuación veremos algunas características que presenta el compilador PCW CCS y que hacen de él una buena opción para elegirlo como compilador de C para programar Microcontroladores PIC
  1. Al compilar genera un código máquina muy compacto y eficiente.
  2. Se integra perfectamente con MPLAB y otros simuladores/emuladores como PROTEUS para el proceso de depuración.
  3. Incluye una biblioteca muy completa de funciones precompiladas para el acceso al hardware de los dispositivos (entrada/salida, temporizaciones, conversor A/D, transmisión RS-232,bus I2C….,etc.
  4. Tiene numerosas librerías ya integradas al compilador para dispositivos externos, tales como pantallas LCD, teclados numéricos, memorias EEPROM, conversores A/D, relojes en tiempo real, etc.
  5. Permite insertar partes de código directamente en Ensamblador, manteniendo otras partes del programa en C.