Вы находитесь на странице: 1из 40

Título original:

Aprenda rápidamente a programar Microcontroladores PIC usando CCS.

AUTORIZADA LA REPRODUCCIÓN PARCIAL, NO TOTAL.

Diseño de portada : Franklin Rodríguez Acosta


Diagramación : Franklin Rodríguez Acosta
Diseño de logotipo : Jaime Vera

Windows es marca registrada y pertenece a Microsoft.


PIC es marca registrada y pertenece a Microchip.
PIC C compiler es marca registrada y pertenece a Custom Computer
Services.
ATCES es marca registrada y pertenece a ATCES.
Todas las marcas que aparecen o se mencionan en este libro son
registradas y pertenecen a sus propietarios.

© 2006: Franklin Rodríguez Acosta cyberec20@hotmail.com


Carlos Molina Crespo carlosmolina82@hotmail.com

Copyright © 2006 ATCES Corp. 1


Microcontroladores y C
Franklin Rodríguez Acosta

Requisitos:
9 Conocimiento de programación en C. (Declarar sentencias, funciones,
variables, etc.)

Introducción:
¾ En un programa C se
pueden diferenciar varios
elementos.

Directivas para Preprocesado:


¾ Indican al compilador
cómo debe generar el
código de máquina.

Funciones:
¾ Bloques funcionales del
programa.
¾ Siempre debe incluirse
una función llamada
main().

Sentencias:
¾ Instrucciones que definen
lo que hace el programa y
la secuencia de ejecución
del mismo.

Comentarios:
¾ Imprescindibles como documentación del código fuente.

Copyright © 2006 ATCES Corp. 2


INSTALACIÓN DEL PICC COMPILER DE CCS

En la carpeta CCS 3.235 ejecutar el archivo pcwhupd

Dar clic en siguiente (Next).

Copyright © 2006 ATCES Corp. 3


Aceptar los términos de la licencia. (Next)

Escoger la dirección de la carpeta de destino.


Presionar siguiente (Next).

Copyright © 2006 ATCES Corp. 4


Presionar siguiente (Next).

Esperar.

Copyright © 2006 ATCES Corp. 5


Presionar ok.
No se preocupen por los mensajes de error que pudieran aparecer.

Presionar ok.

Copyright © 2006 ATCES Corp. 6


Presionar ok.

Presionar Finalizar (Finish).

Copyright © 2006 ATCES Corp. 7


INSTALACIÓN DEL PARCHE DEL PICC COMPILER
DE CCS

En la carpeta CCS 3.235 ejecutar el archivo match

Seleccionar el buscador (Browse) representado por …

Copyright © 2006 ATCES Corp. 8


Buscar el archivo Ccsc.exe en la carpeta donde se instaló el compilador, seleccionarlo y
pulsar siguiente (Next).

Pulsar siguiente (Next).

Copyright © 2006 ATCES Corp. 9


Pulsar Aceptar.

Pulsar Finalizar (Finish).

Copyright © 2006 ATCES Corp. 10


Copyright © 2006 ATCES Corp. 11
C específico para los PICs
#ASM Las líneas entre estas dos directivas
#ENDASM deben ser instrucciones ensamblador y
se insertan tal y como aparecen.
#BIT id = x.y Se crea una variable tipo bit
correspondiente al bit y del byte x en
memoria.
#Byte id = x Se crea una variable y se sitúa en el
byte x en memoria. Si ya existía esa
variable se coloca físicamente en la
dirección especificada.
#Define id texto El identificador se sustituye por el
texto adjunto.
#Device chip Define el micro para el que se escribe
el código.
#Fuses options Define la palabra de configuración para
la grabación del microcontrolador.
#INCLUDE <fichero> Se incluye el texto del fichero
#INCLUDE “fichero” especificado en el directorio o fuera de
él.
#INLINE La función que sigue a esta directiva se
copia en memoria de programa cada
vez que se le llame. Puede servir para
mejorar la velocidad.
#SEPARATE La función que sigue a esta directiva se
implementa de manera separada (no
INLINE). De esta manera se ahorra
ROM.
#ORG Start Sitúa el código a partir de una
determinada posición de la memoria de
programa.
#INT_xxxx Indica que la función que sigue es un
programa de tratamiento de la
interrupción xxxx.
#INT_Global Indica que la función que sigue es un
programa genérico de tratamiento de la
interrupción. No se incluye código de
salvaguarda de registros ni de
recuperación como cuando se usa
#INT_xxxx
#PRIORITY ints Esta directiva se usa para establecer la
prioridad de las interrupciones.
Los elementos de mayor prioridad van
primero.
#USE DELAY(clock = frecuencia en HZ) Define la frecuencia del oscilador que
se va a utilizar, que se emplea para
realizar los cálculos para las funciones
integradas de retardo.

Copyright © 2006 ATCES Corp. 12


Copyright © 2006 ATCES Corp. 13
Las principales diferencias entre los compiladores residen en las directivas (pre-
processor commands) y en las funciones integradas (built-in functions).
Al principio de esta sección se incluyen listas con algunas directivas y funciones
integradas correspondientes al compilador de CCS.

PUERTOS DE E/S

Gestion de los puertos E/S

Existen dos opciones para configurar y manejar los puertos E/S.

¾ Definiendo los registros como variables localizadas en la RAM. Se definen


los puertos y los registros de dirección como variables de C y se colocan en las
posiciones reales de estos registros en la memoria RAM de datos.

¾ Usando las funciones integradas específicas del compilador. Se definen la


dirección de datos si es necesario y se gestionan las entradas y salidas mediante
funciones relativas al manejo de todo el puerto o de bits particulares del mismo.

La primera de las opciones indicadas constituye la manera más directa de trabajar con
los puertos de E/S.

Cuando se usan las funciones integradas del compilador de CCS, el código que produce
el compilador puede variar en cuanto a tamaño y tiempo de ejecución.

Copyright © 2006 ATCES Corp. 14


Ejemplo: PARPADEO DE UN LED

Abrir el compilador PIC C Compiler.

Crear un proyecto nuevo usando el PIC Wizard (La forma más sencilla de crear un
proyecto en el compilador PIC C).

Copyright © 2006 ATCES Corp. 15


Crear una carpeta para el proyecto.

Asignarle un nombre al proyecto y guardarlo.

Copyright © 2006 ATCES Corp. 16


Aparecerá la siguiente ventana.

En la parte inferior se encuentran las pestañas que nos permiten configurar el PIC.
En el presente proyecto sólo configuramos la primera pestaña (General).
Aquí escogemos el dispositivo que vamos a usar (PIC16F84A).
Fijamos una frecuencia de oscilador de 4Mhz.

Copyright © 2006 ATCES Corp. 17


Configuramos el oscilador.

Cuando damos clic en OK los archivos parpadeo.c y parpadeo.h se generan


automáticamente.

Copyright © 2006 ATCES Corp. 18


Ambos archivos pueden ser editados en cualquier momento, sin necesidad de volver a
usar el Wizard.

Copyright © 2006 ATCES Corp. 19


Compilamos el programa. (Presionar F9)

Copyright © 2006 ATCES Corp. 20


parpadeo.c
// OPCIÓN 2
// Definiendo los registros como variables localizadas en la RAM.
#include "C:\Microcontroladores\parpade_led\parpadeo.h"
//#BYTE puerto_b=06
#BIT B7 = 6.7

// B7 oscilará de la siguiente manera


// 1s en bajo
// 1s en alto

void main ()
{
set_tris_b(0x00); // PUERTO B COMO SALIDA
puerto_b = 0; // LIMPIAR SALIDAS DEL PUERTO B
do
{
delay_ms(1000);
//bit_set(puerto_b,7);
//output_high(PIN_B7);
B7 = 1;
delay_ms(1000);
//bit_clear(puerto_b,7);
//output_low(PIN_B7);
B7 = 0;
} while(1); // HACER SIEMPRE
}

Copyright © 2006 ATCES Corp. 21


parpadeo.c

// OPCIÓN 3
// Usando las funciones integradas específicas del compilador.
#include "C:\Microcontroladores\parpade_led\parpadeo.h"
#BYTE puerto_b=06

// B7 oscilará de la siguiente manera


// 1s en bajo
// 1s en alto

void main ()
{
set_tris_b(0x00); // PUERTO B COMO SALIDA
puerto_b = 0; // LIMPIAR SALIDAS DEL PUERTO B
do
{
delay_ms(1000);
//bit_set(puerto_b,7);
output_high(PIN_B7);
delay_ms(1000);
//bit_clear(puerto_b,7);
output_low(PIN_B7);
} while(1); // HACER SIEMPRE
}

Los tres programas hacen exactamente lo mismo.

Copyright © 2006 ATCES Corp. 22


SIMULACIÓN DEL CIRCUITO DE PARPADEO DE UN LED EN PROTEUS

Esquemático. Parpadeo de un Led. Frecuencia de oscilación ½ Hz.

Gráfico de la señal en RB7

Copyright © 2006 ATCES Corp. 23


Ejemplo: INCREMENTO – DECREMENTO
BINARIO EN LA SALIDA DEL PUERTO B
incdec.h
#include <16F84A.h>

#FUSES NOWDT //No Watch Dog Timer


#FUSES XT //Crystal osc <= 4mhz
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading

#use delay(clock=4000000)

incdec.c
#include "C:\Microcontroladores\incdecpb\incdec.h"
#byte puerto_a=05 //Direccion del puerto A
#byte puerto_b=06 //Direccion del puerto B

#define inc bit_test(puerto_a,0) //Incremento=PORT(A,0)


#define dec bit_test(puerto_a,1) //Decremento=PORT(A,1)

void main()
{

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);

set_tris_a(0xFF); //Puerto A como entrada


set_tris_b(0x00); //Puerto B como salida
puerto_b = 0; //Apagar todas las salidas
do
{
if (inc) //Presiono boton de incremento??
{
puerto_b+=1; //Incremente
do {} while(inc); //No haga nada mientras siga presionado
}
if (dec) //Presiono boton de decremento??
{
puerto_b-=1;
do {} while(dec); //No haga nada mientras siga presionado
}

} while(1); //Hacer siempre


}

Copyright © 2006 ATCES Corp. 24


SIMULACIÓN DEL CIRCUITO EN PROTEUS

INC DEC RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0
0 0 0 0 0 0 0 0
X 0 0 0 0 0 0 0 1
X 0 0 0 0 0 0 1 0
X 0 0 0 0 0 0 1 1
X 0 0 0 0 0 1 0 0
X 0 0 0 0 0 1 0 1
X 0 0 0 0 0 1 0 0
X 0 0 0 0 0 0 1 1
X 0 0 0 0 0 0 1 0

Copyright © 2006 ATCES Corp. 25


Ejemplo: MANEJO DEL TECLADO Y LA LCD
Crear un proyecto Nuevo.

Escogemos el dispositivo que vamos a usar (PIC16F8774A).


Fijamos una frecuencia de oscilador de 4Mhz.
Configuramos el oscilador para <= 4Mhz (XT).

Copyright © 2006 ATCES Corp. 26


En la pestaña Drivers escogemos LCD driver.
Damos clic en OK.

Copyright © 2006 ATCES Corp. 27


teclado_lcd.h
#include <16F877A.h>
#device adc=8
#use delay(clock=4000000)
#fuses NOWDT,RC, NOPUT, NOPROTECT, NODEBUG, BROWNOUT, LVP, NOCPD, NOWRT

teclado_lcd.c
#include "C:\Microcontroladores\teclado_lcd\teclado_lcd.h"
#include "C:\Microcontroladores\teclado_lcd\KEYPADCTRL1.c"
#include "C:\Microcontroladores\teclado_lcd\LCD.C"

void main()
{
char key;

lcd_init(); // Must be initialize before any other lcd function


while(1)
{
key = kbd_getkey();
// Scan for a key and return ASCII value of the Key pressed.

switch (key)
{
case '0': lcd_putc("0"); break;
// lcd_putc("0") Will display c on the next position of the LCD
case '1': lcd_putc("1"); break;
case '2': lcd_putc("2"); break;
case '3': lcd_putc("3"); break;
case '4': lcd_putc("4"); break;
case '5': lcd_putc("5"); break;
case '6': lcd_putc("6"); break;
case '7': lcd_putc("7"); break;
case '8': lcd_putc("8"); break;
case '9': lcd_putc("9"); break;
case '#': lcd_putc("#"); break;
case '*': lcd_putc("*"); break;
default: break;
}
}
}

Copyright © 2006 ATCES Corp. 28


KEYPADCTRL1.c
// Se sugiere que el archivo este localizado dentro de la carpeta de nuestro proyecto.
// Hay que incluir el archivo en el programa. Ej. #include “C:\\…\KEYPADCTRL1.c”

//////////////////////////////////////////////////////////////////////////////////////////////////
// Creado por: IARC //
// Modificado por: Franklin Rodriguez //
// Carlos Molina //
// Programa modificado para que compile en PIC C de CCS. //
//////////////////////////////////////////////////////////////////////////////////////////////////

/******************************
********* DEFINITIONS *********
******************************/
#define KEYP_NUM_ROWS 4 //Numero de filas del teclado
#define KEYP_NUM_COLS 3 //Numero de columnas del teclado

#if defined(__PCH__)

#BYTE PORTA = 0xf80


#BYTE PORTB = 0xf81
#BYTE PORTC = 0xf82
#BYTE PORTD = 0xf83
#BYTE PORTE = 0xf84

#BYTE TRISA = 0xf92


#BYTE TRISB = 0xf93
#BYTE TRISC = 0xf94
#BYTE TRISD = 0xf95
#BYTE TRISE = 0xf96

#BYTE ADCON1 = 0xfc1

#else
#BYTE PORTA = 5
#BYTE PORTB = 6
#BYTE PORTC = 7
#BYTE PORTD = 8
#BYTE PORTE = 9

#BYTE TRISA = 0X85


#BYTE TRISB = 0X86
#BYTE TRISC = 0X87
#BYTE TRISD = 0X88
#BYTE TRISE = 0X89

#BYTE ADCON1 = 0X9F


#endif

Copyright © 2006 ATCES Corp. 29


//A excepcion de las definiciones cambiar PORTB x PORT(?)
//TRISC = TRIS(?) para cambiar los puertos a los que van conectadas las
//filas y columnas del teclado.

//CAMBIOS UTILES PORTBxPORTA


//*****************************

/******************************
***** FUNCIONES PROTOTIPO *****
******************************/
char scankeypad();
char keypadread();
char kbd_getkey (void);
//*****************************

char keycodes[12] = {'1','2','3','4','5','6','7','8','9','*','0','#'};

char keypadread()
// Find a key, wait for
// it to be released and return.
{ char key;
key = scankeypad();
if (key)
while (scankeypad() != 0)
/* Nothing */ ;
return key;
}

char kbd_getkey (void)


// Use the input routine from the *Keypad_Read* assembly file to
// Scan for a key and return ASCII value of the Key pressed.
{ char mykey;
while ((mykey = keypadread()) == 0x00)
/* Poll again */;
return mykey;
}

char scankeypad()
// Scan the keypad for a keypress.
// Return 0 for no press or the char pressed.
{ int8 row,col,tmp,idx;
char key=0;
int wait;

// Nibble Menos significativo de PuertoX como entrada


// Nibble mas significativo de PuertoX como salida
// Initialise Port for input, and PORTC for output

TRISB=0x0F;

Copyright © 2006 ATCES Corp. 30


for (row=0; row < KEYP_NUM_ROWS; row++)
{
// Drive appropriate row low and read columns:

PORTB = ~(16 << row);


for (wait=0; wait<100; ++wait);

tmp = PORTB;
// See if any column is active (low):
for (col=0; col<KEYP_NUM_COLS; ++col)

if ((tmp & (2<<col)) == 0)


{ idx = (row*KEYP_NUM_COLS) + col;
key = keycodes[idx];
goto DONE;
}
}
DONE:
// Deshabilitamos las salidas y
// retornamos el valor de la tecla presionada
TRISB = 0xFF;
return key;
}

/*Lo que esta comentado es lo que se ha cambiado del programa original


KEYPADCTRL1.C esta modificado con respecto ejemplo original que viene en Proteus
(PIC CALCULATOR).
Con respecto a lo original El PORT que ha comenzado en el bit cero de los puertos
ahora ha sido desplazado... Un lugar para las columnas o sea PORTX,0-->PORTX,1
2^0=1-->2^1=2
y cuatro lugares para las filas PORTX,0-->PORTX,4
2^0=1-->2^4=16
*/

Copyright © 2006 ATCES Corp. 31


SIMULACIÓN DEL USO DEL TECLADO Y LA LCD EN PROTEUS

Copyright © 2006 ATCES Corp. 32


MODULO DE CONVERSIÓN A/D
Pieza fundamental en muchos sistemas de medida y control desarrollados mediante
sistemas mixtos análogos – digitales.

Permite hacer llegar al controlador


digital la información suministrada por
el proceso analógico que se desea
controlar.
La conversión A/D se fundamenta en la
teoría de muestreo.
Si una señal continua, S(t), tiene una
banda de frecuencia en la que fm es la
mayor frecuencia, dicha señal podrá
reconstruirse sin distorsión a partir de
muestras de la señal tomada a una
frecuencia de valor fs > 2fm

El módulo ADC de los PICs


Características generales del PIC16F877
Ocho canales de conversión. Cinco pines de E/S de PORTA y los tres de PORTE.
Convierte la señal analógica en un número digital de 10 bits.
Tensión de referencia seleccionable por software. Puede ser VDD o la tensión
aplicada en los pines RA y/o RA3.
Posibilidad de seguir funcionando cuando el PIC está en modo SLEEP.
Hay 11 registros asociados a este periférico.

Copyright © 2006 ATCES Corp. 33


Copyright © 2006 ATCES Corp. 34
Lectura del resultado
valor = read_adc ();
valor: Entero de 16 bits según la directiva #device adc = empleada.

La influencia de dicha directiva se recoge en la siguiente tabla.

El fichero 16F877.h incluye como primera directiva #device PIC16F877.


Es necesario incluir información del tipo de conversor A/D. Por ello los ficheros C que
usen este módulo deberán empezar por:
#include <16f877.h>
#device adc = 10

Copyright © 2006 ATCES Corp. 35


Ejemplo: CONVERSIÓN ANÁLOGO DIGITAL
Crear un proyecto Nuevo.

Copyright © 2006 ATCES Corp. 36


Escogemos el dispositivo que vamos a usar (PIC16F8774A).
Fijamos una frecuencia de oscilador de 4Mhz.
Configuramos el oscilador para <= 4Mhz (XT).

Copyright © 2006 ATCES Corp. 37


En la pestaña Analog escogemos:
¾ La entrada(s) del PIC que utilizaremos para realizar la(s) conversión(es)
análoga(s)-digital(es). (A0)
¾ La resolución del conversor.
ƒ 8 bits
ƒ 10 bits
ƒ 16 bits
¾ El reloj para la conversión.

Copyright © 2006 ATCES Corp. 38


adc.h
#include <16F877A.h>
#device adc=10

#FUSES NOWDT //No Watch Dog Timer


#FUSES XT //Crystal osc <= 4mhz
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES BROWNOUT //Reset when brownout detected
#FUSES LVP //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected

#use delay(clock=4000000)

adc.c
#include "C:\Microcontroladores\analogo_digital\adc.h"
#include <lcd.c>
#include <stdlib.h>

void main()

{
float value,valdisp;

setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);

lcd_init();

while(1)
{
value = read_adc(); //Lee el valor que hay en el canal
valdisp=value*5/1023; //Transformamos el valor a voltaje

lcd_gotoxy(1, 1); //Posicionamiento en la LCD


printf(lcd_putc, "Voltaje"); //Imprimir mensaje en LCD
lcd_gotoxy(11, 2); //Posicionamiento en la LCD
printf(lcd_putc,"%6.3f", valdisp); //Mostrar valor
}
}

Copyright © 2006 ATCES Corp. 39


SIMULACIÓN DE LA CONVERSIÓN ANÁLOGO DIGITAL EN PROTEUS

Copyright © 2006 ATCES Corp. 40

Вам также может понравиться