Beruflich Dokumente
Kultur Dokumente
DOCENTE:
MINI CURSO:
APLIQUEMOS C CCS Y
PROTEUS EN
MICROCONTROLADORES PIC
HERRAMIENTAS
Compilador PIC C.
PCW
Simulador PROTEUS.
ISIS profesional
DIFERENCIAS
DESCRIPCIN
ENSAMBLADOR
LENGUAJE C
Facilidad de programacin.
Desarrollos de programas
estructurados.
Precio.
SOFTWARE USADO
MPLAB C18 (Microchip): usado para PIC de 8 bits.
MPLAB C24 (Microchip): usado para PIC de 16 bits y
dsPIC.
MPLAB C32 (Microchip): usado para PIC de 32 bits,
PIC gama alta.
PICC (Hi Tech): soporte para gama de 24 y 32 bits.
Muy reservado por los fabricantes.
PCW compiler:
MikroC: compilador liviano. Bsico para iniciar a trabajar
con los PIC.
MPC, CC5X, SDCC compiler
COMPILADOR C CCS
INTRODUCCIN
Desarrollado
especficamente
para
PIC,
obteniendo la mxima optimizacin del compilador
con esos dispositivos.
Es un compilador que convierte el lenguaje de alto
nivel en cdigo de maquina.
COMPILADOR C CCS
CARACTERSTICAS
Amplia librera de funciones predefinidas.
Comandos de preprocesado.
Suministra los controladores para:
LCD.
Convertidores AD.
Relojes en tiempo real.
EEprom.
COMPILADOR C CCS
CARACTERSTICAS
Adems contiene:
Directivas estndar (#include, etc).
Directivas especficas para PIC (#device, etc).
Funciones especficas (bit_set(), etc)
ENTORNO DE TRABAJO
Existen tres compiladores bsicos:
PCB: usado en PIC de 12 bits.
PCM: usado en PIC 14 bits.
PCH: usado para PIC 16 bits.
Incluye compiladores con windows IDE (PCW y
PCWH).
Los ficheros utilizados son: C, H, PJT, HEX,
COF
ENTORNO DE TRABAJO
OJO!!!!!!
DIRECTIVAS, FUNCIONES
E INSTRUCCIONES
USADAS EN C CCS
OPERADORES
ASIGNACION:
OPERADORES
ARITMETICOS
OPERADORES
RELACIONALES - LOGICOS
OPERADORES
DE BITS - PUNTEROS
FUNCIONES EN C
Las funciones pueden devolver valores a las
sentencias que la invocan, indicando el tipo de dato.
En caso que no se requiera devolver valores se debe
especificar con el valor VOID.
DIRECTIVAS
comienzan
con el smbolo
# y continan
con
un
comando
especfico.
LISTO!!!
EMPECEMOS A CAMELLAR
MANEJO DE PUERTOS
Se pueden gestionar de dos formas:
Definiendo su posicin de memoria en
RAM.
#byte variable = cte;
Usando las directivas especficas del
compilador.
#use fast_io(), #use fixed_io(),
#standard_io().
PRIMERA FORMA
Accediendo a la RAM usando
declaracin de registros en C.
la
FUNCIONES RELACIONADAS
El uso de estas directivas debe venir
acompaado de algunas funciones especficas
del compilador como son:
output_x(valor);
//saca el valor por el puerto.
input_x();
//obtiene el valor del puerto.
set_tris_x(valor); //carga el registro TRIS con valor.
port_b_pullups(TRUE/FALSE);
FUNCIONES RELACIONADAS
O con funciones para el manejo de los bits:
bit_clear(variable,bit);
//0 en bit de variable.
bit_set(variable,bit);
//1 en bit de variable.
bit_test(variable,bit);
//muestra el bit de variable.
swap(variable);
//intercambio de bits.
O con funciones definidas a los terminales:
output_low(pin definido);
//pin definido en 0.
output_high(pin definido);
//pin definido en 1.
output_bit(pin definido,valor); //pin a valor.
output_toggle(pin definido);
//invierte pin.
input(pin definido);
//lee el pin
APLICACION 1
#include <16f887.h>
#use DELAY (clock = 4000000) //reloj 4 MHz
#FUSES XT, NOWDT
//definicin de registros por RAM
#BYTE TRISA = 0x85
#BYTE PORTA = 0x05
#BYTE TRISB = 0x86
#BYTE PORTB = 0x06
#BYTE OPTION_REG = 0x81
//programa principal
void main(){
//habilitar pull-up
bit_clear(OPTION_REG,7);
//pines como entrada / salida
bit_set(TRISB,0);
//B0 entrada
bit_clear(TRISB,1);
//B1 salida
bit_clear(TRISA,0);
//A0 salida
SIMULACION
AHORA MANEJEMOS
DISPLAY LCD.
TECLADOS MATRICIALES.
#include <lcd.c>
FUNCIONES RELACIONADAS
Funciones definidas para el manejo de LCD:
lcd_init();
//Qu hace?
//borra LCD - configuracin a 4 bits doble
lnea modo //encendido cursor apagado y
sin parpadeo autoincremento //de puntero de
direcciones sin desplazamiento real.
//limpia LCD.
//cursor salta de lnea.
//cursor retrocede.
Adems:
printf(string);
printf(cstring, values);
printf(fname, cstring, values);
//string es una cadena o arreglo de caracteres, values es una lista
de variables, fname es una funcin.
indicacin
Cuantos caracteres.
01 09
1.1-9.9
Coma flotante.
t puede ser:
c
s
u
d
Lu
Ld
x
X
Lx
LX
f
g
e
w
indicacin
caracter
Cadena o carcter
Entero sin signo.
Entero con signo.
Entero largo sin signo
Entero largo con signo
Entero hexadecimal (minscula).
Entero hexadecimal (mayscula).
Entero largo hexadecimal (minscula).
Entero largo hexadecimal (mayscula).
Flotante con truncado.
Flotante con redondeo
Flotante en formato exponencial.
Entero sin signo con decimales
insertados.
LIBRERIA LCD
APLICACION 2
#include <16f887.h>
#fuses XT, NOWDT
#use delay (clock = 4000000)
#include <LCD.C>
#BYTE TRISA = 0x85 //definicin de registros por RAM.
#BYTE PORTA = 0x05
int i=0, resultado;
void decimal();
void hexa();
//declaracin de funciones.
lcd_init();
//inicializacin de LCD
bit_set(TRISA,0);
resultado = valor1 + valor2;
//ciclo infinito de ejecucin
while(1){
//A0 entrada
//operacin
if(bit_test(PORTA,0) == 1){
if(i == 0){
delay_ms(300); //anti rebote
decimal();}
}
if(bit_test(PORTA,0) == 1){
if(i == 1){
delay_ms(300); //anti rebote
hexa();}
}
void decimal(){
lcd_gotoxy(1,1);
printf(lcd_putc, "\fRESUL DECIMAL:%u\n", resultado);
delay_ms(1000);
i++;
}
//funcin para resultado hexadecimal
void hexa(){
lcd_gotoxy(1,1);
printf(lcd_putc, "\fRESUL HEXA:%x\n", resultado);
delay_ms(1000);
i=0;
}
SIMULACION
#include <kbd.c>
MATRICIAL
AL
APLICACION 3
#include <16F877.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock= 4000000)
#include <lcd.c>
#include <kbd.c>
char valido[3]={'1','2','3'};
//clave valida
void main() {
//programa principal
char k;
int i, a, b;
char data[3], clave[3];
kbd_init();
//inicializa teclado
lcd_init();
//inicializa LCD
port_b_pullups(TRUE); //activa resistencias de pull up
while (TRUE) {
i=0; a=2; b=3;
printf(lcd_putc,"\fnumero 1\n");
while(i<=2){
k=kbd_getc();
if (k!=0) {
data[i]=k;
i++;
printf(lcd_putc,"\fnumero %u\n",i+1);
lcd_gotoxy(1,2);
printf(lcd_putc, "*");
lcd_gotoxy((a-1),2);
printf(lcd_putc, "*");
lcd_gotoxy((b-2),2);
printf(lcd_putc, "*");
//Siguiente dato
a++;
b++;
}
}
for (i=0;i<=2;i++) {
clave[i]=valido[i]; }
//Clave valida
//Clave incorrecta
SIMULACION
OTRA VENTAJA
Otra ventaja que ofrece el compilador C CCS
para el manejo de teclados matriciales es que
estos se pueden trabajar con los display LCD
en el mismo puerto, permitiendo la
disminucin de pines a la hora de alguna
aplicacin especial.
NOTA: esto se puede realizar siempre y
cuando no requiera el manejo de las
interrupciones externas por RB4 RB7.
APLICACION 4
#include <16F877.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock= 4000000)
#include <lcd.c>
#include <kbd.c>
void main() {
char k;
int x;
lcd_init();
kbd_init();
port_b_pullups(TRUE);
//funcin principal
//declaracin de variables
//inicializacin de LCD.
//inicializacin de teclado.
//resistencias de pullups activas
lcd_putc("\fOprima tecla...\n");
//ciclo de ejecucion infinito
while (TRUE) {
k=kbd_getc();
//lectura de teclado
x=k-48;
//Conversin numrica
if(k! =0){
//pregunta por la tecla presionada y visualiza su nombre
if(k=='1')
printf(lcd_putc,"\fUNO");
if(k=='2')
printf(lcd_putc,"\fDOS");
if(k=='3')
printf(lcd_putc,"\fTRES");
if(k=='4')
printf(lcd_putc,"\fCUATRO");
if(k=='5')
printf(lcd_putc,"\fCINCO");
if(k=='6')
printf(lcd_putc,"\fSEIS");
if(k=='7')
printf(lcd_putc,"\fSIETE");
if(k=='8')
printf(lcd_putc,"\fOCHO");
if(k=='9')
printf(lcd_putc,"\fNUEVE");
if(k=='0')
printf(lcd_putc,"\fDIEZ");
if(k=='*')
printf(lcd_putc,"\fASTERISCO");
if(k=='#')
printf(lcd_putc,"\fNUMERAL");
delay_ms(1000);
lcd_putc("\fOprima tecla...\n");
SIMULACION
AHORA MANEJEMOS
LA INTERRUPCION
EXTERNA RB0/INT.
#INT_EXT
FUNCIONES DEFINIDAS
enable_interrupts(aplicacion); //habilita interrupcin.
desable_interrupts(aplicacion); //deshabilita interrupcin.
aplicacin es un constante definida en el fichero de cabecera
#include<16F87x.h>
Enable_interrupts(aplicacion)
INTCON
GLOBAL
INT_EXT
11000000 C0h
00010000 10h
APLICACION 5
#include <16F887.h>
#fuses XT, NOWDT, PUT, NOWRT
#use delay(clock= 4000000) //frecuencia de reloj
#BYTE TRISB = 0x86
#BYTE PORTA = 0x06
//definicin de registros
#INT_EXT
ext_isr(){
output_high(PIN_B1);
delay_ms(1000);
output_low(PIN_B1);
}
//Funcin de interrupcin
//enciende LED
//tiempo de 1 segundo
//Apaga LED
void main() {
bit_set(TRISB,0);
bit_clear(TRISB,1);
//B0 entrada
//B1 salida
output_low(PIN_B1);
port_b_pullups(TRUE);
//Apaga LED
//Pull-up para RB0
enable_interrupts(INT_EXT);
ext_int_edge(L_TO_H);
enable_interrupts(GLOBAL);
while (1){
}
}
//Programa principal
SIMULACION
AHORA MANEJEMOS
EL TMR0
EL CONTADOR/TEMPORIZADOR
TMR0
Los TIMERs interrumpen la ejecucin del programa
cuando los registros vinculados a estos, se desbordan,
es decir, reinician su conteo despus de llegar al
mximo del valor. El mximo valor depende del tamao
de este.
EL CONTADOR/TEMPORIZADOR
TMR0
El registro OPTION_REG modifica lo siguiente:
EL CONTADOR/TEMPORIZADOR
TMR0
La siguiente tabla determina el divisor de frecuencia programado:
PS2, PS1 y PS0
000
001
010
011
100
101
110
111
TMR0
1:2
1:4
1:8
1:16
1:32
1:64
1:128
1:256
FUNCIONES DEFINIDAS
mod
OPTION_REG
RTCC_INTERNAL
RTCC_EXT_L_TO_H
0X00
0X20
RTCC_EXT_H_TO_L
RTCC_DIV_1
RTCC_DIV_2
RTCC_DIV_4
RTCC_DIV_8
RTCC_DIV_16
RTCC_DIV_32
RTCC_DIV_64
RTCC_DIV_128
RTCC_DIV_256
0X30
0X08
0X00
0X01
0X02
0X03
0X04
0X05
0X06
0X07
APLICACION 6
EXPLICACION!!!
Para generar una seal de 1 kHz se necesita un
semiperiodo de 500 us. Segn la ecuacin para calculo
del TMR0, utilizando un cristal de 4 MHz y u
preescalador de 2, se tiene:
#INCLUDE <16F876.h>
#use delay(clock=4000000)
#fuses XT,NOWDT
#use standard_io(B)
#int_TIMER0
void TIMER0_isr(void) {
output_toggle(PIN_B0);
set_timer0 (0x1B); }
void main() {
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
//Configuracin timer0
set_timer0 (0x1B);
//Carga del timer0
enable_interrupts(INT_TIMER0);
//Habilita interrupcin timer0
enable_interrupts(global);
//Habilita interrupcin general
while (1);
//bucle infinito
SIMULACION
SIGAMOS CON
EL CONVERSOR
ANALOGO DIGITAL (A/D)
CARACTERISTICAS
Los microcontroladores PIC de gama media
posee un C A/D con las siguientes
caractersticas:
10 bits de resolucin.
8 Canales de entrada.
La resolucin es funcin de la tensin de referencia.
EJEMPLO
Vref+ = 5Vdc
Vref- = tierra
Y el numero de bits del convertidor es: N = 10
Resolucin= 5 / 1024
Resolucin = 4.8 mV / bit.
Ahora, si la lectura es 512 LSB, la tensin analgica leda es:
REGISTROS DE TRABAJO
El mdulo de A/D tiene cuatro registros. Estos
registros son:
ADRESH : Parte alta del resultado de la
conversin.
ADRESL: Parte baja del resultado de la
conversin.
ADCON0: Registro de Control 0 ;control del
funcionamiento del conversor.
ADCON1:
Registro
de
Control
1;
configuracin de los pines del puerto.
REGISTRO ADCON0
Controla la operacin del CA/D
REGISTRO ADCON0
Controla la operacin del CA/D
REGISTRO ADCON0
Controla la operacin del CA/D
REGISTRO ADECON1
Se trata de un registro de configuracin de los pines
del puerto, este registro se compone de 8 bits:
REGISTRO ADECON1
PCFG3:PCFG0: bits de configuracin de los canales
de entrada del convertidor A/D. Se utilizan para
configurar las patillas como E/S digital o como
entrada analgica: A= Entrada Analgica; D = E/S Digital
ADCON0(1Fh)
ADC_OFF
00000000 - 00h
ADC_CLOCK_INTERNAL
11000000 - C0h
ADC_CLOCK_DIV_2
00000000 - 00h
ADC_CLOCK_DIV_8
01000000 - 40h
ADC_CLOCK_DIV_32
10000000 - 80h
A/D
setup_adc_channel(canal);
Canal: seleccin del canal analgico correspondiente a los bits
5:3 del registro ADCON0.
ADEMAS
Valor = read_adc();
//Lectura del ADC.
Lectura del resultado donde valor es un nmero entero
de 16 bits segn la directiva #DEVICE ADC =
empleada. Dicha directiva trabaja segn la tabla:
APLICACION 7
#include <16F876.h>
#device adc=10
//directiva para manejo ADC 10 bits
#FUSES XT, NOWDT
#use delay(clock=4000000)
//reloj
#include <LCD.C>
//librera LCD
void main() {
int16 q;
float p;
//inicio de programa
//declaracion de variables.
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
//Canal 0 analgico
//Fuente de reloj RC
lcd_init();
for (;;) {
set_adc_channel(0);
delay_us(20);
q = read_adc();
p = 5.0 * q / 1024.0;
SIMULACION
SIGAMOS CON
COMUNICACION SERIAL
USANDO EL MODULO
USART
COMUNICACION SERIAL
CARACTERISTICAS:
COMUNICACION SERIAL
Es una interfaz que designa una norma para el
intercambio serie de datos binarios entre un equipo
terminal de datos (DTE) y un equipo de terminacin del
circuito de datos (DCE). Permite comunicacin con
otras computadoras y otros dispositivos como: mouse,
impresoras, microcontroladores.
COMUNICACION SERIAL
El RS-232 C es una norma para la conexin entre un DTE y un
DCE que define:
COMUNICACION SERIAL
Existen dos formas de comunicacin serial:
Sincrnica: adems de una lnea sobre la que
transfieren los datos, se necesita otra que contenga
los pulsos de reloj.
La duracin del bit est determinada por la duracin
del pulso de sincronismo.
COMUNICACION SERIAL
Existen dos formas de comunicacin serial:
Asincrnica: los pulsos de reloj no son necesarios y
se acude a otros mecanismos para realizar la
lectura/escritura de los datos.
la duracin de cada bit est determinada por la
velocidad con la cual se realiza la transferencia de
datos.
X=(Fosc/(FrecBaudios*K))-1
K = 64, BRGH = 0, baja velocidad.
K = 16, BRGH = 1, alta velocidad.
Bit [0] TX9D.- Este es el noveno bit de datos en el caso de una transmisin de 9 bits.
Bit [1] TRMT.-Cuando est en 1 indica que el registro de transmisin TXREG est vaco, esto
implica que puede escribirse un nuevo dato.
Bit [2] BRGH.- Este bit slo se utiliza en modo asncrono, y sirve para seleccionar uno de los dos
modos de velocidades.
Bit [3] No se utiliza, se lee como 0.
Bit [4] SYNC.- Este bit se pone a 1 para utilizar el modo sncrono o a 0 para el modo asncrono.
Bit [5] TXEN.- En modo asncrono este bit se pone a 1 para activar las transmisiones de datos.
Bit [6] TX8/9.- Este bit selecciona una transmisin de 8 bits si est a 1 o de 9 bits si est a 1.
Bit [7] CSRC.- En modo asncrono, este bit no se utiliza.
Bit [0] RX9D.- Este es el noveno bit de datos en el caso de una transmisin de 9 bits.
Bit [1] OERR.- Este bit se pone a 1 en caso de error de desbordamiento.
Bit [2] FERR.- Este bit se pone a 1 en caso de error de formato.
Bit [3]. Deteccin de direccin. Maestro y esclavos.
Bit [4] CREN.- En modo asncrono debe estar a 1 para autorizar la recepcin. En modo
asncrono autoriza que se contine la recepcin.
Bit [5] SREN.- En modo asncrono no se utiliza, en modo asncrono este bit debe estar a 1 para
activar la recepcin.
Bit [6] RX8/9.- Este bit debe estar a 1 para activar la transmisin de 9 bits.
Bit [7] SPEN.- Este bit debe estar a 1 para activar la USART.
FUNCIONES DEFINIDAS
Algunas funciones de la USART:
setup_uart(baud);
baud es una constante que define la velocidad.
set_uart_speed(baud);
baud es una constante que define la velocidad.
Ejemplo:
set_uart_speed(2400);
set_uart_speed(4800);
set_uart_speed(9600);
set_uart_speed(19200);
FUNCIONES DEFINIDAS
Para transmisin de datos:
putc(cdata);
putchar(cdata);
cdata es un carcter de 8 bits.
puts(string);
string es una cadena de caracteres constante o matriz
de caracteres terminada con un 0. (puts () manda los
caracteres de la cadena uno a uno por medio de la
funcin putc ()).
OTRAS FUNCIONES
printf (fname, cstring, values);
cstring: es una cadena de caracteres o matriz de
caracteres terminados con un 0.
fname: las funciones utilizadas para escribir la cadena
indicada (por defecto se utiliza la funcin putc).
values: valores a incluir en la cadena separados por
comas. %nt, donde n es opcional.
1 9: para especificar cuantos caracteres se quiere.
01 09: para indicar la cantidad de ceros a la izquierda.
1.1 1.9 para coma flotante.
carcter
Cadena o carcter
Lu
Ld
Lx
LX
FUNCIONES DEFINIDAS
Funciones para recepcin de datos:
value = getc ();
value = getch ();
value = getchar ();
value es un carcter de 8 bits.
valor = kbhit ();
valor es 0 (FALSE) getc() debe esperar a que llegue
un carcter.
valor es 1 (TRUE) ya hay un carcter que puede ser
ledo por la funcin getc().
APLICACION 8
DESARROLLO DEL
SISTEMA DE
TRANSMISION PARA EL
MICROCONTROLADOR A
#include <16F877.h>
#FUSES XT,NOWDT
#use delay(clock=4000000)
//reloj
void main() {
int valor;
lcd_init();
//funcin principal
//declaracin de variable.
//inicializa LCD
while(1){
//ciclo de ejecucin infinito
for (valor=0;valor<=10;valor++) {
//envo de datos
PUTC(valor);
//enva datos al hiper terminal
printf(lcd_putc,"\fenviando=%1D",valor); //enva dato a LCD
delay_ms(500);
}
}
}
DESARROLLO DEL
SISTEMA DE RECEPCION
PARA EL
MICROCONTROLADOR B
#include <16F876.h>
#FUSES XT,NOWDT
#use delay(clock=4000000)
//reloj
void main() {
//funcin principal
lcd_init();
//inicializa LCD
enable_interrupts(INT_RDA); //int. Por recepcin activa
enable_interrupts(GLOBAL); //permiso global de int.
for (;;) {
//ciclo infinito de ejecucin
lcd_gotoxy(1,1);
printf(lcd_putc,"recibiendo=%1D",valor);
//escribe en LCD en la posicin 1,1.
}
}
SIMULACION
PARA FINALIZAR
EL MODULO I2C (Interfaz
Inter Circuitos) Y LAS
MEMORIAS EEPROM
EL BUS I2C
CARACTERISTICAS:
Se basa en la comunicacin a travs de dos hilos.
CONDICIONES DELBUS
FORMATOS DE TRANSFERENCIA DE
INFORMACION
FORMATOS DE TRANSFERENCIA
DE INFORMACION
FORMATO COMBINADO: este formato implica el
cambio de sentido de la informacion, as que el
dispositivo que en principio se comporta como
receptor, luego lo har como transmisor.
CARACTERISTICAS ELECTRICAS
LA MEMORIA
EEPROM
LA MEMORIA 24LC256
Fabricada por microchip.
Capacidad de almacenamiento de 256 Kbits (32
Kbyts).
Compone de 512 paginas de 64 bytes cada una.
Tiempo de escritura 5 ms.
Ciclos de escritura/lectura 1000.000.
Velocidad mxima de operacin 400 KHz.
Consumo durante la escritura 3 mA a 5.5 V.
Consumo durante la lectura 400 uA a 5.5 V.
Capacidad de retencin mayor a 200 aos.
#USE I2C(opciones)
MULTI_MASTER
MASTER
SLAVE
SCL = pin
SDA = pin
ADDRESS = pin
FAST
SLOW
RESTART_WDT
FORCE_HW
NOFLOAT_HIGH
SMBUS
STREAM = id
write_ext_eeprom(direccion, valor);
Funcin de lectura:
valor = read_ext_eeprom(direccion);
APLICACION 9
#include <16f877.h>
//usamos el pic 16f877
#fuses xt, nowdt, nolvp, noprotect
#use delay(clock=4000000) //reloj
#include <LCD.C>
//Librera LCD
#include <J24lc256.H>
//librera EEPROM I2C
//se define I2C con modo maestro, pines SDA y SCL
#use i2c(MASTER,SDA=PIN_C4,SCL=PIN_C3)
INT cnt=0,JASO=0;
//variables globales
void main()
//funcin principal
{
lcd_init();
//Inicia LCD
init_ext_eeprom(); //Inicia memoria
while(true)
{
// bucle infinito
SIMULACION
ANIMO!!!
A PROGRAMAR
SE DIJO!!!...