C18
C18
C18
1.1.
El lenguaje C fue creado en los aos 70 para escribir el cdigo del sistema operativo UNIX. Tanto por su origen como por sus caractersticas, es un lenguaje muy adecuado para la programacin de sistemas, ya que combina la abstraccin de los lenguajes de alto nivel con la eficiencia del lenguaje mquina. La amplia utilizacin de C para distintos tipos de computadores ocasion muchas variantes. stas eran similares, pero a menudo incompatibles, lo que se volvi un problema serio para los desarrolladores que necesitaban escribir programas que se ejecutaran en distintas plataformas. Entonces, se hizo evidente la necesidad de una versin estndar de C. En 1983, se cre el comit tcnico X3J11 bajo la supervisin de American National Standards Comitte on Computer and Information Processing (X3), para proporcionar una definicin del lenguaje clara e independiente de la computadora. En 1989, el estndar fue aprobado. ANSI cooper con la International Organization for Standardization (ISO) para estandarizar C a nivel mundial; el documento conjunto del estndar se public en 1990 y se conoce como ANSI/ISO9899:1990 o ANSI C. Entre las caractersticas de este lenguaje cabe citar que es altamente portable, es muy flexible, genera cdigo muy eficiente y permite escribir cdigo muy compacto (se pueden realizar muchas funciones escribiendo pocas lneas de cdigo). El C18 es una versin del C creada especficamente para los microcontroladores PIC18, que por sus caractersticas resulta demasiado complicado la programacin en su lenguaje de bajo nivel, el Assambler.
1.2.
1.2.1.
El compilador MPLAB C18 es un compilador que optimiza el estndar ANSI C en los microcontroladores PIC18. El compilador modifica el estndar ANSI X3.1591989 slo en los puntos en los que se puedan crear conflictos con el soporte del microcontrolador. El MPLAB C18 tiene las siguientes caractersticas: Compatibilidad ANSI 89. Integracin con el MLAB IDE para una mayor facilidad de realizacin y debugg de proyectos. Admite ensamblador empotrado. Gran variedad de libreras. Optimizacin multinivel. Acceso transparente en la lectura/escritura de la memoria. Versin estudiante gratuita.
Documento creado por Slalen para Electronics Strange World En este manual, aparecen en verde y con tipo de letra Comic Sans MS el cdigo fuente y en verde con tipo de letra Times New Roman las notas del cdigo.
1.2.2.
TIPOS DE DATOS
Los datos de ms de un byte de longitud, se almacenan en memoria como en el ensamblador, con el criterio Little Indian; es decir, los bytes menos significativos se almacenan en las posiciones de memoria bajas.
1.2.2.1.
Enteros
Tipo Char Signedchar Unsigned char Int Unsigned Int Short Unsigned Short Short long Unsigned short long Long Unsigned long Tamao 8 bits 8 bits 8 bits 16 bits 16 bits 16 bits 16 bits 24 bits 24 bits 32 bits 32 bits Mnimo -128 -128 0 -32768 0 -32768 0 -8.388.608 0 -2.147.483.648 0 Mximo 127 127 255 32767 65535 32767 65535 8.388.607 16.777.215 2.147.483.647 4.294.967.295
1.2.2.2.
Reales
Tipo Float Double Tamao 32 bits 32 bits Exponente Mnimo -126 -126 Exponente Mximo 128 128
1.2.2.3.
Estructuras
Manual C18
unsigned bit2:1; unsigned bit3:1; unsigned bit4:1; unsigned bit5:1; unsigned bit6:1; unsigned bit7:1;
}byte;
};
En este ejemplo se declara tpuerto como byte que contiene: Una variable tipo char llamada valor. Un conjunto de bits.
1.2.2.4.
Almacenamiento
Auto: Las variables se declaran globales si se ha hecho fuera de las funciones y locales si se realiza en las funciones. Tienen prioridad las locales. Todas las variables no inicializadas tienen un valor indefinido. Externa: La variable declarada pertenece a otro mdulo, por lo que no reserva memoria para ella. Sirve para acceder a una variable aunque no se haya declarado todava. Se inicializan a cero. Register: La variable se guarda en uno de los registros del procesador. Si no se puede almacenar en un registro, se comporta como Auto. til para optimizar el tiempo de ejecucin de algunas funciones. Static: Variables locales que retiene su valor al salir de la funcin en la que se ha declarado. Se inicializan a cero. Ahorra nmero de instrucciones para acceder a las variables. Typedef: Asigna un nuevo nombre a un tipo de datos. Overlay: Declara las variables locales Static pero se inicializan cada vez que se llama la funcin. 3
Documento creado por Slalen para Electronics Strange World Ahorra espacio de memoria.
1.2.2.5.
Calificadores
Const: Definicin de una constante. Volatile: El contenido de la variable puede cambiar. Far: Los datos se encuentran en un banco lejano, hay que cambiar de banco o de acceso indirecto para acceder a la variable. Si se declara cdigo, podemos acceder a objetos por encima de 64KB. Near: La variable se declara en el banco de acceso. Si se declara cdigo, accedemos a una zona inferior de 64KB. RAM: La variable se sita en la memoria de datos. ROM: La variable se sita en la memoria de programa.
Las instrucciones se ejecutan repetidamente hasta que el valor de la expresin, que se comprueba al comenzar el bucle, sea falso, es decir cero.
while (expresin) { Instruccin 1 Instruccin 2 ... Instruccin n }
1.2.3.1.2.
Sentencia Do
Las instrucciones se ejecutan repetidamente hasta que el valor de la expresin, que se comprueba al final del bucle, sea falso, es decir cero.
do { Instruccin 1 Instruccin 2 ... Instruccin n } while ( expresin );
1.2.3.1.3.
Sentencia For
Las instrucciones se ejecutan repetidamente hasta que el valor de la exp2 sea falso, es decir cero. exp1 sirve para inicializar el contador del bucle. exp3 controla el contador del bucle. Se evala al final del mismo.
for( exp1; exp 2; exp 3) {
Manual C18
Instruccin 1 Instruccin 2 ... Instruccin n }
1.2.3.1.4.
Sentencia If
1.2.3.1.5.
Sentencia If-Else
La expresin se evala, si es verdadera se ejecutan las instrucciones A, en caso contrario las Instrucciones B.
If( expresin ) { Instrucciones A } else {Instrucciones B }
1.2.3.1.6.
Sentencia Switch
Permite realizar selecciones mltiples. switch ( expresin ) { case const1: Instruccin 1; break; case const2: Instruccin 2; break; ... default: Instruccin n break; }
1.2.3.1.7.
Sentencia Break
Interrumpe la ejecucin de un bucle while, do-while o for. Ejemplo: cmo salir de un bucle infinito for?
For (;;) { if( a==0) { break; } a=PORTA; }
1.2.3.1.8.
Sentencia Continue
1.2.3.1.9.
Sentencia Goto
identificador:
instrucciones;
Es una sentencia propia del lenguaje Basic. No se recomienda su utilizacin ya que vara la estructura del programa.
1.2.4.
PUNTEROS
Un puntero es una variable que contiene la direccin a una zona de memoria en la que se almacena una variable. Los punteros ocupan 16Bits.
char char car; *pcar; //variable de tipo char //puntero a una variable char //almacena el dato hexadecimal AA //almacena la direccin de la variable car, & devuelve la direccin
car=0xAA pcar=&car
pcar=(char*)0x501 *pcar=0xAA
Al optimizarlo se ahorran las direcciones de memoria del puntero. Hay que tener cuidado ya que el compilador no comprueba errores.
1.2.5.
CADENAS DE CONSTANTES
Las cadenas de constantes se pueden almacenar en la memoria de programa. Existen instrucciones especiales para moverlas entre la RAM y la ROM:
Manual C18 char *strcpy (auto char *s1, auto const char *s2). Copia dos cadenas ambas de la RAM. char *strcpypgm2ram (auto char *s1, auto rom const char *s2). Copia dos cadenas, la original de la memoria de programa y la copia en la RAM. rom char *strcpyram2pgm (auto rom char *s1, auto const char *s2). Copia dos cadenas, la original en la RAM y la copia en la memoria de programa. rom char *strcpypgm2pgm (auto rom char *s1, auto const rom char *s2). Copia dos cadenas ambas en la memoria de programa.
1.3.
Una librera es una coleccin de funciones agrupadas por referencia y facilidad de llamada. En este apartado aparecen las libreras utilizadas en el proyecto. Las libreras relacionadas con el USB no se instalan con el compilador, teniendo que descargarse de la pgina del fabricante; el resto se encuentran en la carpeta lib dentro de la carpeta de instalacin del MPLAB C18.
1.3.1.
A
ACM ACT ADR ALLOC ALT AUX B BD BDT BUFF C CDC CFG CLR
Documento creado por Slalen para Electronics Strange World CLS CTRL D DC DEF DEFS DEV DIR DSC E ENDP EP EXT F FN FS H HID I INIT INT INTF IO ISOCH ISR L LANG LEN LS M MAX MCHP MEM Mximo Tecnologa de microchip Memoria Lenguaje Longitud Low-speed inicializar Interrupcin/interno Interfaz Entrada-salida Sncrono Rutina del servicio de interrupcin Dispositivo interfaz humana funcional Full-Speed Endpoint Endpoint Externo Clase del dispositivo Definicin ver DEF Dispositivo Direccin Descriptor Clase Control
Manual C18 MFR MGT MIN MSD N NUM O OP Operacional Nmero Fabricante, fabricacin, fabricacin Gerencia Mnimo Dispositivo de almacenamiento masivo
P PKT PID PP PREP PTR R RDY REG REQ RCPT RPT RWU RX S SIE STAT STD SYNCH SYS T TEL TR TRF TX Telfono Emisor Transferencia transmisin Motor de la interfaz serie Estado Estndar sncrono, sincronizacin Sistema listo registro Peticin Receptor Informe Reinicio remoto recibir Paquete Paquete de identificacin Ping-pong Preparacin Puntero
Documento creado por Slalen para Electronics Strange World U USB UTIL V VAR VAL VEND Z ZLP Paquete cero de longitud Variable Valor Vendedor Bus serie universal Utilidad
1.3.2.
Con esta librara se tratan los conversores analgico-digitales, desde su configuracin hasta su lectura. Para poder llamar a las funciones, como se indica en el cdigo, hay que incluir la librera de la siguiente forma:
#include <adc.h>
1.3.2.1.
char BusyADC(void)
Comprueba si el conversor est realizando una conversin o no. Devuelve un 1 si el conversor A/D realiza la conversin y un 0 si no lo hace.
BusyADC();
void CloseADC(void)
Desactiva el conversor A/D y el mecanismo de interrupcin.
CloseADC();
void ConvertADC(void)
Esta funcin comienza la conversin A/D. Se puede utilizar BusyADC() para detectar el final de la conversin.
ConvertADC();
void OpenADC(unsigned char config, unsigned char config2, unsigned char portconfig)
Esta funcin resetea los registros asociados al conversor A/D al estado POR y configura el reloj, el formato del resultado, tensin de referencia, puerto y canal.
10
Manual C18 Hay variaciones dependiendo del microcontrolador. Lo que se expone aqu es para la mayora de los micros. config: Fuente de reloj: ADC_FOSC_2 ADC_FOSC_4 ADC_FOSC_8 ADC_FOSC_16 ADC_FOSC_32 ADC_FOSC_64 ADC_FOSC_RC ADC_RIGHT_JUST ADC_LEFT_JUST ADC_0_TAD ADC_2_TAD ADC_4_TAD ADC_6_TAD ADC_8_TAD ADC_12_TAD ADC_16_TAD ADC_20_TAD FOSC/2 FOSC/4 FOSC/8 FOSC/16 FOSC/32 FOSC/64 FOSC/RC Resultado en los bits menos significativos Resultado en los bits ms significativos 0 Tad 2 Tad 4 Tad 6 Tad 8 Tad 12 Tad 16 Tad 20 Tad
config2: Canal: ADC_CH0 ADC_CH1 ADC_CH2 ADC_CH3 ADC_CH4 Canal 0 Canal 1 Canal 2 Canal 3 Canal 4
11
Documento creado por Slalen para Electronics Strange World ADC_CH5 ADC_CH6 ADC_CH7 ADC_CH8 ADC_CH9 ADC_CH10 ADC_CH11 ADC_CH12 ADC_CH13 ADC_CH14 ADC_CH15 ADC_INT_ON ADC_INT_OFF Canal 5 Canal 6 Canal 7 Canal 8 Canal 9 Canal 10 Canal 11 Canal 12 Canal 13 Canal 14 Canal 15 Interrupciones activadas Interrupciones desactivadas
Interrupciones A/D:
Configuracin de tensiones A/D: ADC_VREFPLUS_VDD VREF+=AVDD ADC_VREFPLUS_EXT VREF+=externa ADC_VREFMINUS_VDD VREF-=AVDD ADC_VREFMINUS_EXT VREF-=externa portconfig: El valor de portconfig es un valor de 0 a 15. Corresponde con los bits 0 a 3 del registro ADCON1, que son los bits de configuracin de los puertos.
OpenADC(ADC_FOSC_32 ADC_INT_OFF, 15; & ADC_RIGHT_JUST & ADC_12_TAD, DC_CH0 &
int ReadADC(void)
Esta funcin devuelve los 16 bits con signo resultado de la conversin A/D. Basndose en la configuracin del conversor A/D, el resultado puede almacenarse en los bits menos o ms significativos.
int resultado; resultado=ReadADC();
12
Manual C18 ADC_CH0 ADC_CH1 ADC_CH2 ADC_CH3 ADC_CH4 ADC_CH5 ADC_CH6 ADC_CH7 ADC_CH8 ADC_CH9 ADC_CH10 ADC_CH11 ADC_CH12 ADC_CH13 ADC_CH14 ADC_CH15
SetChanADC(ADC_CH1);
Canal 0 Canal 1 Canal 2 Canal 3 Canal 4 Canal 5 Canal 6 Canal 7 Canal 8 Canal 9 Canal 10 Canal 11 Canal 12 Canal 13 Canal 14 Canal 15
13
1.3.3.
Esta librera trata la modulacin de ancho de pulso tanto de los CCP como de los mejorados. Todas las funciones aparecen con una x, esta corresponde al nmero del CCP que se est utilizando. La forma de invocar las funciones est escrita en verde (cdigo). Antes de llamar las funciones hay que incluir la librera:
#include <pwm.h>
Para que la modulacin funcione correctamente hay que activar el Timer 2, se explica en este captulo.
1.3.3.1.
OpenPWM2(0xFF);
char
outputconfig,
unsigned
char
14
Manual C18 outputconfig: SINGLE_OUT FULL_OUT_FWD FULL_OUT_REV HALF_OUT outputmode: PWM_MODE_1 PWM_MODE_2 PWM_MODE_3 PWM_MODE_4 P1A, P1B, P1C y P1D activo por altos P1A y P1C activo por altos y P1B y P1D activo por bajos P1A y P1C activo por bajos y P1B y P1D activo por altos P1A, P1B, P1C y P1D activo por bajos Salida simple Salida full-bridge forward Salida full-bridge reverse Salida half-bridge
SetOutputEPWM1(SIGNED_OUT, PWM_MODE_1);
15
1.3.4.
En esta traduccin de la librera de Microchip slo aparecen las palabras de configuracin vlidas para la familia PIC18Fxx5x, ya que vara dependiendo del microprocesador. Para incluirla hay que escribir al principio del archivo:
#include <timers.h>
1.3.4.1.
void CloseTimerx(void)
Esta funcin desactiva el temporizador x y su interrupcin.
CloseTimer2();
Valor del Prescaler: T0_PS_1_1 T0_PS_1_2 T0_PS_1_4 Prescaler 1:1 Prescaler 1:2 Prescaler 1:4
16
Manual C18 T0_PS_1_8 T0_PS_1_16 T0_PS_1_32 T0_PS_1_64 T0_PS_1_128 T0_PS_1_256 Prescaler 1:8 Prescaler 1:16 Prescaler 1:32 Prescaler 1:64 Prescaler 1:128 Prescaler 1:256
17
Documento creado por Slalen para Electronics Strange World T3_SOURCE_CCP T1_CCP1_T3_CCP2 T1_SOURCE_CCP Timer3 fuente de ambos CCP Timer1 fuente del CCP1 y Timer3 del CCP2 Timer1 fuente de ambos CCP
OpenTimer1(TIMER_INT_OFF & T1_8BIT_RW & T1_SOURCE_EXT & T1_PS_1_1 & T1_OSC1EN_OFF & T1_SYNC_EXT_OFF & T1_SOURCE_CPP)
Uso con CCP: Dispositivos con 1 2 CCP: T3_SOURCE_CCP Timer3 fuente de ambos CCP T1_CCP1_T3_CCP2 Timer1 fuente del CCP1 y T1_SOURCE_CCP Timer1 fuente de ambos CCP
18
Manual C18 TIMER_INT_OFF T3_8BIT_RW T3_16BIT_RW Fuente de reloj: T3_SOURCE_EXT T3_SOURCE_INT T3_PS_1_1 T3_PS_1_2 T3_PS_1_4 T3_PS_1_8 T3_SYNC_EXT_ON Uso con CCP: Dispositivos con 1 2 CCP: T3_SOURCE_CCP T1_CCP1_T3_CCP2 T1_SOURCE_CCP Timer3 fuente de ambos CCP Timer1 fuente del CCP1 y Timer3 del CCP2 Timer1 fuente de ambos CCP Fuente esterna Fuente interna (TOSC) Prescaler 1:1 Prescaler 1:2 Prescaler 1:4 Prescaler 1:8 Sincronizacin de la entrada del reloj ext. Desactiva Modo 8bits Modo 16bits
OpenTimer3(TIMER_INT_OFF & T3_8BIT_RW & T3_SOURCE_EXT & T3_PS_1_1 & T3_SYNC_EXT_OFF & T1_SOURCE_CPP)
19
Documento creado por Slalen para Electronics Strange World Es un int si el temporizador es de 16bits, aunque trabaje en modo 8bits; y un char si el temporizador es de 8bits.
WriteTimer0(10000);
20
Manual C18
1.3.5.
Las funciones delay ejecutan un cdigo de un nmero especfico de ciclos de instrucciones. Hay que tener en cuenta la frecuencia del procesador. Para usarla primero hay que incluirla en el programa:
#include <delays.h>
1.3.5.1.
void Delay1TCY(void)
Esta funcin es una definicin de la instruccin NOP. Cuando se encuentra en el cdigo, el compilador inserta un NOP.
Delay1TCY();
21
Documento creado por Slalen para Electronics Strange World Esta funcin utiliza la variable global DelayCounter1 y DelayCounter2. Si se utliza la funcin en las interrupciones y en el cdigo, las variables anteriores se tienen que almacenar y recuperar en el cdigo de la interrupcin. Darse cuenta de que otras funciones de retrasos utilizan las variables DelayCounter1 y DelayCounter2. unit: El valor de unit puede ser de 8bits; en un rango de [1,255]. El retraso ser de (1 000*unit) ciclos. Si unit=0 el retraso ser de 256 000 ciclos.
Delay1KTCYx();
22