Está en la página 1de 23

Nombre del Seminario: Microprocesadores y microcontroladores 1

UNIVERSIDAD NACIONAL EXPERIMENTAL POLITÉCNICA


“ANTONIO JOSÉ DE SUCRE”
VICERRECTORADO BARQUISIMETO
DEPARTAMENTO DE INGENIERÍA ELECTRÓNICA
MICROPROCESADORES Y MICROCONTROLADORES

Programación de microcontroladores
PIC con compilador CCS

Manuel Picón

1
Manuel Picón
Nombre del Seminario: Microprocesadores y microcontroladores 2
Programación de C PIC con CCS.
Lenguaje C con compilador PCW de la empresa CCS
Programación compilador en CCS

El compilador PCW de la empresa CCS Inc. genera archivos


en formato Inte hexadedimal, con extensión .HEX donde
coloca el programa en lenguaje de máquina para programar
microcontroladores PIC de las familias PIC10, PIC12, PIC16 y
PIC18 entre otras.

El compilador de C que vamos a utilizar es el PCW de la casa


CCS Inc. El software PICC integra un entorno de desarrollo
integrado (IDE) que permite desarrollar todas las fases de un
proyecto, es decir la edición , la depuración y la compilación
de un programa para programarlo en un PIC.

Manuel Picón
Nombre del Seminario: Microprocesadores y microcontroladores 3
Programación de C PIC con CCS.
Pasos para programar un microcontrolador

IDE Programa en
Programación compilador en CCS

Nombre.C lenguaje C

Compilador

Programador Programa en HEX


Nombre.HEX formato Intel

Programa en
Nombre.BIN
lenguaje de
máquina

Microcontrolador

Manuel Picón
Nombre del Seminario: Microprocesadores y microcontroladores 4
Programación de C PIC con CCS.
Estructura de un programa en C
Comandos cabecera
declaraciones globales
Funciones
Programación compilador en CCS

funcion_1() {
declaración de variables variables locales de “funcion_1”
bloque de instrucciones
}


void funcion_n() {
declaración de variables locales de funcion_n;
bloque de instrucciones;
llamada a otras funciones;
}
Inicio del programa
void main{
declaración de variables variables locales de la función
“main”
bloque de instrucciones;
llamada a otras funciones
}
Fin del programa

Manuel Picón
Nombre del Seminario: Microprocesadores y microcontroladores 5
Programación de C PIC con CCS.
Tipo de datos
Tipo tamaño Sin signo Con signo
int1 1 bit 0a1 N/A
Programación compilador en CCS

int8 1 byte 0 a 255 -128 a127


int16 2 byte 0 a 65535 -32768 a 32767
Int32 4 byte 0a -2147483648
4294967395 A 2147483647
float32 4 byte -1.5x1045 a 3.4x1038

C tipo estándar Tipo por defecto


short int1
char unsigned int8
int Int8
long Int16
long long Int32
float float 32

Manuel Picón
Nombre del Seminario: Microprocesadores y microcontroladores 6
Programación de C PIC con CCS.
Formas de representar Constantes
123 Decimal
0123 Octal
0x123 Hex
Programación compilador en CCS

0b010010 Binario
'x' Caracter
'\010' Carácter Octal
'\xA5’ Carácter Hex
'\c‘ Caracteres especial:
\c
\n Line Feed – es igual a \x0a
\r Return Feed - Same as \x0d
\t TAB – es igual a \x09
\b Backspace – es igual a \x08
\f Form Feed - es igual a x0c
\a Bell - es igual a \x07
\v Vertical Space - es igual a \x0b
\? Question Mark - es igual a \x3f
\' Single Quote - es igual a \x22
\" Double Quote - es igual a \x22
\\ A Single Backslash - es igual a \x5c

“abcdefghijkmn” String o cadena (se agrega un Null al final)

Manuel Picón
Nombre del Seminario: Microprocesadores y microcontroladores 7
Programación de C PIC con CCS.

Operadores de asignación compuesta


Programación compilador en CCS

Operador Descripción
+= Asignación de suma
-= Asignación de resta
*= Asignación de multiplicación
/= Asignación de división
%= Asignación de resto de división
<<= Asignación de desplazamiento a la izquierda
>>= Asignación de desplazamiento a la derecha
&= Asignación de AND de bits
|= Asignación de OR de bits
^^= Asignación de OR exclusivo de bits
~= Asignación de negación de bits

Manuel Picón
Nombre del Seminario: Microprocesadores y microcontroladores 8
Programación de C PIC con CCS.
Operadores aritméticos
Operador Descripción Ejemplos
Programación compilador en CCS

+ Suma (enteros o reales) resul = var1 + var2


- Resta (enteros o reales) resul = var1 - var2
* Multiplicación (enteros o reales) resul = var1 * var2
/ División (enteros o reales resul = var1 / var2
- Cambio de signo en enteros o reales -var1
% % Módulo; resto de una división entera rango = n [A1]% 256

Operadores relacionales
Operador Descripción
< Menor que
> Mayor que
<= Menor o igual que
>= Mayor o igual que
== Igual a
!= Distinto de

Manuel Picón
Nombre del Seminario: Microprocesadores y microcontroladores 9
Programación de C PIC con CCS.
Operadores lógicos
Operador Descripción
Programación compilador en CCS

! No lógico (NOT)
&& Y lógico (AND)
|| O lógico (OR)

Operadores de manejo de bits


Operador Descripción
~ Negación de bits (complemento a 1)
& Y de bits (AND)
^^ O exclusivo de bits (EXOR)
| O de bits (OR)

Operadores de incremento y decremento

Operador Descripción
++ Incremento
-- decremento

Manuel Picón
Nombre del Seminario: Microprocesadores y microcontroladores 10
Programación de C PIC con CCS.

Operadores de incremento y decremento


Programación compilador en CCS

Operador Descripción
++ Incremento
-- decremento

Operadores de desplazamiento de bits


Operador Descripción
>> Desplazamiento a la derecha
<< Desplazamiento a la Izquierda

Operadores lógicos
Operador Descripción
++ Incremento
-- decremento

Manuel Picón
Nombre del Seminario: Microprocesadores y microcontroladores 11
Programación de C PIC con CCS.
Directivas del compilador

#USE DELAY (CLOCK=frecuencia)


Esta directiva indica al compilador la frecuencia del procesador,
Programación compilador en CCS

en ciclos por segundo y habilita el uso de las funciones


Delay_ms() y delay_us().
Opcionalmente podemos usar la función restart_WDT() para que
el compilador reinicie el WDT durante el retardo.
Ejemplos:
#use delay (clock=20000000)
#use delay (clock=32000, RESTART_WDT)

Otras directivas del compilador:


#USE RS232(BAUD...) 25
#USE FAST_IO(puerto)
#USE FIXED_IO(puerto_OUTPUTS...)
#USE I2C(Master,SDA...)
#USE STANDARD_IO (puerto)

Manuel Picón
Nombre del Seminario: Microprocesadores y microcontroladores 12
Programación de C PIC con CCS.
Funciones de Entrada Salida I/O
INPUT(pin)
Devuelve un int1, es decir el estado '0' o '1' que tenga el pin indicado.
Ejemplo:
Programación compilador en CCS

If(input(PIN_A1)==1) //establece la condición Si el PIN_A1 es ‘1’


OUTPUT_BIT(pin, value)
Esta función coloca '0' o '1‘ en el pin especificado.
Ejemplo:
output_bit( PIN_B0, 0); // es lo mismo que output_low(pin_B0);
output_bit( PIN_B0,input( PIN_B1 ) ); // coloca el pin B0 igual que el pin B1

OUTPUT_HIGH(pin)
Coloca el pin especificado de ‘1’
Ejemplo:
output_high(PIN_A0);
OUTPUT_LOW(pin)
Coloca el pin especificado de ‘0’
Ejemplo:
output_low(PIN_A0);

Manuel Picón
Nombre del Seminario: Microprocesadores y microcontroladores 13
Programación de C PIC con CCS.
Funciones de Entrada Salida I/O

PORT_B_PULLUPS(flag)
Programación compilador en CCS

Esta función activa/desactiva las resistencias pullups en las entradas del puerto B,
flag puede ser TRUE (activa) o FALSE (desactiva).
Ejemplo:
port_b_pullups(FALSE); //desactiva las pullups del puerto B.

Funciones para configurar los pines I/O como entrada o salida.


SET_TRIS_A(valor)
SET_TRIS_B(valor)
SET_TRIS_C(valor)
SET_TRIS_D(valor)
SET_TRIS_E(valor)
valor es un int8 con los valores de configuración de los pines del puerto.
Ejemplos:
set_tris_d(0x30) // configura los pines B4 y B5 como entrada el resto de pines
como salida.
set_tris_A(0x00) // configura todos los oines del puerto A como salida.

Manuel Picón
Nombre del Seminario: Microprocesadores y microcontroladores 14
Programación de C PIC con CCS.
Funciones de Interrupciones
DISABLE_INTERRUPTS(Id_interrup)
Esta función deshabilita la fuente de interrupción indicada por Id_interrup.
Programación compilador en CCS

Ejemplo:
disable_interrupts(GLOBAL); // deshabilita todas las interrupciones.
ENABLE_INTERRUPTS(Id_interrup)
Esta función habilita la fuente de interrupción indicada por Id_interrup.

Ejemplos:
enable_interrupts(GLOBAL); // habilita todas las interrupciones del grupo
general
enable_interrupts(INT_RTCC); // habilita la interrupción del TIMER0

EXT_INT_EDGE(flanco)
Esta función determina el flanco de activación de la interrupción externa.
flanco puede ser: (L_TO_H) de subida o (H_TO_L) de bajada.
Ejemplo:
ext_int_edge( L_TO_H ); // flanco de subida

CLEAR_INTERRUPT(Id_interrup) Borra la bandera de la interrupción,


INTERRUPT_ACTIVE(Id_interrup) Activa la bandera de la interrupción.
Manuel Picón
Nombre del Seminario: Microprocesadores y microcontroladores 15
Programación de C PIC con CCS.
Funciones de Interrupciones
Resumen de funciones de las interrupciones:
Programación compilador en CCS

ENABLE_INTERRUPTS(), DISABLE_INTERRUPTS(),
CLEAR_INTERRUPT(), INTERRUPT_ACTIVE(), EXT_INT_EDGE()

Las posibles fuentes de interrupciones de la funciones


disable_interrupts(id_interrup) y enable_interrupts(id_interrup) son:

GLOBAL INT_RTCC INT_TIMER0


INT_TIMER1 INT_TIMER2 INT_TIMER3
INT_EXT INT_EXT1 INT_EXT2
INT_RB INT_AD INT_RDA
INT_TBE INT_SSP INT_CCP1
INT_CCP2 INT_BUSCOL INT_LOWVOLT
INT_COMP INT_EEPROM INT_OSCF
INT_SPP INT_USB

Manuel Picón
Nombre del Seminario: Microprocesadores y microcontroladores 16
Programación de C PIC con CCS.
Funciones del Timer 0

Las funciones del Timer 0 del PIC18xxxx Son:


Programación compilador en CCS

SETUP_COUNTERS() o SETUP_TIMER_0(valor)
Las constantes que puede tener valor son:
RTCC_INTERNAL :Utiliza el reloj interno del microcontrolador
RTCC_EXT_L_TO_H :Flanco de subida cuando está en modo contador
RTCC_EXT_H_TO_L :Flanco de bajada cuando está en modo contador
RTCC_DIV_1, RTCC_DIV_2, RTCC_DIV_4, ….., RTCC_DIV_256
: son para configurar el pre-escalar
RTCC_OFF : apaga el Timer
RTCC_8_BIT : coloca el timer en modo 8 bits.

SET_TIMER0() o SET_RTCC( ) :Escribe el valor de recarga del Timer 0;


si está en modo 8 bits el argumento es in8, en modo 16 bits es int16.

GET_TIMER0() o GET_RTCC( ) :Devuelve el de conteo del Timer 0; si


está en modo 8 bits devuelve un in8, en modo 16 bits devuelve un int16.

Manuel Picón
Nombre del Seminario: Microprocesadores y microcontroladores 17
Programación de C PIC con CCS.
Funciones del convertidor análogo digital ADC
SETUP_ADC(), SETUP_ADC_PORTS()
ADC_CLOCK_DIV_x donde x es: 2, 4, 8, 16, 32, 64 : divide la frecuencia de
Programación compilador en CCS

conversión entre x.
ADC_CLOCK_INTERNAL : la frecuencia para la conversión es la del reloj
interno

SETUP_ADC_PORTS()
NO_ANALOGS : todos los puertos so digitales
AN0 : un canal de conversión ADC
AN0_TO_AN1 : dos canales de conversión ACD
AN0_TO_AN2 : tres canales de conversión ADC
…….
AN0_TO_AN11 : doce canales de conversión ADC
ALL_ANALOG : trece canales de conversión ADC
Otras constantes de setup_adc_ports() se agragan a las anteriores con OR
VSS_VDD : valores de referencia 0-Vdd
VREF_VREF : valores de referencia VrefL-VrefH
VREF_VDD : valores de referencia VrefL-Vdd
VSS_VREF : valores de referencia 0-VrefH

Manuel Picón
Nombre del Seminario: Microprocesadores y microcontroladores 18
Programación de C PIC con CCS.
Funciones del convertidor análogo digital ADC
Programación compilador en CCS

ADC_OFF()
Apaga el convertidor ADC

SET_ADC_CHANNEL()
Se coloca en el argumento el canal de multiplexor que se usará en la
conversión. Establece el pin de salida del ADC

READ_ADC()
Devuel un in8 si el convertidor ADC está en modo 8 bits y int 16 si está en
modo 16 bits.

ADC_START_AND_READ : Si inicia la conversion y cuando termina de


devuelve el valor leido en el pin
ADC_START_ONLY : se inicia la conversión en el ADC
ADC_READ_ONLY : devuelve el valor analogo leido en la salida del ADC

Manuel Picón
Nombre del Seminario: Microprocesadores y microcontroladores 19
Programación de C PIC con CCS.
Ejemplos:
/// Comandos cabecera /////
#include <18F4550.h> // librería de PIC18F4550
#DEVICE ADC=10 // configuración del ADC a 10 bits
Programación compilador en CCS

#fuses XT,NOWDT,NOPROTECT,NOLVP,CPUDIV1 // configuración registros MP


#use delay(clock=4000000) // habilita funciones de retardo
#include<lcd.C> // librería de funciones de LCD 16x2
int16 valor; // declaración de variables globales
// Funciones //
void main(){ // programa principal
int y; // declaración de variables locales
lcd_init(); // inicializa la LCD
set_tris_a(0x03); // configura Puerto A
set_tris_b(0xFF); // configura el Puerto B
setup_adc(ADC_CLOCK_INTERNAL); // configura convertidor ADC
setup_adc_ports(AN0); // define puertos analogos
set_adc_channel(0); // selcciona canal 0 del ADC
while(TRUE){ // inicio de ciclo infinito
delay_ms(500); // retardo de medio segundo
lcd_gotoxy(1,1); // coloca el cursor linea 1 columna 1
valor=adc_read();
printf(lcd_puch,“Valor leido: %LU”, valor);
} // fin del ciclo principal del programa
}
Manuel Picón
Nombre del Seminario: Microprocesadores y microcontroladores 20
Programación de C PIC con CCS.
Ejemplos:
Rutina de lectura de teclado matricial 4x4
int8 teclado(){
Programación compilador en CCS

int tecla;
output_low(PIN_B3); // Coloca “0” en Fila A
if(input(PIN_B7)==0) tecla=7; // Cheque columnas 1
if(input(PIN_B6)==0) tecla=8; // 2
if(input(PIN_B5)==0) tecla=9; // 3
if(input(PIN_B4)==0) tecla=10; // 4
output_high(PIN_B3); // Coloca “1” en Fila A
output_low(PIN_B2); // Coloca “0” en Fila B
if(input(PIN_B7)==0) tecla=4; // Cheque columnas 1
if(input(PIN_B6)==0) tecla=5; // 2
if(input(PIN_B5)==0) tecla=6; // 3
if(input(PIN_B4)==0) tecla=11; // 4
output_high(PIN_B2); // Coloca “1” en Fila B

Sigue

Manuel Picón
Nombre del Seminario: Microprocesadores y microcontroladores 21
Programación de C PIC con CCS.

Ejemplos: (Continuación)
Rutina de lectura de teclado matricial 4x4
Programación compilador en CCS

output_low(PIN_B1); // Coloca “0” en Fila C


if(input(PIN_B7)==0) tecla=1; // Cheque columnas 1
if(input(PIN_B6)==0) tecla=2; // 2
if(input(PIN_B5)==0) tecla=3; // 3
if(input(PIN_B4)==0) tecla=12; // 4
output_high(PIN_B1); // Coloca “1” en Fila C
output_low(PIN_B0); // Coloca “0” en Fila D
if(input(PIN_B7)==0) tecla='#'; // Cheque columnas 1
if(input(PIN_B6)==0) tecla=0; // 2
if(input(PIN_B5)==0) tecla='*'; // 3
if(input(PIN_B4)==0) tecla=13; // 4
output_high(PIN_B0); // Coloca “0” en Fila D
return(tecla);
}

Manuel Picón
Nombre del Seminario: Microprocesadores y microcontroladores 22
Programación de C PIC con CCS.
#INT_xxx función_de_interrupción
Estas directivas especifican que la función que le sigue es una función de
interrupción. Las funciones de interrupción no pueden tener ningún parámetro.
Ejemplo:
Programación compilador en CCS

#INT_EXT // INTERRUPCIÓN EXTERNA


void detector_flanco(){
disable_interrupts(INT_EXT);
set_timer_0(0x6535);
enable_interrupts(INT_RTCC);
Bandera=1;
Output_high(PIN_E0);
}
#INT_RTCC // DESBORDAMIENTO DEL TIMER0 (RTCC)
void espera(){
If(bandera==1){
Output_low(PIN_E0);
output_high(PIN_E1);
set_timer_0(0x7030);
bandera=0;
}
else
Output_high(PIN_E1);
}
Sigue 
Manuel Picón
Nombre del Seminario: Microprocesadores y microcontroladores 23
Programación de C PIC con CCS.

#INT_xxx función_de_interrupción
(Continuación)
Programación compilador en CCS

Ejemplo:

void main(){
int y;
lcd_init();
set_tris_b(0x80);
det_tris_e(0x00);
setup_timer_0(RTCC_INTERNAL)
enable_interrupts( INT_EXT);
enable_interrupts(GLOBAL);
while(TRUE){
....
instrcciones ciclo programa principal
….
}
}

Manuel Picón

También podría gustarte