Está en la página 1de 34

COMPILADOR C PARA

MICROCONTROLADORES
PIC DE MICROCHIP
DIAPOSITIVAS DEL MATERIAL “MANUAL DE USUARIO
DEL COMPILADOR PCW DE CCS ® ”

Escrito por Andrés Cánovas López


Editado para formato PDF por Víctor Dorado
Reeditado por Evelio Granizo
COMPILADOR
Convierte código escrito en un lenguaje de “alto nivel”, tal como
Basic, C, Java, etc. a código binario ejecutable. A veces pasando por
un código intermedio relocalizable llamado código objeto.
El código objeto es una versión de código de máquina con
referencias simbólicas a otros archivos fuentes que son resueltas
después por un encadenador (linker) para convertirlo en código
ejecutable.
PROGRAMAS DE UTILIDAD
SIO (Serial Input Output):
•terminal no inteligente que se ejecuta en DOS para realizar entradas salidas puerto serie.

PICCHIPS:
•Lee la base de datos del dispositivo. El compilador determina las características especificas del
dispositivo durante la compilación
PROGRAMAS DE UTILIDAD

PICEDIT:
•Permite editar la base de datos de un dispositivo, agregando, modificando o
eliminándolos de la base de datos.
CONVERT:
•Realiza conversiones de un tipo de dato a otro.

COMPILADORES: PCB, PCM, PCH. Son independientes.


•PCB es de 12 bits,
•PCM de 14 bits, y
•PCH es para PIC de 16 bit.
•Están diseñados para satisfacer necesidades únicas de los microcontroladores PIC.
•La limitación de estos compiladores es la recursión de funciones. Implementan de manera
eficaz las construcciones de C, operaciones de entrada/salida, y operaciones de bit.
COMPILADOR PCW CCS

 Genera código de máquina compacto y eficiente


 Se integra con Mplab, Proteus, etc
 Incluye biblioteca muy completa de funciones precompiladas para el
acceso al hardware del dispositivo
 Incorpora drivers para dispositivos externos tales como LCD, memorias
externas, conversores RTC etc.
 Permite insertar partes de código directamente en lenguaje ensasmblador
COMANDOS DEL COMPILADOR NO
ESTANDAR DE LENGUAJE ANSI C
 Directivas del preprocesador
 Directivas derivadas de C estándar
COMANDOS DEL COMPILADOR NO
ESTANDAR DE LENGUAJE ANSI C
 Directivas del preprocesador

Directivas asociadas a las bibliotecas precompiladas , que proporcionan al


compilador información relacionada con estas bibliotecas:
COMANDOS DEL COMPILADOR NO
ESTANDAR DE LENGUAJE ANSI C
 Directivas del preprocesador

Directivas relacionadas con la especificación del dispositivo , por un


lado, para definir l os mapas de memoria y el juego de instrucciones, y
por otro, incluir información necesaria para la programación del
dispositivo en los archivos de salida de la compilación:
COMANDOS DEL COMPILADOR NO
ESTANDAR DE LENGUAJE ANSI C
 Directivas del preprocesador
Directivas de cualificación de funciones , para identificar características
especiales de una función:
COMANDOS DEL COMPILADOR NO
ESTANDAR DE LENGUAJE ANSI C
 Directivas del preprocesador

Directivas de control del compilador , para definir opciones referidas a


la compilación del código del programa:
COMANDOS DEL COMPILADOR NO
ESTANDAR DE LENGUAJE ANSI C
 Directivas del preprocesador

Directivas d e control de la memoria del microcontrolador , para gestionar y


reservar el uso de determinadas zonas de memoria para variables:
COMANDOS DEL COMPILADOR NO
ESTANDAR DE LENGUAJE ANSI C
 Identificadores

Identificadores predefinidos . Todas las directivas citadas hasta ahora, son comandos
destinados a ser interpretados por el compilador, no por el microcontrolador. Dentro del
término genérico de directiva se incluyen, además de estos comandos, unas variables
que contienen información sobre el proceso de compilación. Estas va riables son lo que
se denominan identificadores predefinidos del compilador:

NOTA:
•En un programa, las directivas se reconocen fácilmente porque comienzan por el símbolo #, mientras que los
identificadores empiezan y acaban por doble subrayado (__).
COMANDOS DEL COMPILADOR NO
ESTANDAR DE LENGUAJE ANSI C
Funciones precompiladas.
• Existen funciones en C incluidas en el compilador PCW para manejar los
diferentes recursos del microcontrolador, desde el bus I2C hasta el
conversor A/D. También se puede facilitar considerablemente la tarea de
programación, construyendo por nosotros mismos aquellas funciones que
son de utilización más frecuente, como leer la entrada de un teclado o
imprimir un determinado mensaje en una pantalla LCD conectada como
salida. El compilador PCW dispone de 16 tipos de funciones :

1 . Funciones de I/O serie RS232 9 . Funciones para el LCD


2 . Funciones de I/O con el BUS I2C 10 . Funciones del C ESTÁNDAR
3. Funciones de I/O DISCRETA 11 . Funciones de Manejo de Cadenas
4 . Funciones de RETARDOS 12 . Voltaje de Referencia VREF
5 . Funciones de CONTROL del PROCESADOR 13 . Funciones de ENTRADA A/D
6 . CONTADORES/TEMPORIZADORES 14 . Funciones CCP
7 . Funciones de I/O PSP PARALELA 15 . Funciones para la EEPROM interna
8 . Funciones de I/O SPI A DOS HILOS 16 . Funciones de MANIPULACIÓN DE BITS
COMANDOS DEL COMPILADOR NO
ESTANDAR DE LENGUAJE ANSI C
 Funciones precompiladas
COMANDOS DEL COMPILADOR NO
ESTANDAR DE LENGUAJE ANSI C
 Funciones precompiladas
COMANDOS DEL COMPILADOR NO
ESTANDAR DE LENGUAJE ANSI C
 Funciones precompiladas
COMANDOS DEL COMPILADOR NO
ESTANDAR DE LENGUAJE ANSI C
 Funciones precompiladas
COMANDOS DEL COMPILADOR NO
ESTANDAR DE LENGUAJE ANSI C
 Funciones precompiladas
COMANDOS DEL COMPILADOR NO
ESTANDAR DE LENGUAJE ANSI C
 Funciones precompiladas
COMANDOS DEL COMPILADOR NO
ESTANDAR DE LENGUAJE ANSI C
 Funciones precompiladas
COMANDOS DEL COMPILADOR NO
ESTANDAR DE LENGUAJE ANSI C
 Funciones precompiladas
COMANDOS DEL COMPILADOR NO
ESTANDAR DE LENGUAJE ANSI C
 Funciones precompiladas
COMANDOS DEL COMPILADOR NO
ESTANDAR DE LENGUAJE ANSI C
 Funciones precompiladas
COMANDOS DEL COMPILADOR NO
ESTANDAR DE LENGUAJE ANSI C
 Funciones precompiladas
COMANDOS DEL COMPILADOR NO
ESTANDAR DE LENGUAJE ANSI C
 Funciones precompiladas
INTERRUPCIONES EN PIC C COMPILER

 Las interrupciones del PIC son desviaciones de flujo de control del


programa originadas asincrónicamente por diversos sucesos que no
dependen del programador, es decir, ocurren en cualquier momento.
Cuando se activa una interrupción, el microcontrolador dejará de hacer
lo que está haciendo para realizar la función de interrupción que se haya
declarado anteriormente, para después regresar a donde se había quedado
en el programa principal.
INTERRUPCIONES DEL PIC

 Interrupción externa PIC RB0/INT


 Interrupción por cambio lógico en el puerto B (pines RB7 a RB4)
 Interrupción por desborde del timer 0 (TMR0)
 Interrupción por desborde del timer 1 (TMR1)
 Interrupción por comparación exitosa exitosa en TMR2
 Interrupción del comparador
 Interrupción del transmisor del USART
 Interrupción del receptor del USART
 Interrupción del módulo CCP
 Interrupción del EEPROM
INTERRUPCIONES DEL PIC EN CCS

 #INT_EXT INTERRUPCIÓN EXTERNA


 #INT_RTCC DESBORDAMIENTO DEL TIMER0(RTCC)
 #INT_RB CAMBIO EN UNO DE LOS PINES B4,B5,B6,B7
 #INT_AD CONVERSOR A/D
 #INT_EEPROM ESCRITURA EN LA EEPROM COMPLETADA
 #INT_TIMER1 DESBORDAMIENTO DEL TIMER1
 #INT_TIMER2 DESBORDAMIENTO DEL TIMER2
ACTIVACIÓN DE LAS INTERRUPCIONES
 La forma de activar las interrupciones es muy similar en todos los casos, tenemos que
“avisarle” al compilador que la función por describir será de interrupción y
posteriormente agregar la función como si fuera cualquier otra, de la siguiente
manera:
 #int_XXXXX
 void XXXXX_isr(){
 //Declaramos la función de interrupción
 }
 Las “XXXX” deberán ser sustituidas por el nombre la interrupción a utilizar, por
ejemplo, para activar la función de interrupción externa (RB0), tendremos que
 sustituir por “EXT”. Quedando de la siguiente forma:
 #int_EXT
 void ext_isr(){
 //Función de interrupción externa (RB0)
 }
ACTIVACIÓN DE LAS INTERRUPCIONES
 Dentro de nuestra función main, tenemos que activar las interrupciones con las
siguientes líneas:
 enable_interrupts(GLOBAL); //Habilita interrupciones
 enable_interrupts(int_XXXX); //Habilita interrupción deseada

 Siguiendo el caso de la interrupción externa:


 enable_interrupts(GLOBAL); //Habilita interrupciones
 enable_interrupts(int_EXT); //Habilita interrupción externa (RB0)

 Para configurar la lectura de la INTERRUPCIÓN POR FLANCO DE SUBIDA/ BAJADA en


el Compilador CCS C Compiler se debe utilizar el siguiente comando:
 ext_int_edge(L_TO_H);
 ext_int_edge(H_TO_L);
CODIGO CONTROL VELOCIDAD
MOTOR
 #DEVICE ADC=10
 #USE DELAY(CLOCK=4000000)
 #FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
 #INCLUDE <LCD.C>
 #BYTE PORTA= 5
 #byte PORTB= 6
 #byte PORTC= 7
 #BYTE PORTD= 8
 long contador=0;
 int16 duty=0;
 int Timer2,Poscaler;
 double RPM;
CODIGO CONTROL VELOCIDAD MOTOR
 //Interrupción por cambio en RB0
 #INT_EXT
 ext_isr()
 {
 contador++;
 }
 void main()
 {
 //Configura los Puertos del PIC
 set_tris_a(0x01);
 set_tris_b(0x01); //RB0 como entrada
 set_tris_d(0);
 //Configura la Entrada Análoga
 setup_adc_ports(AN0); //Configurar ADC (Lectura de temperatura)
 setup_adc(adc_clock_internal); //Reloj interno para la conversión análoga digital)
CODIGO CONTROL VELOCIDAD MOTOR
 //Configura el PWM
 // Generemos una Señal cuadrada de 1 Khz
 Timer2=249; //Se carga timer 2 con 249 como lo vimos en la pagina
 //Preescaler=4; //Preescaler solo puede tomar valores de: 1 - 4 - 16
 //Para el preescaler colocamos "t2_div_by_4"
 Poscaler=1; //Preescaler solo puede tomar valores de: 1

 setup_timer_2(t2_div_by_4,Timer2,Poscaler); //Configuracion de Timer 2 para establecer frec. PWM a
1kHz
 setup_ccp1(ccp_pwm); //Configurar modulo CCP1 en modo PWM

 //Habilita las Interrupcciones
 enable_interrupts(global); //Habilita interrupciones de forma global
 enable_interrupts(int_ext); //Activa interrupcion por RB0
 ext_int_edge(L_TO_H); //Activa interrupción por flanco de subida
 lcd_init();
 lcd_gotoxy(1,1);
 LCD_PUTC("VELOCIDAD MOTOR");
CODIGO CONTROL VELOCIDAD MOTOR

 while(1)
 {
 //Lectura del Potenciometro
 set_adc_channel(0); //Escoge el canal 0 de los puertos análogos
 delay_us(100);
 duty=read_adc(); //Almacena en duty el valor del voltaje del pot
 set_pwm1_duty(duty);//10 bits= 1023 y 8bit= 255
 delay_ms(999); //Espera por 1 segundo
 RPM=contador*60/10;
 contador=0;
 //Visualiza la Velocidad
 lcd_gotoxy(1,2);
 printf(lcd_putc,"RPM: %f ",RPM);
 }
 }

También podría gustarte