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

UNIDAD 1

INGENIERIA Electrnica

Introduccin a
Programacin de
microcontroladores en
Lenguaje C

www.inacap.cl

Contenido
Programacin en C:

Caractersticas, Instrucciones;

Datos y operaciones en C.
COMPILAODRES PCB, PCW, PCH, PCHW, etc.
Definiciones de datos
Compilacin de un programa en lenguaje C
mediante instrucciones simples
Ejemplos demostrativos

www.inacap.cl

Programacin de sistemas basados en microprocesador


Lenguajes de bajo nivel: el ensamblador
Ejemplo: microcontrolador PIC 16C61

EPROM

11

Program
Memory
1001
00100001
1K x 14

11 1001 00100001
Instruccin

Operando

ANDLW 33d
Instruccin en ensamblador

www.inacap.cl

Programacin de sistemas basados en microprocesador


Lenguajes de bajo nivel: el ensamblador
; Rutina principal "modo RUN"

Fragmento de un programa en ensamblador para un


microcontrolador PIC 16C61

SIGUE4 BTFSC ANTIRB


GOTO SIGUE4

BTFSS PORTB,3

; Si alguien pulsa select durante

GOTO PROG

; el modo RUN pasa a modo programa

SIGUE10

Comentarios

BTFSC PORTB,2

GOTO SIGUE5
BTFSC VA_RA1
GOTO SIGUE4
BSF VA_RA1
GOTO SIGUE6
SIGUE5 BTFSS VA_RA1
GOTO SIGUE4
BCF VA_RA1
SIGUE6 BSF ANTIRB

Cada instruccin en ensamblador se traduce como una instruccin en


cdigo mquina

MOVLW 0x0F
MOVWF ARB_CTR

; Cuando se detecta que se ha llegado al medio ...


BCF INTCON,GIE
BCF STATUS,C

; Inhabilita interrupciones

www.inacap.cl

; Actualiza la base de tiempo

Programacin de sistemas basados en microprocesador


Lenguajes de bajo nivel: el ensamblador
; Rutina principal "modo RUN"

:02000000CE2808
:08000800012A82073F3448344D

SIGUE4 BTFSC ANTIRB

compilacin

GOTO SIGUE4

:10001000483448343F347F344934493449343634E1
:100020003E3441344134413422347F34413441340C
:1000300041343E347F3449344934493449347F347F

BTFSS PORTB,3

:1000400048344834483440343E34413441344534F3

GOTO PROG

:1000500026347F340834083408347F344134413442

l ca
Vo

SIGUE10

Cdigo mquina

Archivo.hex
:100060007F344134413406340134013401347E3468

BTFSC PORTB,2

do

GOTO SIGUE5

am

BTFSC VA_RA1

ia
or
em

GOTO SIGUE4
BSF VA_RA1
GOTO SIGUE6
SIGUE5 BTFSS VA_RA1
GOTO SIGUE4
BCF VA_RA1
SIGUE6 BSF
ANTIRBensamblador
Listado
MOVLWArchivo.asm
0x0F
MOVWF ARB_CTR
BCF INTCON,GIE
STATUS,C

BCF

MOVF TSEMAN0,W
ADDWF
TCICLO0,W
MOVWF TREALM0
...

www.inacap.cl

Programacin de sistemas basados en microprocesador


Lenguajes de bajo nivel: el ensamblador

Caractersticas de la programacin en ensamblador:


Muy laborioso de programar
Es necesario conocer muchos detalles del funcionamiento interno del
sistema para poder realizar la programacin
Se tiene un control total de los recursos:
Mximo aprovechamiento de la memoria
Control total del tiempo de ejecucin

www.inacap.cl

Programacin de sistemas basados en microprocesador


Lenguajes de alto nivel: C, PASCAL, FORTRAN, BASIC,
Fragmento de un programa en C
:02000000CE2808
:08000800012A82073F3448344D

void visualizacion()

compilacin

{
if (!aux) {

:10001000483448343F347F344934493449343634E1
:100020003E3441344134413422347F34413441340C

vis=FALSE;

:1000300041343E347F3449344934493449347F347F

PORTB=0;

:1000400048344834483440343E34413441344534F3

Cdigo mquina

:1000500026347F340834083408347F344134413442

l ca
Vo

Archivo.hex
:100060007F344134413406340134013401347E3468

else {

do

PORTB=leds;

am

if (!no_leds) {

ia
or
em

no_leds=TRUE;
targetH+=2;
nCaracter--;
leds=0;
}
else {
no_leds=FALSE;
targetH+=2;
if (nCaracter)
Listado en{ C
if (--aux) obtenerH();

Archivo.c

}
else {
nCaracter=6;

www.inacap.cl

Programacin de sistemas basados en microprocesador


Lenguajes de alto nivel:

Caractersticas de la programacin en lenguajes de alto nivel:


Bastante menos laborioso de programar que el ensamblador
El compilador se encarga de generar el cdigo especfico para la mquina
que se est usando:
No es necesario conocer todos los detalles de la mquina
Mayor portabilidad: cambiar de mquina recompilar
No se tiene tanto control de los recursos como en ensamblador:
Menor aprovechamiento de la memoria
Calcular el tiempo que tarda en ejecutarse una parte del programa es
complejo

www.inacap.cl

Compilador C para PIC


CCS C

www.inacap.cl

Compilador C para PIC


CCS PIC COMPILER

Un compilador convierte un lenguaje de alto nivel a instrucciones en


cdigo mquina.

Un cross-compiler es un compilador que funciona en un procesador


(normalmente en PC) diferente al procesador objeto. Varios compiladores C
tiene como procesador objetos los PICmicro tal es el caso de HiTECH,
MicroChip y CCS.

Los programas son editados y compilados a instrucciones mquina en el


PC.

El cdigo mquina es cargado del PC al sistema PIC mediante el ICD2.


El cdigo es ejecutado en el PIC y puede ser depurado10(puntos de ruptura,
paso a paso, etc) desde elwPC.
ww.inacap.cl

Compilador C para PIC


CCS PIC COMPILER
Los elementos bsicos de un programa en C

Directivas de preprocesado

Indican al compilador cmo debe generar


el cdigo mquina.

Programas
Bloques de programa.

Siempre debe incluirse


main().

una

llamada

Sentencias
Instrucciones que definen lo que hace el
programa y la secuencia de ejecucin del
mismo.
Comentarios
Imprescindibles como documentacin del
cdigo fuente.
www.inacap.cl

11

Compilador C para PIC


VARIABLES
Una variable es un nombre asignado a una o varias posiciones de memoria
RAM.
En C es necesario declarar todas las variables antes de poder utilizarlas,
indicando el nombre asignado y el tipo de datos que en ella se van a
almacenar (opcionalmente tambin el valor inicial asignado).

tipo nombre_variable [=valor];

p.e.:int i;

Los tipos de datos aceptados en C estndar son cinco:


char (carcter)
int (entero)
float (coma flotante en 32 bits) double (coma flotante en 64 bits)
void (sin valor)
Las variables pueden ser locales o globales. Las variables locales slo
pueden ser usadas en la funcin en que se declaran, mientras que las
variables globales son compartidas por todas las funciones del programa
(deben declararse fuera de cualquier funcin y antes de ser utilizadas).
12

www.inacap.cl

Compilador C para PIC


VARIABLES
El compilador de CCS acepta los siguiente tipos de variable.
Especificacin
Significado
Tamao
Rango
char
carcter
8 bits
0 a 255 (sin signo)
int entero
8 bits
0 a 255 (sin signo)
float
coma flotante
32 bits
6 bits de precisin
double float doble precisin no soportado No para PCM
void
sin valor
nulo
ninguno
int1
entero de 1 bit
1 bit
0a1
int8
entero de 8 bits
8 bits
0 a 255 (sin signo)
int16
entero de 16 bits 16 bits
0 a 65535 (sin signo)
int32
entero de 32 bits 32 bits
0 a (232-1)
short
entero de 1 bit
1 bit
0a1
long
entero de 16 bits 16 bits
0 a 65535 (sin signo)

Los tipos de variable short y long pueden tener detrs la palabra int sin
efecto alguno.
13

www.inacap.cl

Compilador C para PIC


VARIABLES
Todos los tipos de datos son por defecto sin signo (unsigned) salvo los de
tipo float.
Para almacenar datos con signo, hay que introducir el modificador signed
delante del tipo. El efecto que se consigue es el recogido en la siguiente
tabla.
Especificacin
signed char
signed int16
signed long

Significado
Tamao
Rango
carcter con signo 8 bits
-128 a 127
entero con signo
16 bits
-16384 a 16383
coma flotante
16 bits
-32768 a 32767

Los nmeros negativos se codifican en complemento a 2.


Cuando se opera con distintos grupos de datos en una misma expresin, se
aplican una serie de reglas para resolver las diferencias. En general se
produce una promocin hacia los tipos de datos de mayor longitud
presentes en la expresin.
14
www.inacap.cl

Compilador C para PIC


FUNCIONES
Las funciones son los bloques constructivos fundamentales en C. Todas las
sentencias deben encontrarse dentro de funciones.
Las funciones deben ser definidas antes de ser utilizadas.
Formato general de definicin de una funcin:

tipo_dato_return nombre_func (tipo param1 , tipo param2 , )


{
cuerpo de la funcin (sentencias);
}
Las funciones pueden devolver un valor a la sentencia que las llama. El tipo
de dato devuelto se indica mediante tipo_dato (char, int16, long). Si no se
indica nada, se entiende que devuelve un entero. Si no devuelve nada,
debe incluirse una especificacin tipo void.

15

www.inacap.cl

Compilador C para PIC


FUNCIONES
La manera que tiene una funcin para devolver un valor es mediante la
sentencia return.
return (expresin); return expresin;
La expresin debe proporcionar el mismo tipo de dato que el especificado
en la funcin. Si no debe devolver nada, se finaliza con return;
Cuando una funcin se encuentra con una sentencia return se vuelve a la
rutina de llamada inmediatamente y las sentencias posteriores a return no
se ejecutan.
Adems de con las sentencia return, las funciones terminan su ejecucin y
vuelven al lugar desde donde se les llam cuando alcanzan la llave de
cierre de funcin } tras ejecutar la ltima sentencia de la misma.

16

www.inacap.cl

Compilador C para PIC


FUNCIONES
Adems de devolver valores, una funcin tambin puede recibir parmetros
(denominados argumentos) segn se indic en su definicin.
int suma (int a , int b) Parmetros formales
{
return (a+b);
}
main()
{
int c;
c = suma (10 , 23); Argumentos de llamada
}

Los argumentos se pueden pasar a las funciones por valor o por referencia.
La llamada por valor copia el argumento de llamada en el parmetro
formal de la funcin (No modifica su valor en la funcin de partida).
La llamada por referencia usa la direccin de la variable que se pasa a la
funcin (se consigue usando punteros o arrays).
17

www.inacap.cl

Compilador C para PIC


OPERADORES
El lenguaje C define numerosos operadores mediante los cuales se
construyen las expresiones (combinacin de operadores y operandos).

De asignacin

Aritmticos

18

www.inacap.cl

Compilador C para PIC


OPERADORES
Relacionales

Lgicos

De bits

19

www.inacap.cl

Compilador C para PIC


OPERADORES
In/decremento

Desplazamiento bit

Direccin/indireccin

En lenguaje C profesional es muy frecuente usar abreviaturas.


As, por ejemplo, es ms habitual ver a += b; que a = a + b;
20

www.inacap.cl

Compilador C para PIC


OPERADORES

21

www.inacap.cl

Compilador C para PIC


DECLARACIONES

22

www.inacap.cl

Compilador C para PIC


Sentencias de control de programa

Sentencia if
Se ejecuta una sentencia o bloque de cdigo si la expresin que
acompaa al if tiene un valor distinto a cero (verdadero). Si es cero
(falso) contina sin ejecutar la sentencia o bloque de sentencias.
if (expresin)
sentencia; {
sentencia 1;
sentencia 2;
...
}

Sentencia if-else
Se evala una expresin y, si es cierta, se ejecuta el primer bloque
de cdigo (o sentencia 1). Si es falsa, se ejecuta el segundo.
if (expresin)
sentencia 1;
else
sentencia 2;

(expresin) ? (sentencia 1) : (sentencia 2);

23

www.inacap.cl

Compilador C para PIC


Sentencias de control de programa

Sentencia if-else
If (P1 !=0) c=20;
else c=0;

24

www.inacap.cl

Compilador C para PIC


Sentencias de control de programa

Sentencia if-if/else

If (a>b) {
If (a>d) c = 15;
else c=0; }

25

www.inacap.cl

Compilador C para PIC


Sentencias de control de programa

Sentencia if/else - if
If (a>b) {
If (a>d) c = 15;
}
else c=0;

26

www.inacap.cl

Compilador C para PIC


Sentencias de control de programa

Sentencia switch
Substituye a if-else cuando se realiza una seleccin mltiple que
compara una expresin con una lista de constantes enteras o
caracteres. Cuando se da una coincidencia, el cuerpo de sentencias
asociadas a esa constante se ejecuta hasta que aparezca break.
switch (expresin)
{
case constante 1:
grupo 1 de sentencias;
break;
case constante 2:
grupo 2 de sentencias;
break;
...
default:
grupo n de sentencias;
}

break es opcional. Si no
aparece se sigue con el case
siguiente.
No puede haber constantes
iguales en dos case de la
misma sentencia switch.
default es opcional y el bloque
asociado se ejecuta slo si no
hay ninguna coincidencia con
las constantes especificadas.
27

www.inacap.cl

Compilador C para PIC


Sentencias de control de programa

Sentencia switch
Switch (k) {
case 0:
x=1;
break;
case 2:
c=6;
b=15;
break;
case 3: x=12;
break;
default: break;
}

28

www.inacap.cl

Compilador C para PIC


Sentencias de control de programa

Sentencia de bucle for


Se emplea para repetir
sentencias.

una

sentencia

bloque

de

for (inicializacin ; condicin ; incremento)


{
sentencia(s);
}

En la inicializacin se le asigna un valor inicial a una variable que se


emplea para el control de la repeticin del bucle.

La condicin se evala antes de ejecutar la sentencia. Si es cierta,


se ejecuta el bucle. Si no, se sale del mismo.

El incremento establece cmo cambia la variable de control cada


vez que se repite el bucle.

Es posible anidar bucles for para modificar dos o ms variables de


control.
29
www.inacap.cl

Compilador C para PIC


Sentencias de control de programa

Sentencia de bucle for

For (i=1;i<=100;i++) {
delay_ms(33);
px=?px;
}

For (y=1;i<=99;y=y+3) {
delay_ms(33);
px=y;
}
30

www.inacap.cl

Compilador C para PIC


Sentencias de control de programa
Sentencia de bucle while
La repeticin se lleva a cabo mientras sea cierta una expresin.
while (expresin)
{
sentencia(s);
}
La expresin se evala antes de cualquier iteracin. Si es falsa, ya
no se ejecuta la sentencia o bloque de sentencias.
Sentencia de bucle do-while.
do
{
sentencia(s);
}
while (expresin)
Las sentencias se ejecutan antes de que se evale la expresin, por
lo que el bucle se ejecuta siempre al menos una vez.

31

www.inacap.cl

Compilador C para PIC


Sentencias de control de programa

Sentencia de bucle do-while/while

while (x>0 && y++<5) {


a=1;
b=45;
x=p1;
}

32

www.inacap.cl

Compilador C para PIC


Sentencias de control de programa

Sentencia de bucle while-do/while


do {
a=1;
b=45;
x=p1;
}
while (x>0 && y++>5);

33

www.inacap.cl

Compilador C para PIC


Comentarios
Los comentarios se incluyen en el cdigo fuente para explicar el
sentido y la intencin del cdigo al que acompaan. Son ignorados
por el compilador y no afectan a la longitud ni rapidez de ejecucin
del cdigo final.
Un comentario se puede colocan en cualquier lugar del programa y
pueden tener la longitud y el nmero de lneas que se quiera.
Hay dos formatos posibles para los comentarios.
Formato 1. Empiezan por // y finalizan con el final de la lnea.

// Esto es un comentario.
Formato 2. Empiezan por /* y finalizan por */. No es posible anidar
comentarios con este formato.
/* Esto tambin es
un comentario */
/* Pero esto que /* parece un comentario vlido*/ no lo es */
34

www.inacap.cl

Compilador C para PIC


C especfico para los PIC

Las principales diferencias entre compiladores residen en las


directivas (pre-processor commands) y en las funciones integradas
(built-in functions).

Al final de esta seccin se incluyen sendas listas con las directivas y


las funciones integradas correspondientes al compilador de CCS.

Directivas de preprocesado ms habituales:


#ASM
Las lneas entre estas dos directivas deben ser instrucciones
#ENDASM ensamblador que 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 sita en el byte x en memoria. Si ya
exista esa variable, se coloca fsicamente en la posicin
especificada.
35

www.inacap.cl

Compilador C para PIC


C especfico para los PIC
#DEFINE id texto

El identificador se sustituye por el texto adjunto.

#DEVICE chip

Define el micro para el que se escribe el cdigo.

#FUSES options
Define la palabra de configuracin para la grabacin
del
microcontrolador.
#INCLUDE <fichero>
#INCLUDE fichero

Se incluye el texto del fichero especificado en el


directorio o fuera de l.

#INLINE

La funcin 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 funcin que sigue a esta directiva se implementa de


manera separada (no INLINE). De esta manera se ahorra
ROM
36

www.inacap.cl

Compilador C para PIC


C especfico para los PIC
#ORG start

Sita el cdigo a partir de una determinada posicin de la


memoria de programa

#INT_xxxx

Indica que la funcin que sigue es un programa de


tratamiento de la interrupcin xxxx.
#INT_GLOBAL
Indica que la funcin que sigue es un programa genrico
de
tratamiento de interrupcin. No se incluye cdigo de
salvaguarda de registros ni de recuperacin como cuando se
usa #INT_xxxx.
#PRIORITY ints

Establece un orden de prioridad en las interrupciones.

#USE DELAY (clock = frecuencia en Hz)


Define la frecuencia del oscilador que se va a utilizar, que se
emplea para realizar los clculos para funciones integradas
de retardo.
37

www.inacap.cl

Compilador C para PIC


pre-processor commands

38

www.inacap.cl

Compilador C para PIC


built-in functions

39

www.inacap.cl

Compilador C para PIC


built-in functions

40

www.inacap.cl

Compilador C para PIC


PIC C COMPILER
INICIO > PIC-C > PIC C COMPILER

Se puede Crear o abrir un fichero (FILE > NEW / OPEN) o crear un


proyecto (conjunto de ficheros y opciones de compilacin que se
utilizan en un programa). Los proyectos tienen la extensin PJT.

Para crear un nuevo proyecto PROJECT > NEW > PIC WIZARD /
MANUAL CREATE

41

www.inacap.cl

Compilador C para PIC


PIC C COMPILER

PCB (12bit)
PCM (14bit)
PCH (PIC18)

COMPILAR (F9)
MONTARLO

42

www.inacap.cl

Compilador C para PIC


GESTION DE PUERTOS

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

Definiendo los registros como variables localizadas en RAM. Se


definen los puertos y los registros de direccin como variables de C y
se colocan en las posiciones reales de estos registros en la memoria
RAM de datos. Constituye la manera ms directa de trabajar con los
puertos E/S.

Usando las funciones integradas especficas del compilador. Se


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

Cuando se usan las funciones integradas del compilador de CCS, el


cdigo que introduce el compilador puede variar en cuanto a
tamao y tiempo de ejecucin. Depender de la activacin de
ciertas directivas de preprocesado:

#USE FAST_IO - #USE FIXED_IO - #USE STANDARD_IO


43

www.inacap.cl

Compilador C para PIC


GESTION DE PUERTOS: POR RAM
OPCIN 1. Definiendo los registros en la RAM. Se definen los registros PORTx
y TRISx como bytes y se sitan en la posicin correspondiente de la
memoria RAM. La directiva C utilizada es #BYTE:
#BYTE variable=constante;
#BYTE
#BYTE
#BYTE
#BYTE

TRISA = 0x85 //Variable TRISA en 85h.


PORTA = 0x05 //Variable PORTA en 05h.
TRISB = 0x86 //Variable TRISB en 86h.
PORTB = 0x06 //Variable PORTB en 06h.

Una vez definidas estas variables se pueden configurar y controlar


los puertos mediante comandos de asignacin.A partir de este punto,
estas variables permiten controlar los puertos y se pueden utilizar en
sentencias de asignacin.

TRISA = 0xFF; // 8 terminales de entrada


TRISB = 0x00; // 8 terminales de salida
TRISC = 0x0F; // 4 pin de mayor peso OUT,4 pin de menor peso IN
44

www.inacap.cl

Compilador C para PIC


GESTION DE PUERTOS: POR RAM

Escritura en los puertos:


PORTC = 0x0A; // salida del datos 00001010 por el puerto C

Lectura de puertos:
valor = PORTA; // Asigna el dato del puerto A a la variable valor.

Manejo de sentencias:
TRISD=0x0F;
if (PORTD & 0x0F) PORTD |= 0xA0; //comprueba los 4 terminales de
// menor peso del puerto D y si son
// 1111 saca por los 4 terminales de
// mayor peso el dato 1010.

45

www.inacap.cl

Compilador C para PIC


GESTION DE PUERTOS: POR RAM

El compilador de CCS incorpora una serie de funciones integradas


que permite manejar los bits de una variable previamente definida.
bit_clear (var,bit); //Pone a 0 el bit especfico (0 a 7) de la variable.
bit_set (var , bit); //Pone a 1 el bit especfico (0 a 7) de la variable.
bit_test (var , bit); //Muestra el bit especfico (0 a 7) de la variable.
swap (var);
//Intercambia los 4 bits de mayor peso por los 4
//de menor peso de la variable.
bit_set (PORTC , 4);
//saca un 1 por el terminal RC4
if (bit_test(PORTB,0)==1) bit_clear(PORTB,1); //si RB0 es 1 borra
RB1

Tambin se puede declarar un bit de un registro con una variable


mediante la directiva #BIT y trabajar directamente con la variable.

#BIT nombre = posicin.bit #BIT RA4 = 0x05.4


......
RA4 = 0;
www.inacap.cl

46

Compilador C para PIC


GESTION DE PUERTOS: POR RAM
Ejemplo: LED CONTROLADO POR BOTON

COMPILAR
(F9)
MONTARLO

47

www.inacap.cl

Compilador C para PIC


GESTION DE PUERTOS: POR DIRECTIVAS

OPCIN 2. Usando funciones integradas del compilador.

El compilador de CCS incorpora una serie de funciones integradas


orientadas a trabajar con los puertos E/S.
output_X (valor);
//Por el puerto correspondiente se 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 (valor); //Mediante valor=TRUE o valor=FALSE habilita
//deshabilita las resistencias de pull-up en PORTB.

48

www.inacap.cl

Compilador C para PIC


GESTION DE PUERTOS: POR DIRECTIVAS

Hay una serie de funciones asociadas a un terminal o pin*. El


parmetro pin* se define en un fichero include (por ejemplo,
16F876.h) con un formato del tipo PIN_Xn, donde X es el puerto y n
es el nmero de pin.
#define PIN_A0 40
#define PIN_A1 41
output_low (pin*); //Pin a 0.
output_high (pin*); //Pin a 1.
output_bit (pin* , valor);
//Pin al valor especificado.
output_toggle(pin*);
//Complementa el valor del pin.
output_float (pin*); //Pin de entrada, quedando a tensin flotante
input_state(pin*);
//lee el valor del pin sin cambiar su sentido
input(pin*);
// lee el valor del pin.

49

www.inacap.cl

Compilador C para PIC


GESTION DE PUERTOS: POR DIRECTIVAS

La generacin de cdigo para las funciones output_x( ) e input_x( )


depende de la ltima directiva del tipo #USE *_IO que est activa.

#USE FAST_IO (PUERTO) [PUERTO: A]


Cada vez que se emplea una funcin output...() se saca el valor
directamente al puerto, y cada vez que se emplea una funcin
input...() se lee el puerto, pero no se modifican previamente el
registro TRIS correspondiente.
El usuario debe asegurarse de que los registros TRIS estn cargados
adecuadamente antes de llamar a las funciones.
Ej. #USE FAST_IO (B)
#USE STANDARD_IO (PUERTO) [PUERTO: A]
Cada vez que se emplea una funcin output...() se inserta cdigo
previo para forzar a que el bit particular o el puerto completo sean de
salida (mediante la carga del TRIS correspondiente). Si se trata de
una funcin input...() se carga cdigo para definir bit o puerto
completo como de entrada.
sta es la opcin activa por defecto.
Ej. #USE STANDARD_IO (C)
50
www.inacap.cl

Compilador C para PIC


GESTION DE PUERTOS: POR DIRECTIVAS
#USE FIXED_IO (PUERTO_OUTPUTS=pin* , ...) [PUERTO: A]
Se genera cdigo relativo a la direccin de los datos de manera
previa cada vez que aparece una funcin integrada del tipo input( )
output( ), pero los pines se configuran de acuerdo con la
informacin que acompaa a la directiva (slo se indican los pines de
salida) y no dependiendo de que la operacin sea de entrada o de
salida como sucede con #USE STANDARD_IO(PUERTO)
Ej. USE FIXED_IO (B_OUTPUTS = PIN_B2 , PIN_B3)

El efecto de colocar una u otra directiva se puede observar en los


ficheros *.lst que se generan como resultado de la compilacin. En
general se puede decir que resulta ms cmodo gestionar los pines
de E/S de modo STANDARD, pero hacindolo de modo FAST se
adquiere ms control de lo que se le est mandando al PIC y se
optimiza cdigo.

51

www.inacap.cl

Compilador C para PIC


GESTION DE PUERTOS: POR DIRECTIVAS

52

www.inacap.cl

Compilador C para PIC


GESTION DE PUERTOS: POR PUNTEROS

La memoria se puede acceder en C usando punteros. Los punteros deben


ser del tipo INT.
#define portb (int *) 0x06

portb es un puntero INT cuyo valor es la direccin del bus del


dispositivo. El puerto es accesible mediante el uso del operado *.
int p
p = *portb

En este ejemplo el valor del dato en el puerto direccionado en la


posicin de memoria 0x06 (puerto B) es asignado a la variable p.
Antes de que el puerto sea leido es necesario establecer si es de
entrada o salida
#define trisb (int *) 0x86
*trisb = 0xFF
53

www.inacap.cl

Compilador C para PIC


GESTION DE PUERTOS: POR PUNTEROS
Los pines pueden escritos o ledos mediante operadores
lgicos.
*portb |= 0b00000100;

pone el pin 2 del portB a 1

*portb &= 0b11111011;

pone el pin 2 del portB a 0.

Para lee el valor del pin 7 del portB:


If (*portb & 0b10000000) {..

54

www.inacap.cl

Compilador C para PIC


GESTION DE PUERTOS: POR PUNTEROS

55

www.inacap.cl

Compilador C para PIC


Ejemplo: DISPLAY
LCD con driver HD44780
1.- Vss (Masa)
2.- Vcc (Alimentacin de 2.7V a 5.5V)
3.- Ajuste de contraste (de 0 a 5.5V)
4.- RS (seleccin de registro)
5.- R/W (lectura/escritura)
6.- E (enable)
7.- D0 (dato LSB)
8.- D1
9.- D2
10.- D3
11.- D4
12.- D5
13.- D6
14.- D7 (dato MSB)

56

www.inacap.cl

Compilador C para PIC


Ejemplo: DISPLAY

57

www.inacap.cl

Compilador C para PIC


Ejemplo: DISPLAY

LCD en el compilador C de CCS


El compilador C de CCS incluye un driver para manejar LCD, el
fichero que define las funciones indicadas a continuacin.
lcd_init ();
Debe llamarse antes que ninguna otra funcin del fichero LCD.C.
Tal y como aparece en el fichero, adems de borrar el display,
configura el LCD para trabajar como sigue:
a) En formato de 4 bits, con dos lneas y con caracteres de 58
puntos.
b) Con display encendido, cursor apagado y sin parpadeo.
c) Con autoincremento del puntero de direcciones y sin
desplazamiento
del display real.
lcd_gotoxy (x , y);
Establece la posicin del LCD a la que se debe acceder.
Recurdese que la primera posicin de la primera lnea tiene
coordenadas (1 , 1), y que la primera posicin de la segunda lnea es
la (1 , 2).

58

www.inacap.cl

Compilador C para PIC


Ejemplo: DISPLAY
lcd_putc (dato);
Escribe dato en la posicin a la que apunta el puntero de
direcciones.
La variable dato es de tipo char, y se definen algunos caracteres
especiales:
\f Borra el display
\n Se posiciona en el inicio de la segunda lnea
\b Retrocede una posicin
lcd_getc (x , y);
Devuelve el carcter que ocupa la posicin (x , y) del LCD.

Por defecto, este driver usa siete bits del puerto B para establecer la
comunicacin entre el LCD y el microcontrolador (aunque tambin se
puede utilizar el puerto D).
B0 Enable
B4 Bit de datos D4
B1 RS
B5 Bit de datos D5
B2 R/W
B6 Bit de datos D6
B3 B7 Bit de datos D7
59

www.inacap.cl

Compilador C para PIC


Ejemplo: DISPLAY

Tambin es posible escribir en el LCD usando la siguiente funcin.

printf(lcd_putc,cadena,vars);
cadena: Cadena de caracteres que puede formarse usando el
contenido de una o ms variables.
vars: Variables incluidas en la cadena (separadas por comas).

Para indicar la posicin y el tipo de las variables a incluir en la


cadena, se usa el formato %nt, donde n es opcional.
n:
1-9 Indica el nmero de caracteres a mostrar
(opcional) 01-09 Indica el nmero de ceros a la izquierda
1.1-9.9 Indica cuntos decimales se han de mostrar
t:

c
s
u
x
d
g
w

Carcter
e Flotante (formato exp)
Cadena o carcter f
Flotante truncando
Entero sin signo
lu Entero largo sin signo
X Entero hexadecimal
lx lX Entero largo hexadecimal
Entero con signo
ld Entero largo con signo
Flotante rendondeado
Entero sin signo. La 1 cifra indica el total, la 2 el n de
decimales
60

www.inacap.cl

Compilador C para PIC


Ejemplo: DISPLAY
Algunos ejemplos.
printf(lcd_putc , Hola);
printf(lcd_putc , Tecla %c pulsada %u veces , key , cont );
Ejemplos de formato.
Especificador Valor=0x12
%03u
018
254
%u
18
254
%2u
18
???
%5
18
254
%d
18
-2
%x
12
fe
%X
12
FE
%4X
0012
00FE
%3.1w
1.8
25.4

Valor=0xfe

61

www.inacap.cl

Compilador C para PIC


Ejemplo: DISPLAY

El driver LCD.C est pensado para trabajar con el PORTB o el PORTD.

Si se quiere trabajar con otro puerto, como por ejemplo el PORTC, se


deben cambiar los datos en el fichero

#define use_portb_lcd TRUE permite seleccionar el PORT


62

www.inacap.cl

C1/CLKIN
C2/CLKOUT
CLR/Vpp/THV

0/AN0
1/AN1
2/AN2/V REF3/AN3/V REF+
4/T0CKI
5/AN4/S S

Compilador C para PIC


Ejemplo: DISPLAY
LCD2

RB0/INT
RB1
RB2
RB3/P GM
RB4
RB5
RB6/P GC
RB7/P GD
RC0/T1OSO/T1CKI
RC1/T1OSI/CCP2
RC2/CCP1
RC3/S CK/S CL
RC4/S DI/ SDA
RC5/S DO
RC6/TX /CK
RC7/RX /DT

RS
RW
E

D0
D1
D2
D3
D4
D5
D6
D7
7
8
9
10
11
12
13
14

4
5
6

1
2
3

VSS
VDD
VEE

LM016L

21
22
23
24
25
26
27
28
11
12
13
14
15
16
17
18

16F876

COMPILAR (F9)
MONTARLO

63

www.inacap.cl

Compilador C para PIC


Ejemplo: DISPLAY/MENU
LCD1

D0
D1
D2
D3
D4
D5
D6
D7

RS
RW
E
4
5
6

1
2
3

7
8
9
10
11
12
13
14

V SS
V DD
V EE

LM0 16L

U1
OS C1/CLKIN
OS C2/CLKOUT
MCLR/Vpp/THV
RA 0/A N0
RA 1/A N1
RA 2/A N2/VRE FRA 3/A N3/VRE F+
RA 4/T 0CKI
RA 5/A N4/SS

RB0/IN T
RB1
RB2
RB 3/PGM
RB4
RB5
RB 6/PGC
RB 7/PGD
R C0/T 1OSO/T1CKI
RC1/T1OS I/C CP2
RC2/CCP1
RC3/SCK/S CL
RC4/S DI/SDA
RC5/SDO
RC6/T X/C K
RC7/RX/D T

21
22
23
24
25
26
27
28
11
12
13
14
15
16
17
18

PI C16F87 6

COMPILAR (F9)
MONTARLO

64

www.inacap.cl

Compilador C para PIC


Ejemplo: TECLADO/DISPLAY

KEYPAD (3x4) en el compilador C de CCS

El compilador C de CCS incluye un driver KBD.C para manejar el


teclado (3x4).

kbd_get();
Devuelve el valor de la tecla pulsada en funcin de la tabla que
tiene programada.

Vista desde atrs

65

www.inacap.cl

Compilador C para PIC


Ejemplo: TECLADO/DISPLAY

El driver KBD.C est pensado para trabajar con el PORTB o el PORTD.

#define use_portb_lcd TRUE permite seleccionar el PORT

66

www.inacap.cl

Compilador C para PIC


Ejemplo: TECLADO/DISPLAY

Las conexiones vienen dadas en el fichero pero se pueden modificar:


col

pin(port)

LCD2

RA0/AN0
RA1/AN1
RA2/AN2/VREFRA3/AN3/VREF+
RA4/T0CKI
RA5/AN4/SS

RB0/INT
RB1
RB2
RB3/PGM
RB4
RB5
RB6/PGC
RB7/PGD
RC0/T 1OSO/T 1CKI
RC1/T 1OSI/CCP2
RC2/CCP1
RC3/SCK/SCL
RC4/SDI/SDA
RC5/SDO
RC6/T X/CK
RC7/RX/DT

21
22
23
24
25
26
27
28

D0
D1
D2
D3
D4
D5
D6
D7

RS
RW
E

4
5
6

7
8
9
10
11
12
13
14

2
3
4
5
6
7

OSC1/CLKIN
OSC2/CLKOUT
MCLR/Vpp/T HV

VSS
VDD
VEE

U1
9
10
1

1
2
3

LM016L

11
12
13
14
15
16
17
18

PIC16F876

C0

C1 C2

R0
R1
R
2
R3
67

www.inacap.cl

Compilador C para PIC


LCD2

Ejemplo: TECLADO/DISPLAY
2
3
4
5
6
7

OSC1/CLKIN
OSC2/CLKOUT
MCLR/Vpp/T HV
RA0/AN0
RA1/AN1
RA2/AN2/VREFRA3/AN3/VREF+
RA4/T0CKI
RA5/AN4/SS

RB0/INT
RB1
RB2
RB3/PGM
RB4
RB5
RB6/PGC
RB7/PGD
RC0/T 1OSO/T1CKI
RC1/T 1OSI/CCP2
RC2/CCP1
RC3/SCK/SCL
RC4/SDI/SDA
RC5/SDO
RC6/T X/CK
RC7/RX/DT

21
22
23
24
25
26
27
28

D5
D6
D7

D0
D1
D2
D3
D4

RS
RW
E

4
5
6

7
8
9
10
11
12
13
14

VSS
VDD
VEE

U1

9
10

1
2
3

LM016L

11
12
13
14
15
16
17
18

PIC16F876

68

www.inacap.cl

Compilador C para PIC


LCD2
LM01 6L

D0
D1
D2
D3
D4
D5
D6
D7

RS
RW
E

4
5
6

7
8
9
10
11
12
13
14

V SS
V DD
V EE

1
2
3

Ejemplo: TECLADO/DISPLAY
21
22
23
24
25
26
27
28
11
12
13
14
15
16
17
18

69

www.inacap.cl

Compilador C para PIC


Ejemplo: TECLADO/DISPLAY

COMPILAR (F9)
MONTARLO

70

www.inacap.cl

Compilador C para PIC


Ejemplo: TECLADO/DISPLAY

71

www.inacap.cl

Compilador C para PIC


Ejemplo: INTERRUPCIONES

Las directivas #INT_xxxx. Indican que la funcin que aparece a


continuacin corresponde al tratamiento de una interrupcin (no
tiene ni necesita parmetros).
En el caso de los PIC 16F87x hay 14 posibles directivas.

#INT_RTCC
#INT_RB
#INT_EXT
#INT_AD
#INT_TBE
#INT_RDA
#INT_TIMER1
#INT_TIMER2
#INT_CCP1
#INT_CCP2
#INT_SSP
#INT_BUSCOL
#INT_EEPROM

Desbordamiento de TMR0.
(T0IF)
Cambio en los pines RB<4:7>.
(RBIF)
Flanco en pin RB0.
(INTF)
Fin de conversin A/D.
(ADIF)
Buffer de transmisin USART vaco.
(TXIF)
Dato recibido en USART.
(RCIF)
Desbordamiento de TMR1.
(TMR1IF)
Desbordamiento de TMR2.
(TMR2IF)
Captura / Comparacin en mdulo CCP1.
(CCP1IF)
Captura / Comparacin en mdulo CCP2.
(CCP2IF)
Envo / Recepcin de dato serie sncrono. (SSPIF)
Colisin de bus I2C.
(BCLIF)
Escritura completa en EEPROM de datos.
(EEIF)
72

www.inacap.cl

Compilador C para PIC


Ejemplo: INTERRUPCIONES

La directiva #INT_DEFAULT. Indica que la funcin que viene a


continuacin ser llamada si se dispara una interrupcin y ninguno
de los flags est activo.

La directiva #INT_GLOBAL. Indica que la funcin que va a


continuacin sustituye todas las acciones que inserta el compilador al
aceptarse una interrupcin. Slo se ejecuta lo que vaya en dicha
funcin.

Ventajas de usar las directivas de interrupciones

El compilador genera el cdigo necesario para saltar a la funcin


que va tras esta directiva en el momento de la interrupcin.

Tambin genera cdigo para salvar al principio y restituir al final el


contexto, y borrar el flag que se activ con la interrupcin.

El programador
interrupciones.

debe

seguir

encargndose
73

www.inacap.cl

de

habilitar

las

Compilador C para PIC


Ejemplo: INTERRUPCIONES
Funciones para gestin de interrupciones. El compilador C de CCS
incluye algunas funciones integradas destinadas a manejar
interrupciones.

enable_interrupts (nivel);
nivel es una constante definida en 16F876.h y genera el cdigo
necesario para activar las mscaras necesarias.
Etiquetas de nivel definidas para el 16F876:
GLOBAL
INT_RTCC INT_RB
INT_EXT
INT_AD
INT_TBE
INT_RDA
INT_TIMER1
INT_TIMER2 INT_CCP1 INT_CCP2 INT_SSP
INT_PSP
INT_BUSCOL
INT_EEPROM
La mscara global (la que hace GIE=1) debe activarse de manera
independiente. Las otras slo activan la mscara particular y el PEIE
si es necesario.

disable_interrupts (nivel);
Hace la accin contraria a la funcin anterior, poniendo a 0 las
mscaras relacionadas con la interrupcin indicada.
74

www.inacap.cl

Compilador C para PIC


Ejemplo: INTERRUPCIONES
Existe tambin una funcin adicional destinada a configurar el flanco
activo que genera la interrupcin externa (en RB0).

ext_int_edge (H_TO_L);
Selecciona flanco de bajada para activar el flag INTF.
ext_int_edge (L_TO_H);
Selecciona flanco de subida para activar el flag INTF.

#INT_EXT
ext_isr() {
......}
enable_interrupts (INT_EXT); // Activa mscara INTE
ext_int_edge (H_TO_L);
// Flag INTF si flanco de bajada.
enable_interrupts (GLOBAL); // Habilita mscara global de int.
/* Si entra una interrupcin por flanco de bajada en RB0, se ir a la
funcin que aparece tras la directiva #INT_EXT */
disable_interrupts (INT_EXT); // Desactiva interrupciones en RB0.
disable_interrupts (GLOBAL); // Desactiva todas las interrupciones.
75

www.inacap.cl

Compilador C para PIC


SW1
SW-SPDT -MOM

D1
LED-GREE N

R1
180

Ejemplo: INTERRUPCIONES_RB0

COMPILAR (F9)
MONTARLO

76

www.inacap.cl

Compilador C para PIC


Ejemplo: TIMER0

TMR0 / WDT en el compilador C de CCS


Configuracin del mdulo TMR0.
setup_timer_0 (modo);
modo: RTCC_INTERNAL
(OPTION_REG 00h)
RTCC_EXT_L_TO_H (OPTION_REG 20h)
RTCC_EXT_H_TO_L (OPTION_REG 30h)
RTCC_DIV_2
(OPTION_REG 00h)
RTCC_DIV_4
(OPTION_REG 01h)
RTCC_DIV_8
(OPTION_REG 02h)
RTCC_DIV_16
(OPTION_REG 03h)
RTCC_DIV_32
(OPTION_REG 04h)
RTCC_DIV_64
(OPTION_REG 05h)
RTCC_DIV_128
(OPTION_REG 06h)
RTCC_DIV_256
(OPTION_REG 07h)
Se pueden agrupar constantes de distintos grupos con |.
77

www.inacap.cl

Compilador C para PIC


Ejemplo: TIMER0
Configuracin del mdulo WDT.
setup_wdt (modo);

modo: WDT_18MS
(OPTION_REG 08h)
WDT_36MS (OPTION_REG 09h)
WDT_72MS (OPTION_REG 0Ah)
WDT_144MS
(OPTION_REG 0Bh)
WDT_288MS
(OPTION_REG 0Ch)
WDT_576MS
(OPTION_REG 0Dh)
WDT_1152MS (OPTION_REG 0Eh)
WDT_2304MS (OPTION_REG 0Fh)

Para que el temporizador WATCHDOG pueda llevar a cabo su misin


es necesario indicarlo as con la directiva #fuses.
#fuses [opciones], WDT [opciones] WDT activado
#fuses [opciones], NOWDT [opciones] WDTdesactivado

78

www.inacap.cl

Compilador C para PIC


Ejemplo: TIMER0
Configuracin de los mdulos TMR0 y WDT (obsoleto).
Funciones implementadas en el compilador por compatibilidad con
versiones anteriores. No se recomienda su uso.
setup_counters (rtcc , prescaler);
rtcc:
RTCC_INTERNAL
(OPTION_REG 00h)
RTCC_EXT_L_TO_H (OPTION_REG 20h)
RTCC_EXT_H_TO_L (OPTION_REG 30h)
prescaler:
RTCC_DIV_2
(OPTION_REG 00h)
... ...
RTCC_DIV_256
(OPTION_REG 07h)
WDT_18MS
(OPTION_REG 08h)
WDT_36MS
(OPTION_REG 09h)
WDT_72MS
(OPTION_REG 0Ah)
WDT_144MS
(OPTION_REG 0Bh)
WDT_288MS
(OPTION_REG 0Ch)
WDT_576MS
(OPTION_REG 0Dh)
WDT_1152MS
(OPTION_REG 0Eh)
WDT_2304MS
(OPTION_REG 0Fh)

79

www.inacap.cl

Compilador C para PIC


Ejemplo: TIMER0

Escritura en el mdulo TMR0.


set_timer0 (valor);
valor: Entero de 8 bits.
Lectura del mdulo TMR0.
valor = get_timer0 ();
valor: Entero de 8 bits.

(TMR0 valor)

(valor TMR0)

Puesta a cero del Watchdog.


restart_wdt ();
No precisa ningn parmetro.

(equivale a CLRWDT)

80

www.inacap.cl

Compilador C para PIC


Ejemplo: TIMER0

Generar una seal cuadrada


de 1KHz utilizando la
interrupcin del Timer0.
Con un semiperiodo de
500us

#INCLUDE <16F876.h>
#use delay(clock=4000000)
#fuses XT,NOWDT
#use standard_io(B)
int1 var0=0;

//variable de cambio

500us=4/Fosc(256-x)
X=6
Con Fosc=4MHz y preescaler
1:2

#int_TIMER0
void TIMER0_isr(void) {
var0++;
//se complementa la variable
if (var0==1) output_bit(PIN_B0,1);
//para semiperiodo alto
else output_bit(PIN_B0,0);
//para semiperiodo bajo
set_timer0 (0x06); }
//se recarga el timer0

void main() {
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); //configuracin timer0
set_timer0 (0x06);
//carga del timer0
enable_interrupts(INT_TIMER0);
//habilita interrupcion timer0
enable_interrupts(global);
//habilita interrupcin general
while (1);
//bucle infinito
}

81

www.inacap.cl

Compilador C para PIC


Ejemplo: TIMER0

Para ajustar el tiempo se


carga el timer0 con 29
(0x1D).
Esto es debido a la
generacin de cdigo
ensamblador por parte del
compilador.

82

www.inacap.cl

Compilador C para PIC


Ejemplo: TIMER1

Registro T1CON (10h)

bits 5-4 T1CKPS1:T1CKPS0: Seleccin del prescaler


00: Prescaler1:1.
10: Prescaler1:4.
01: Prescaler1:2.
11: Prescaler1:8.
bit 3 T1OSCEN: Habilitacin del oscilador de TMR1
0: Apagado
1: Habilitado
bit 1 TMR1CS: Reloj de TMR1
0: Reloj interno (fOSC/4).
1: Reloj externo ( en RC0).
bit 2 T1SYNC: Control de la sincronizacin con el reloj externo
Slo si TMR1CS=1
0: Sincronizar
1: No sincronizar
bit 0 TMR1ON: Bit de encendido de TMR1
0: TMR1 apagado. 1: TMR1 encendido.
83

www.inacap.cl

Compilador C para PIC


Ejemplo: TIMER1
TMR1 en el compilador C de CCS

Configuracin del mdulo TMR1.


setup_timer_1 (modo);
modo: T1_DISABLED
(T1CON 00h)
T1_INTERNAL
(T1CON 85h)
T1_EXTERNAL
(T1CON 87h)
T1_EXTERNAL_SYNC
(T1CON 83h)
T1_CLK_OUT
(T1CON 08h)
T1_DIV_BY_1
(T1CON 00h)
T1_DIV_BY_2
(T1CON 10h)
T1_DIV_BY_4
(T1CON 20h)
T1_DIV_BY_8
(T1CON 30h)
Se pueden agrupar constantes de distintos grupos con |.

Lectura / Escritura en el mdulo TMR1.


valor = get_timer1 ();
set_timer1 (valor);
valor: Entero de 16 bits.
84

www.inacap.cl

Compilador C para PIC


Ejemplo: TIMER1
#include <16f876.h>
#fuses XT,NOWDT
#use delay(clock=4000000)
#use standard_io(b)

Configurar el mdulo TMR1


para generar una
temporizacin de 1s.
(dos de 0,5)

temp1s()
{
int cont=0;

0.5=4/Fosc(65536-x)P
X = 3036
Con Fosc=4MHz y preescaler
1:8

output_toggle(PIN_B1);
while (cont<2)
{
set_timer1 (3036);
while (get_timer1()>=3036);
cont++;
}
}
main ()
{
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8);

while(1){
temp1s();
}

85

www.inacap.cl

Compilador C para PIC


Ejemplo: TIMER2

Registro T2CON (12h)

bits 6-3 TOUTPS3:TOUTPS0: Seleccin del postscaler


0000: Postscaler1:1
0001: Postscaler1:2
0010: Postscaler1:3
.....
1111: Postscaler1:16
bit 2 TMR2ON: Bit de encendido de TMR2
0: Apagado 1: Habilitado
bits 1:0 T2CKPS1:T2CKPS0: Seleccin del prescaler
00: Prescaler1
01: Prescaler4
1x: Prescaler16
86

www.inacap.cl

Compilador C para PIC


Ejemplo: TIMER2
TMR2 en el compilador C de CCS
Configuracin del mdulo TMR2.
setup_timer_2 (modo,periodo,postscaler);
modo: T2_DISABLED (T2CON 00h)
T2_DIV_BY_1
(T2CON 04h)
T2_DIV_BY_4
(T2CON 05h)
T2_DIV_BY_16 (T2CON 06h)
periodo: Entero de 8 bits (0-255) que se pasa al registro PR2.
postscaler: Valor del postscaler (1-16).

Lectura / Escritura en el mdulo TMR2.


valor = get_timer2 ();
set_timer2 (valor);
valor: Entero de 8 bits.

87

www.inacap.cl

Compilador C para PIC


Ejemplo: TIMER2
INCLUDE <16F876.h>
#use delay(clock=4000000)
#fuses XT,NOWDT
#use standard_io(B)

Generar una seal cuadrada de


1KHz utilizando la interrupcin del
Timer2.
Temp=[Prescaler(PR2+1)Postscaler]Tins
tr
500us=(4/4000000)[4 (X+1) 1]

x = 125

int1 var0=0;
//variable de cambio
Con Fosc=4MHz
#int_TIMER2
preescaler 4
void TIMER2_isr(void) {
//Funcin Interrupcin
1
var0++;
//se complementa postscaler
la variable
if (var0==1) output_bit(PIN_B0,1); //para semiperiodo alto
else output_bit(PIN_B0,0);
//para semiperiodo bajo
set_timer0 (0x7C); }
//se recarga el timer0
void main() {
setup_timer_2 (T2_DIV_BY_4 ,124,1); //configuracin timer2
enable_interrupts(INT_TIMER2);
//habilita interrupcion timer0
enable_interrupts(global);
//habilita interrupcin general
while (1);
//bucle infinito
}

88

www.inacap.cl

Compilador C para PIC


Ejemplo: TIMER2

Para ajustar el tiempo se


carga el timer2 con 124
(0x7C).
Esto es debido a la
generacin de cdigo
ensamblador por parte del
compilador.

89

www.inacap.cl

Compilador C para PIC


Ejemplo: INTERRUPCIONES_TIMER
U1
9
10
1
2
3
4
5
6
7

OS C1/CLKIN
OS C2/CLKOUT
MCLR/V pp/ THV
RA 0/AN0
RA 1/AN1
RA 2/AN2/V RE FRA 3/AN3/V RE F+
RA 4/T0CKI
RA 5/AN4/S S

RB0/INT
RB 1
RB 2
RB 3/PGM
RB 4
RB 5
RB 6/PGC
RB 7/PGD
RC0/T1OS O/T 1CKI
RC1/T 1OSI/CCP2
RC2 /CCP1
RC3/SCK/ SCL
RC4/ SDI /SDA
RC5/SDO
RC6/T X/CK
RC7/RX/DT

21
22
23
24
25
26
27
28
11
12
13
14
15
16
17
18

D3

D1

D2

LE D-GRE EN LE D-GREENLE D-GREEN

R3

R1

R2

180

180

180

PIC16F876

COMPILAR (F9)
MONTARLO

90

www.inacap.cl

Compilador C para PIC


Ejemplo: INTERRUPCIONES_TIMER
Medir el ancho de un pulso mediante el TIMER1 y la Interrupcin Externa
por RB0.

El TIMER1 es un contador de 16 bits que se incrementa cada 4 ciclos de


Reloj (FOSC *4). A este tiempo le vamos a llamar PASO de TIMER1. Si el
cristal de cuarzo es de 4 Mhz, entonces 1s se produce un PASO de
TIMER1.

Un ciclo completo del TIMER1, desde 0x0000 hasta 0xFFFF (65536


pasos), ocupa un tiempo total de 1s * 65.536 = 65,536ms.

Podemos fijar un tipo de flanco a detectar y escribir un cierto cdigo


para ejecutarlo cuando ese tipo de flanco, subida o bajada, es
detectado. este cdigo escrito para tratar la interrupcin externa por
RB0 podemos mantener o cambiar el flanco a detectar, cambindolo
del de Subida al de Bajada o viceversa y leer o escribir el valor de
TIMER1 que en ese momento tiene el contador.

91

www.inacap.cl

Compilador C para PIC


Ejemplo: INTERRUPCIONES_TIMER
1. Se configura la INTEXT por RB0 para detectar inicialmente el Flanco de
Subida.
2.

Al llegarnos este Flanco de Subida se guarda el valor en ese momento de


TIMER1.

3. Se cambia la configuracin de la INTEXT por RB0 para detectar el


siguiente Flanco de Bajada.
4. Cuando llegue el Flanco de Bajada se guarda de nuevo el valor de
TIMER1.
5. Se vuelve a configurar la INTEXT por RB0 para detectar de nuevo un
Flanco de Subida.
6. Con estos dos valores de TIMER1 se obtiene, expresados en PASOS de
TIMER1, restando el segundo del primero, el tiempo que ha permanecido
en alto el Pulso. Multiplicando dicho nmero de PASOS de TIMER1 por el
tiempo que dura cada PASO (dependiente del cristal) se obtiene el Tiempo
W.
7. El ancho de pulso mximo es de 65,536ms (un ciclo de TIMER1). El
mnimo depender del tiempo que tarda en programa en gestionar la
92
interrupcin y los clculos.

www.inacap.cl

Compilador C para PIC


Ejemplo: INTERRUPCIONES_TIMER
Modificar el fichero LCD.C para trabajar con el LCD en el puerto C
(guardarlo como LCD_MIO.C)
LCD2
LM01 6L

D0
D1
D2
D3
D4
D5
D6
D7

RS
RW

VSS

VDD
VEE

U1 (RB0/INT )

2
3
4
5
6
7

RA0/AN0
RA1/AN1
RA2/AN2/VREFRA3/AN3/VREF+
RA4/T 0CKI
RA5/AN4/SS

RB0 /INT
RB1
RB2
RB3/PGM
RB4
RB5
RB6/PGC
RB7/PGD
RC0/T 1OSO/T 1CKI
RC1/T1OSI/CCP2
RC2/CCP1
RC3/SCK/SCL
RC4/SDI/SDA
RC5/SDO
RC6/TX/CK
RC7/RX/DT

4
5
6

21
22
23
24
25
26
27
28

7
8
9
10
11
12
13
14

OSC1 /CLKIN
OSC2 /CLKOUT
MCLR/Vpp/THV

1
2
3

U1
9
10
1

11
12
13
14
15
16
17
18

PIC16F876

93

www.inacap.cl

Compilador C para PIC


Ejemplo: INTERRUPCIONES_TIMER

94

www.inacap.cl

Compilador C para PIC


Ejemplo: INTERRUPCIONES_TIMER

COMPILAR (F9)
MONTARLO

95

www.inacap.cl

Compilador C para PIC


Ejemplo: EEPROM INTERNA
LCD2

D0
D1
D2
D3
D4
D5
D6
D7

RS
RW
E
4
5
6

1
2
3

7
8
9
10
11
12
13
14

VSS
VDD
VEE

LM016L

U1
9
10
1
2
3
4
5
6
7

OSC1/CLKIN
OSC2/CLKOUT
MCLR/Vpp/THV
RA0/AN0
RA1/AN1
RA2/AN2/VREFRA3/AN3/VREF+
RA4/T 0CKI
RA5/AN4/SS

RB0/INT
RB1
RB2
RB3/PGM
RB4
RB5
RB6/PGC
RB7/PGD
RC0/T1OSO/T 1CKI
RC1/T1OSI/CCP2
RC2/CCP1
RC3/SCK/SCL
RC4/SDI/SDA
RC5/SDO
RC6/TX/CK
RC7/RX/DT

21
22
23
24
25
26
27
28
11
12
13
14
15
16
17
18

PIC16F876

Simularlo con el
ISIS y leer la
EEPROM con el
DEBUG

96

www.inacap.cl

Caractersticas generales en el PIC16F877


Ocho canales de conversin.
Cinco pines E/S de PORTA y los tres de PORTE
Convierte la seal analgica en un nmero digital de 10 bits.
Tensin de referencia seleccionable por software.
Puede ser VDD o la tensin aplicada en los pines RA2 y/o RA3
Posibilidad de seguir funcionando cuando el PIC est en modo
SLEEP.
Hay 11 registros asociados a este perifrico.
Definicin de pines de entrada
TRISA - PORTA - TRISE - PORTE
Manejo de interrupcionesI
NTCON - PIE1 - PIR1
Control del conversor A/D
ADCON0 - ADCON1
ADRESH
w w- w
. i n a c -aADRESL
p.cl

97

98

www.inacap.cl

Registro ADCON0 (1Fh)


ADCS1
ADON

ADCS0

CHS1

CHS0

CHS2

GO/DONE

bit 7-6 ADCS1:ADCS0: Seleccin del reloj para la


conversin A/D
00 = fOSC / 2 01 = fOSC / 8 10 = fOSC / 32 11 = fRC

bit 5-3 CHS2:CHS0: Seleccin del canal de


conversin
000 = Canal 0

001 = Canal 1

010 = Canal 2

011 = Canal 3

100 = Canal 4

101 = Canal 5

110 = Canal 6

111 = Canal 7

bit 2 GO/DONE: Estado de la conversin


Si ADON=1:
1 = Conversin en progreso

0 = Conversin finalizada

bit 0 ADON: Bit de encendido del convertidor A/D


1 = Mdulo A/D encendido

0 = Mdulo A/D apagado


99

www.inacap.cl

Registro ADCON1 (9Fh)


ADFM

PCFG3

PCFG2

PCFG1

PCFG0

bit 7 ADFM: Seleccin de formato del resultado


1 = Ajuste a la derecha

0 = Ajuste a la izquierda

bit 3-0 PCFG3:PCFG0: Configuracin de las entradas al modulo A/D


PCFG3:
PCFG0

AN7
RE2

AN6
RE1

AN5
RE0

AN4
RE1

AN3
RE3

AN2
RA2

0000
0001
0010
0011
0100
0101
011x
1000
1001
1010
1011
1100
1101
1110
1111

A
A
D
D
D
D
D
A
D
D
D
D
D
D
D

A
A
D
D
D
D
D
A
D
D
D
D
D
D
D

A
A
D
D
D
D
D
A
A
A
A
D
D
D
D

A
A
A
A
D
D
D
A
A
A
A
D
D
D
D

A
VREF+
A
VREF+
A
VREF+
D
VREF+
A
VREF+
VREF+
VREF+
VREF+
D
VREF+

A
A
A
A
D
D
D
VREFA
A
VREFVREFVREFD
VREF-

www.inacap.cl

AN1
RA1

A
A
A
A
A
A
D
A
A
A
A
A
A
100
D
D

AN0
RA0

A
A
A
A
A
A
D
A
A
A
A
A
A
A
A

Registro INTCON (0Bh , 8Bh , 10Bh , 18Bh)


T0IF

GIE

PEIE

INTE

RBIE

T0IE

RBIF

INTF

bit 7 GIE: Habilitacin global de interrupciones


bit 6 PEIE: Habilitacin de interrupciones de perifricos
Registro PIE1 (8Ch)
CCP1IE PSPIE
TMR2IE

ADIE

TXIE

SSPIE

RCIE TMR1IE

bit 6 ADIE: Habilitacin de la interrupcin del convertidor


A/D
Registro PIR1 (0Ch)
CCP1IF PSPIF
TMR2IF

ADIF

TXIF

SSPIF

RCIF TMR1IF

bit 6 ADIF: Flag de la interrupcin del convertidor A/D


1 = Conversin A/D completada.
completada.

0 = Conversin A/D an no

www.inacap.cl

101

Pasos en una conversin A/D


1. Configurar el mdulo A/D.
- Definir entradas analgicas y tensin de referencia.
(ADCON1)
- Seleccionar el canal de la conversin.
(ADCON0)
- Seleccionar el reloj de la conversin. (ADCON0)
- Encender el mdulo A/D. (ADCON0)
2. Configurar la interrupcin por conversin A/D.
-

Bajar el flag ADIF. (PIR1)


Habilitar la interrupcin del convertidor A/D. (PIE1)
Habilitar las interrupciones de los perifricos.
(INTCON)
Habilitar la mscara global de interrupciones.
(INTCON)

3. Esperar a que transcurra el tiempo de adquisicin.


- Tiempo necesario para capturar el valor analgico a convertir.
- Los valores tpicos del tiempo de adquisicin son del orden de
20s.
102

www.inacap.cl

4. Comenzar la conversin.
- Poner a 1 el bit GO/DONE. (ADCON0)
No activar este bit a la vez que se enciende el convertidor A/D
5. Esperar a que se complete la conversin A/D.
a) Controlando cundo el bit GO/DONE se pone a 0.
b) Esperando a que llegue la interrupcin del convertidor.
6. Leer el resultado de la conversin.
- Disponible en los registros ADRESH:ADRESL.
- Bajar el flag ADIF si se estn usando interrupciones.
7. Llevar a cabo la siguiente conversin.
- Volver al paso 1 2, segn convenga.
- Espera mnima antes de empezar la siguiente adquisicin:
2TAD.
TAD: Tiempo necesario para la conversin de un bit.
103

www.inacap.cl

Tiempo de adquisicin
Tiempo necesario para cargar el condensador de
mantenimiento (CHOLD).

Mxima impedancia recomendada para la fuente: 10K.


En estas condiciones, TACQ 20s.
Mientras no se complete la conversin, no empieza otra
adquisicin.
Esperar TACQ : a) tras una conversin;
104
b) tras seleccionar un nuevo canal;
c) tras encender
w w w . i nel
a mdulo
c a p . c lA/D.

Tiempo de conversin
La conversin de 10 bits dura 12TAD.
TcicloTAD TAD TA
D

TA
D

TAD

TA

TA

TAD

TA

TAD

TA

TAD

b9 b8
b7 b6 b5 b4 b3 b2
b1 b0
Comienza
la conversin
Se carga
ADRES
Se pone GO/DONE a 0
Se abre SS (tp. 100ns)
Se levanta el flag ADIF
GO/DONE 1
CHOLD conectado a entrada
analgica

TAD configurable en ADCON0 (reloj de la conversin).


TAD=2TOSC

- TAD=8TOSC

- TAD=32TOSC

- TAD=2s6s (tp. 4s)

Para un funcionamiento correcto se necesita un valor mnimo de


TAD=1,6s.

105

www.inacap.cl

Funcin de transferencia
La primera transicin tiene lugar cuando la tensin
analgica de entrada alcanza el valor VREF- + (VREF+ VREF-)/1024 1LSb.

106

www.inacap.cl

Conversin A/D en el compilador C de CCS


Configuracin del mdulo conversor A/D
setup_adc (modo);
modo:

ADC_OFF (ADCON0 00h)

ADC_CLOCK_DIV_2

(ADCON0 01h)

ADC_CLOCK_DIV_8

(ADCON0 41h)

ADC_CLOCK_DIV_32

(ADCON0 81h)

ADC_CLOCK_INTERNAL

(ADCON0 C1h)

Definicin de entradas analgicas


setup_adc_ports (valor);
valor:

NO_ANALOGS

ALL_ANALOG

(ADCON1 86h)
(ADCON1 80h)

ANALOG_RA3_REF
A_ANALOG

(ADCON1 81h)
(ADCON1 82h)

A_ANALOG_RA3_REF
RA0_RA1_RA3_ANALOG

(ADCON1 83h)
(ADCON1 84h)

RA0_RA1_ANALOG_RA3_REF

(ADCON1 85h)

107

www.inacap.cl

Definicin de entradas analgicas (cont.)


setup_adc_ports (valor);
valor: ANALOG_RA3_RA2_REF

(ADCON1 88h)

ANALOG_NOT_RE1_RE2

(ADCON1 89h)

ANALOG_NOT_RE1_RE2_REF_RA3

(ADCON1 8Ah)

ANALOG_NOT_RE1_RE2_REF_RA3_RA2

(ADCON1 8Bh)

A_ANALOG_RA3_RA2_REF

(ADCON1 8Ch)

RA0_RA1_ANALOG_RA3_RA2_REF

(ADCON1 8Dh)

RA0_ANALOG

(ADCON1 8Eh)

RA0_ANALOG_RA3_RA2_REF

(ADCON1 8Fh)

Seleccin del canal analgico


set_adc_channel (canal);
canal: 0

(AN0)

1 (AN1)
2 (AN2)

3 (AN3)

(AN4)

(AN5)

(AN6)
7

(AN7)
108

www.inacap.cl

Lectura del resultado


valor = read_adc ();
valor: Entero de 16 bits segn la directiva #device adc= empleada.
La influencia de dicha directiva se recoge en la siguiente tabla

#device

8 bits

10 bits

11 bits

16 bits

adc=8

00-FF

00-FF

00-FF

00-FF

adc=10

0-3FF

adc=11

0-7FF

adc=16

0-FF00

0-FFC0

0-FFE0

0-FFFF

El fichero 16f877.h incluye como primera directiva #device PIC16F877A.


Es necesario incluir informacin del tipo de conversor A/D. Por ello los ficheros C que
usen este mdulo debern comenzar por
#include 16f877A.h
#device adc=10
109

www.inacap.cl

Ejemplo
setup_adc_ports (A_ANALOG);
setup_adc
(ADC_CLOCK_INTERNAL);
set_adc_channel (3);
delay_us (20);
valor = read_adc ();
setup_adc (ADC_OFF);

W ADCON0
WW&
00111000
ADCON0 W

www.inacap.cl

W 10000010
Banco 1
ADCON1 W
Banco 0
W ADCON0
W W & 00111000
W W | 11000001
ADCON0 W
W ADCON0
W W & 11000111
W W | 00011000
ADCON0 W
GO/DONE 1
Espera a
GO/DONE=0
W ADRESH
TEMP W
Banco 1
W ADRESL
Banco 0
REGL W
W TEMP
REGH W
110

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