Sei sulla pagina 1di 44

Compilador C para PIC

Clase 3 uP

CCS C

1
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 depurado (puntos de ruptura, paso a


paso, etc) desde el PC.

2
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 una llamada main().

Sentencias
Instrucciones que definen lo que hace el
programa y la secuencia de ejecucin del mismo.

Comentarios
Imprescindibles como documentacin del
cdigo fuente.

3
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).

4
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.

5
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 Significado Tamao Rango


signed char carcter con signo 8 bits -128 a 127
signed int16 entero con signo 16 bits -16384 a 16383
signed long coma flotante 16 bits -32768 a 32767

Los nmeros enteros 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.

6
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.

7
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.

8
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).

9
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

10
Compilador C para PIC
OPERADORES

Relacionales

Lgicos

De bits

11
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;

12
Compilador C para PIC
OPERADORES

13
Compilador C para PIC
DECLARACIONES

14
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; (expresin) ? (sentencia 1) : (sentencia 2);
else
sentencia 2;
15
Compilador C para PIC
Sentencias de control de programa
Sentencia if-if/else

If (P1 !=0) c=20;


else c=0;

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

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

16
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) break es opcional. Si no aparece se
{ sigue con el case siguiente.
case constante 1:
grupo 1 de sentencias;
break; No puede haber constantes iguales
case constante 2: en dos case de la misma sentencia
switch.
grupo 2 de sentencias;
break;
... default es opcional y el bloque
default: asociado se ejecuta slo si no hay
grupo n de sentencias; ninguna coincidencia con las
constantes especificadas.
}

17
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;
}

18
Compilador C para PIC
Sentencias de control de programa
Sentencia de bucle for
Se emplea para repetir una sentencia o bloque de sentencias.
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.

19
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;
}

20
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.

21
Compilador C para PIC
Sentencias de control de programa
Sentencia de bucle while-do/while

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


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

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

22
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 */

23
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.

24
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> Se incluye el texto del fichero especificado en el


#INCLUDE fichero 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

25
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.
26
Compilador C para PIC
pre-processor commands

27
Compilador C para PIC
built-in functions

28
Compilador C para PIC
built-in functions

29
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

30
Compilador C para PIC
PIC C COMPILER PCB (12bit)
PCM (14bit)
PCH (PIC18)

COMPILAR (F9)

MONTARLO

31
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

32
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 TRISA = 0x85 //Variable TRISA en 85h.
#BYTE PORTA = 0x05 //Variable PORTA en 05h.
#BYTE TRISB = 0x86 //Variable TRISB en 86h.
#BYTE 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
33
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.

34
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;

35
Compilador C para PIC
GESTION DE PUERTOS: POR RAM
Ejemplo: LED CONTROLADO POR BOTON

21
RB0/INT
22
RB1
23
RB2
24 SW1
RB3/PGM
25
RB4 SW-SPST-MOM
RB5
26 D1
27 LED-BLUE
RB6/PGC
28
RB7/PGD

11
RC0/T1OSO/T1CKI
12
RC1/T1OSI/CCP2
13 R1
RC2/CCP1
14 180
RC3/SCK/SCL
15
RC4/SDI/SDA
16
RC5/SDO
17
RC6/TX/CK
18
RC7/RX/DT

COMPILAR (F9)

MONTARLO

36
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 o
//deshabilita las resistencias de pull-up en PORTB.

37
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.

38
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)

39
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.

40
Compilador C para PIC
GESTION DE PUERTOS: POR DIRECTIVAS

41
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

42
Compilador C para PIC
GESTION DE PUERTOS: POR PUNTEROS

Los pines pueden escritos o leidos 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) {..

43
Compilador C para PIC
GESTION DE PUERTOS: POR PUNTEROS

44