You are on page 1of 9

C para PIC

Bibliografa: El lenguaje de programacin C, Kernighan y Ritchie, Editorial Prentice Hall. Como programar en Lenguaje C, Biblioteca Tcnica de Programacin. Manual del Usuario de CC5X en formato Acrobat Reader. Instalacin de CC5X: Crear un directorio con el nombre CC5X: En DOS estando en el directorio raz escribir: MD CC5X y apretar la tecla Enter Si es en Windows 9X, usando el Explorador de Windows y ubicndose en el directorio raz con el botn derecho del ratn elegir NUEVO y en el men que se despliega elegir Carpeta, y por ltimo cambiarle el nombre a CC5X (aparece como Nueva Carpeta). Luego copiar todos los archivos del CC5X a este directorio, o descompactar el archivo dentro de este directorio. Luego copiar desde CC5X al directorio donde est instalado el MPLAB (usualmente es C:\Archivos de Programa\MPLAB) dos archivos llamados CC5X.MTC y TLCC5X.INI A continuacin abrir el MPLAB elegir el men PROJECT y en l, elegir sub item Install Language Tool. Aparecer una ventana como la siguiente:

Cambiar los campos Language Suite, Tool Name, y Executable a lo que se ve aqu arriba y Luego apretar el botn OK. Ver en MPLAB como se escribe un programa, se crea un projecto y se compila programando en C.

VARIABLES en C

Reglas para el nombre de variables


Los nombres se construyen con letras, nmeros y el carcter de subrayado _ que se considera igual que una letra. Maysculas y minsculas son consideradas distintas en lenguaje C. El primer carcter de un nombre de variable debe ser una letra. Por lo tanto la variable temp1 ser distinta de TEMP1, ambos nombres son vlidos.

Declaracin de Variables
Una declaracin de variable es una sentencia del programa en donde se especifica el Nombre de la variable y el tipo de dato que esta puede contener. Por ej. si escribimos: int Presion1; declara una variable con el nombre Presion1 que puede almacenar un entero de 8 bits en el compilador CC5X.

Identificadores de tipos de variable


Nombraremos las vlidas en la versin gratuita. Bit int uns8 uns16 long char float Variables Enteras: unsigned a8; // 8 bit unsigned char a8; // 8 bit unsigned unsigned long i16; // 16 bit unsigned char varX; char counter, L_byte, H_byte; bit ready; // 0 or 1 bit flag, stop, semafor; int i; // 8 bit signed signed char sc; // 8 bit signed long i16; // 16 bit signed uns8 u8; // 8 bit unsigned uns16 u16; // 16 bit unsigned int8 s8; // 8 bit signed int16 s16; // 16 bit signed El rango de valores de las variables es: TYPE int8 int16 uns8 uns16 SIZE 1 2 1 2 MIN -128 -32768 0 0 MAX 127 32767 255 65535

Variables en punto flotante: Float o float24 Format Resolution Range

16 bit 24 bit

2.4 digits 4.8 digits

+/- 3.4e38, +/- 1.1e-38 +/- 3.4e38, +/- 1.1e-38

Comentarios: Los comentarios en un programa pueden precederse en una lnea con doble barra (//). O pueden encerrarse con /* Esto es un Comentario */.

Constantes
Hexadecimal Binaria 0xA3 bin(0000.1100) o 0b.00001100

Directivas
#include Esta directiva, como ya sabemos, incluye durante la compilacin un archivo en el archivo fuente actual, la sintaxis es: #include <nombre del archivo> #include nombre del archivo #define esta directiva asocia identificadores con un valor numrico o una expresin. Incluso puede definir funciones que sern expandidas en el lugar donde se produzca su llamada (macros). Ej. #define PORTB 6 #pragma: mecanismo para cada compilador, para pasarle operaciones particulares durante una compilacin. Si el compilador no reconoce esa operacin no dar error. Brinda mas informacin al compilador y mas funcionalidades particulares de la computadora o del sistema operativo. Ej. #pragma return[] = 9 6 5 10 Esqueleto de un programa en lenguaje C en el compilador CC5X #include C:\CC5X\16F873.H #define temp 25 void Retardo(uns8); void otra_funcion(void); void main(void) { } void Retardo(uns8 T) { } void otra_funcion(void) { }

Temas faltantes:

Operadores
Precedencia de operadores en C
Highest: ( ) ++ -* / % + << >> < <= > >= == != & ^ | && || Lowest: = += -= *= /= etc.

Operadores Relacionales
Para poder tomar decisiones en un programa necesitamos hacer comparaciones, esto implica que necesitamos otros tipos de operadores llamados relacionales
< > ==

Menor que mayor Igual que

<= >= !=

Menor o igual que Mayor o igual distinto

Variables static, globales, static, locales, auto. Control de flujo: Las sentencias o proposiciones de control de flujo de un lenguaje especifican el orden en que se realizan las computaciones. Proposiciones y bloques Una expresin como X=0, a=b*C se convierte en una proposicin cuando va seguida por Un punto y coma: X=0; a=b*C; El punto y coma es un terminador de sentencia. Con las llaves {} se agrupan declaraciones y sentencias en una proposicin compuesta o bloque.

If
La forma mas sencilla de tomar decisiones es un if If(condicin) { sentencias; }

// se ejecutan estas sentencias si se cumple la condicin // (si es cierta)

cierta if(condicin) falsa

{ sentencias; }

If-Else La proposicin if-else sirve para tomar decisiones, la forma es: if(expresin) Proposicin 1 else Proposicin 2 La parte else es opcional, si la expresin es cierta (distinta de cero) se ejecuta la proposicin 1, si es falsa (cero) y si existe la parte else se ejecuta la proposicin 2.

cierta if(condicin falsa sentencias;

sentencias;

LOOPS
Un loop ejecuta una secuencia de sentencias mientras una condicin es cierta, cuando No lo es (falsa), se sale del loop. Ejemplo: int contador; Contador=0; seguir: if(contador >= 100) { goto salga; } else { contador++; goto seguir; } salga

// o se puede usar break

Pero el uso de la instruccin goto no est recomendado, ni las etiquetas. Veremos como hacer loop sin usar goto:

While
Mientras la condicin sea cierta se ejecuta el bloque de sentencias. while(condicin) { sentencias; .. } Ejemplo: while(1) { .................; .................; } la No condicin es cierta? Si Sentencias

// este es un loop infinito

For
Otra forma de controlar un loop es con un for. Este tiene tres argumentos, una condicin inicial, una final y una para incrementar la variable de control del loop. for(asignacin inicial, condicin final, incremento) { sentencias; } Ejemplo; int i; for(i=0; i <= 200; i++) { PORTB = i; } Otro ejemplo: Loop infinito for( ; ; ) { sentencia; }

Otro tema para hoy 11/10/2002 Se empieza a resolver un problema para hacer un controlador de una dobladora de caos. Y al empezar a programar se ensean nuevos conceptos como el de bit y definicin de Funciones. En CC5X puedo definir el nombre de un bit en particular de la siguiente forma: bit <nombre del bit> @ puerto.<posicin del bit> Ej: bit RB0 @ PORTB.0 #include "c:\cc5x\16f873.h" const int tabla1[4] = { 9, 5, 6, 7}; void main(void) { PORTB=tabla1[0]; PORTB=tabla1[1]; PORTB=tabla1[2]; PORTB=tabla1[3]; }

do while
do{ sentencias; NO . }while(condicion);

{ SENTENCIAS; } La condicin es cierta? SI

Se resolvi un problema de una mquina dobladora de caos, estudio de E/S, Diagrama de Flujo y posterior programa en lenguaje C. Para el 1/11/2002?

Otros conceptos:
switch(variable){ case constante1: sentencia; sentencia; break; case constante2: sentencia; break; default: sentencia;

} switch(tecla){ case 1: sentencia; break; case 2: sentencia; break; case 3: sentencia; break; case 4: sentencia; break; } #pragma config<id>=<state>[,<id>=<state>] <id> PWRTE, WDTE, FOSC, BODEN, ID <state>: on, off, LP, HS, XT, RC, <number> ej: #pragma config WDTE=off, FOSC=XT #pragma config WDTE=0, FOSC=2, PWRTE=1

Arreglos, Vectores o Punteros:


Definicin de un arreglo: uns8 temp[5]; Forma de guardarse en la memoria: temp[0] temp[1] temp[2] 20 25 30 Ejemplos: temp[3]= 35; const instruye al compilador que estos datos no cambiaran const uns8 tabla[10]={0b.11111100, 0b.01100000, ..,}; PORTB=tabla[DECENA]; Puntero: cada variable a la que se accede tiene una direccin de memoria. La direccin proporciona a la CPU la forma de acceder a la variable. Un puntero es una variable que almacena la direccin de otra variable. Cuando defina el puntero, este tendr un nombre como cualquier variable, un especificador que especificar a que tipo de variable maneja y una indicacin de que es un puntero. Ej. uns8 t[10], *p; p=&t[1]; guarda en p la direccin del segundo elemento. temp[3] 37 temp[4] 38

*p=100; VALOR=*(p+i);

p[0]=100.

PORTB=*(p+DECENA); es el operador de indireccin al anteponerlo a p, refiere al contenido de la direccin apuntada. Scope o mbito: Interrupts #pragma origin 4 interrupt servidor(void) { int_save_registers //macro que guarda W, STATUS y PCLATH

//Aqu van las instrucciones del interrupt int_restore_registers } TABLAS char tabla_step1( char W) { skip(W); #pragma return[] = 9 5 6 10 } // macro que recupera los registros guardados

You might also like