programacion de microcontroladores

41
1 Unidad 2 Compilador C para PIC CCS C

Upload: pqesmijz

Post on 21-Dec-2015

17 views

Category:

Documents


1 download

DESCRIPTION

introduccion a PIC's

TRANSCRIPT

Page 1: programacion de microcontroladores

1

Un

ida

d 2

Compilador C para PICCCS C

Page 2: programacion de microcontroladores

2

Compilador C para PIC

CCS PIC COMPILER

• Un compilador convierte un lenguaje de alto nivel a instrucciones en código máquina.

• Un “cross-compiler” es un compilador que funciona en un procesador (normalmenteen PC) diferente al procesador objeto. Varios compiladores C tiene como procesadorobjetos los PICmicro tal es el caso de HiTECH, MicroChip y CCS.

• Los programas son editados y compilados a instrucciones máquina en el PC.

• El código máquina es cargado del PC al sistema PIC mediante el ICD2.

• El código es ejecutado en el PIC y puede ser depurado (puntos de ruptura, paso apaso, etc) desde el PC.

Nota: Ver documentos anexos sobre CCS

Page 3: programacion de microcontroladores

3

Compilador C para PIC

CCS PIC COMPILER

• Los elementos básicos de un programa en C

– Directivas de preprocesado

• Indican al compilador cómo debe generar elcódigo máquina.

– Programas• Bloques de programa.• Siempre debe incluirse una llamada main().

– Sentencias• Instrucciones que definen lo que hace elprograma y la secuencia de ejecución del mismo.

– Comentarios• Imprescindibles como documentación delcódigo fuente.

Page 4: programacion de microcontroladores

4

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 elnombre asignado y el tipo de datos que en ella se van a almacenar (opcionalmentetambién el valor inicial asignado).

tipo nombre_variable [=valor]; p.e.:int i;

•Los tipos de datos aceptados en C estándar son cinco:char (carácter) 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 sólo pueden serusadas en la función en que se declaran, mientras que las variables globales soncompartidas por todas las funciones del programa (deben declararse fuera de cualquierfunción y antes de ser utilizadas).

Page 5: programacion de microcontroladores

5

Compilador C para PIC

VARIABLES

• El compilador de CCS acepta los siguiente tipos de variable.

Especificación Significado Tamaño Rango

char carácter 8 bits 0 a 255 (sin signo)

int entero 8 bits 0 a 255 (sin signo)

float coma flotante 32 bits 6 bits de precisión

double float doble precisión no soportado No para PCM

void sin valor nulo ninguno

int1 entero de 1 bit 1 bit 0 a 1

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 0 a 1

long entero de 16 bits 16 bits 0 a 65535 (sin signo)

•Los tipos de variable short y long pueden tener detrás la palabra int sin efecto alguno.

Page 6: programacion de microcontroladores

6

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 deltipo. El efecto que se consigue es el recogido en la siguiente tabla.

Especificación Significado Tamaño Rango

signed char carácter 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 números negativos se codifican en complemento a 2.

•Cuando se opera con distintos grupos de datos en una misma expresión, se aplican unaserie de reglas para resolver las diferencias. En general se produce una “promoción”hacia los tipos de datos de mayor longitud presentes en la expresión.

Page 7: programacion de microcontroladores

7

Compilador C para PIC

FUNCIONES

•Las funciones son los bloques constructivos fundamentales en C. Todas las sentenciasdeben encontrarse dentro de funciones.

•Las funciones deben ser definidas antes de ser utilizadas.

•Formato general de definición de una función:

tipo_dato_return nombre_func (tipo param1 , tipo param2 , … )

{

cuerpo de la función (sentencias);

}

•Las funciones pueden devolver un valor a la sentencia que las llama. El tipo de datodevuelto se indica mediante tipo_dato (char, int16, long). Si no se indica nada, seentiende que devuelve un entero. Si no devuelve nada, debe incluirse una especificacióntipo void.

Page 8: programacion de microcontroladores

8

Compilador C para PIC

FUNCIONES

•La manera que tiene una función para devolver un valor es mediante la sentenciareturn.

return (expresión); return expresión;

•La expresión debe proporcionar el mismo tipo de dato que el especificado en lafunción. Si no debe devolver nada, se finaliza con return;

•Cuando una función se encuentra con una sentencia return se vuelve a la rutina dellamada inmediatamente y las sentencias posteriores a return no se ejecutan.

•Además de con las sentencia return, las funciones terminan su ejecución y vuelven allugar desde donde se les llamó cuando alcanzan la llave de cierre de función } trasejecutar la última sentencia de la misma.

Page 9: programacion de microcontroladores

9

Compilador C para PIC

FUNCIONES

•Además de devolver valores, una función también puede recibir parámetros(denominados argumentos) según se indicó en su definición.

int suma (int a , int b) Parámetros 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 parámetro formal de lafunción (No modifica su valor en la función de partida).• La llamada por referencia usa la dirección de la variable que se pasa a la función(se consigue usando punteros o arrays).

Page 10: programacion de microcontroladores

10

Compilador C para PIC

OPERADORES

•El lenguaje C define numerosos operadores mediante los cuales se construyen lasexpresiones (combinación de operadores y operandos).

•De asignación

•Aritméticos

Page 11: programacion de microcontroladores

11

Compilador C para PIC

OPERADORES

•Relacionales

•Lógicos

•De bits

Page 12: programacion de microcontroladores

12

Compilador C para PIC

OPERADORES

•In/decremento

•Desplazamiento bit

•Dirección/indirección

En lenguaje C “profesional” es muy frecuente usar abreviaturas.

Así, por ejemplo, es más habitual ver a += b; que a = a + b;

Page 13: programacion de microcontroladores

13

Compilador C para PIC

OPERADORES

Page 14: programacion de microcontroladores

14

Compilador C para PIC

DECLARACIONES

Page 15: programacion de microcontroladores

15

Compilador C para PIC

Sentencias de control de programa

– Sentencia if

• Se ejecuta una sentencia o bloque de código si la expresión que acompaña alif tiene un valor distinto a cero (verdadero). Si es cero (falso) continúa sinejecutar la sentencia o bloque de sentencias.

if (expresión)

sentencia; {

sentencia 1;

sentencia 2;

...

}

– Sentencia if-else

• Se evalúa una expresión y, si es cierta, se ejecuta el primer bloque de código (o sentencia 1). Si es falsa, se ejecuta el segundo.

if (expresión)

sentencia 1; (expresión) ? (sentencia 1) : (sentencia 2);

else

sentencia 2;

Page 16: programacion de microcontroladores

16

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;

Page 17: programacion de microcontroladores

17

Compilador C para PIC

Sentencias de control de programa

– Sentencia switch

• Substituye a if-else cuando se realiza una selección múltiple que compara unaexpresión con una lista de constantes enteras o caracteres. Cuando se da unacoincidencia, el cuerpo de sentencias asociadas a esa constante se ejecutahasta que aparezca break.

switch (expresión)

{

case constante 1:

grupo 1 de sentencias;

break;

case constante 2:

grupo 2 de sentencias;

break;

...

default:

grupo n de sentencias;

}

default es opcional y el bloqueasociado se ejecuta sólo si no hayninguna coincidencia con lasconstantes especificadas.

break es opcional. Si no aparece sesigue con el case siguiente.

No puede haber constantes igualesen dos case de la misma sentenciaswitch.

Page 18: programacion de microcontroladores

18

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;

}

Page 19: programacion de microcontroladores

19

Compilador C para PIC

Sentencias de control de programa

– Sentencia de bucle for

• Se emplea para repetir una sentencia o bloque de sentencias.

for (inicialización ; condición ; incremento)

{

sentencia(s);

}

• En la inicialización se le asigna un valor inicial a una variable que se empleapara el control de la repetición del bucle.

• La condición se evalúa antes de ejecutar la sentencia. Si es cierta, se ejecutael bucle. Si no, se sale del mismo.

• El incremento establece cómo cambia la variable de control cada vez que serepite el bucle.

• Es posible anidar bucles for para modificar dos o más variables de control.

Page 20: programacion de microcontroladores

20

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;

}

Page 21: programacion de microcontroladores

21

Compilador C para PIC

Sentencias de control de programa– Sentencia de bucle while

• La repetición se lleva a cabo mientras sea cierta una expresión.

while (expresión)

{

sentencia(s);

}

• La expresión se evalúa antes de cualquier iteración. Si es falsa, ya no se

ejecuta la sentencia o bloque de sentencias.

– Sentencia de bucle do-while.

do

{

sentencia(s);

}

while (expresión)

• Las sentencias se ejecutan antes de que se evalúe la expresión, por lo que elbucle se ejecuta siempre al menos una vez.

Page 22: programacion de microcontroladores

22

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

Page 23: programacion de microcontroladores

23

Compilador C para PIC

Comentarios– Los comentarios se incluyen en el código fuente para explicar el sentido y la

intención del código al que acompañan. Son ignorados por el compilador y noafectan a la longitud ni rapidez de ejecución del código final.

– Un comentario se puede colocan en cualquier lugar del programa y puedentener la longitud y el número de líneas que se quiera.

– Hay dos formatos posibles para los comentarios.

Formato 1. Empiezan por // y finalizan con el final de la línea.

// Esto es un comentario.

Formato 2. Empiezan por /* y finalizan por */. No es posible anidar comentarioscon este formato.

/* Esto también es

un comentario */

/* Pero esto que /* parece un comentario válido*/ no lo es */

Page 24: programacion de microcontroladores

24

Compilador C para PIC

C específico 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 sección se incluyen sendas listas con las directivas y lasfunciones integradas correspondientes al compilador de CCS.

Directivas de preprocesado más habituales:

#ASM Las líneas 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 xen memoria.

#BYTE id=x Se crea una variable y se sitúa en el byte x en memoria. Si yaexistía esa variable, se coloca físicamente en la posiciónespecificada.

Page 25: programacion de microcontroladores

25

Compilador C para PIC

C específico 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 código.

#FUSES options Define la palabra de configuración para la grabación delmicrocontrolador.

#INCLUDE <fichero> Se incluye el texto del fichero especificado en el#INCLUDE “fichero” directorio o fuera de él.

#INLINE La función que sigue a esta directiva se copia en memoria deprograma cada vez que se le llame. Puede servir paramejorar la velocidad.

#SEPARATE La función que sigue a esta directiva se implementa demanera separada (no INLINE). De esta manera se ahorraROM

Page 26: programacion de microcontroladores

26

Compilador C para PIC

C específico para los PIC

#ORG start Sitúa el código a partir de una determinada posición de lamemoria 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 interrupción. No se incluye código de

salvaguarda de registros ni de recuperación 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 cálculos para funciones integradas

de retardo.

Page 27: programacion de microcontroladores

27

Compilador C para PIC

pre-processor commands

Page 28: programacion de microcontroladores

28

Compilador C para PIC

built-in functions

Page 29: programacion de microcontroladores

29

Compilador C para PIC

built-in functions

Page 30: programacion de microcontroladores

30

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 compilación que se utilizan en unprograma). Los proyectos tienen la extensión PJT.

– Para crear un nuevo proyecto PROJECT > NEW > PIC WIZARD / MANUALCREATE

Page 31: programacion de microcontroladores

31

Compilador C para PIC

PIC C COMPILER

COMPILAR (F9)

MONTARLO

PCB (12bit)

PCM (14bit)

PCH (PIC18)

Page 32: programacion de microcontroladores

32

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 lospuertos y los registros de dirección como variables de C y se colocan en lasposiciones reales de estos registros en la memoria RAM de datos. Constituye lamanera más directa de trabajar con los puertos E/S.

– Usando las funciones integradas específicas del compilador. Se definen ladirección de datos si es necesario y se gestionan las entradas y las salidasmediante funciones relativas al manejo de todo el puerto o de bits particularesdel mismo.

• Cuando se usan las funciones integradas del compilador de CCS, el códigoque introduce el compilador puede variar en cuanto a tamaño y tiempo deejecución. Dependerá de la activación de ciertas directivas de preprocesado:

#USE FAST_IO - #USE FIXED_IO - #USE STANDARD_IO

Page 33: programacion de microcontroladores

33

Compilador C para PIC

GESTION DE PUERTOS: POR RAM

OPCIÓN 1. Definiendo los registros en la RAM. Se definen los registros PORTx y TRISxcomo bytes y se sitúan en la posición correspondiente de la memoria RAM. Ladirectiva 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 asignación.A partir de este punto, estas variables

permiten controlar los puertos y se pueden utilizar en sentencias de

asignación.

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

Page 34: programacion de microcontroladores

34

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.

Page 35: programacion de microcontroladores

35

Compilador C para PIC

GESTION DE PUERTOS: POR RAM

– El compilador de CCS incorpora una serie de funciones integradas que permitemanejar los bits de una variable previamente definida.

bit_clear (var,bit); //Pone a 0 el bit específico (0 a 7) de la variable.bit_set (var , bit); //Pone a 1 el bit específico (0 a 7) de la variable.bit_test (var , bit); //Muestra el bit específico (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 RC4if (bit_test(PORTB,0)==1) bit_clear(PORTB,1); //si RB0 es 1 borra RB1

– También se puede declarar un bit de un registro con una variable mediante ladirectiva #BIT y trabajar directamente con la variable.

#BIT nombre = posición.bit #BIT RA4 = 0x05.4

......

RA4 = 0;

Page 36: programacion de microcontroladores

36

Compilador C para PIC

GESTION DE PUERTOS: POR RAM

Ejemplo: LED CONTROLADO POR BOTON

RA0/AN02

RA1/AN13

RA2/AN2/VREF-4

RA4/T0CKI6

RA5/AN4/SS7

OSC1/CLKIN9

OSC2/CLKOUT10

RC1/T1OSI/CCP212

RC2/CCP113

RC3/SCK/SCL14

RB7/PGD28

RB6/PGC27

RB526

RB425

RB3/PGM24

RB223

RB122

RB0/INT21

RC7/RX/DT18

RC6/TX/CK17

RC5/SDO16

RC4/SDI/SDA15

RA3/AN3/VREF+5

RC0/T1OSO/T1CKI11

MCLR/Vpp/THV1

U1

PIC16F876

SW1SW-SPST-MOM

D1LED-BLUE

R1180

COMPILAR (F9)

MONTARLO

Page 37: programacion de microcontroladores

37

Compilador C para PIC

GESTION DE PUERTOS: POR DIRECTIVAS

• OPCIÓN 2. Usando funciones integradas del compilador.

– El compilador de CCS incorpora una serie de funciones integradas orientadas atrabajar 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.

Page 38: programacion de microcontroladores

38

Compilador C para PIC

GESTION DE PUERTOS: POR DIRECTIVAS

– Hay una serie de funciones asociadas a un terminal o pin*. El parámetro pin*se define en un fichero include (por ejemplo, 16F876.h) con un formato deltipo PIN_Xn, donde X es el puerto y n es el número 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 tensión flotanteinput_state(pin*); //lee el valor del pin sin cambiar su sentidoinput(pin*); // lee el valor del pin.

Page 39: programacion de microcontroladores

39

Compilador C para PIC

GESTION DE PUERTOS: POR DIRECTIVAS

– La generación de código para las funciones output_x( ) e input_x( ) dependede la última directiva del tipo #USE *_IO que esté activa.

#USE FAST_IO (PUERTO) [PUERTO: A…]– Cada vez que se emplea una función output...() se saca el valor directamente

al puerto, y cada vez que se emplea una función input...() se lee el puerto,pero no se modifican previamente el registro TRIS correspondiente.

– El usuario debe asegurarse de que los registros TRIS están cargadosadecuadamente antes de llamar a las funciones.

Ej. #USE FAST_IO (B)

#USE STANDARD_IO (PUERTO) [PUERTO: A…]– Cada vez que se emplea una función output...() se inserta código previo para

forzar a que el bit particular o el puerto completo sean de salida (mediante lacarga del TRIS correspondiente). Si se trata de una función input...() se cargacódigo para definir bit o puerto completo como de entrada.

– Ésta es la opción activa por defecto.Ej. #USE STANDARD_IO (C)

Page 40: programacion de microcontroladores

40

Compilador C para PIC

GESTION DE PUERTOS: POR DIRECTIVAS

#USE FIXED_IO (PUERTO_OUTPUTS=pin* , ...) [PUERTO: A…]– Se genera código relativo a la dirección de los datos de manera previa cada vez

que aparece una función integrada del tipo input…( ) ó output…( ), pero lospines se configuran de acuerdo con la información que acompaña a la directiva(sólo se indican los pines de salida) y no dependiendo de que la operación seade 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 *.lstque se generan como resultado de la compilación. En general se puede decirque resulta más cómodo gestionar los pines de E/S de modo STANDARD, perohaciéndolo de modo FAST se adquiere más control de lo que se le estámandando al PIC y se optimiza código.

Page 41: programacion de microcontroladores

41

Compilador C para PIC

GESTION DE PUERTOS: POR DIRECTIVAS