mini curso control

Post on 25-Dec-2015

66 Views

Category:

Documents

10 Downloads

Preview:

Click to see full reader

DESCRIPTION

TALLER DEINSTRUMENTACIÓN YCONTROL

TRANSCRIPT

XIII MUSTRA TECNOLOGICA Y XII SEMINARIO TALLER DE

INSTRUMENTACIÓN Y CONTROL

MINI CURSO:APLIQUEMOS C CCS Y

PROTEUS EN MICROCONTROLADORES PIC

DOCENTE:EDWARD MARÍN GARCÍA

INGENIERO Y TECNÓLOGO ELECTRÓNICOMAGISTER EN INGENIERÍA ELÉCTRICA.

MINI CURSO:APLIQUEMOS C CCS Y

PROTEUS EN MICROCONTROLADORES PIC

EL MINI CURSO INCLUYE:• Libreta de apuntes conmemorativas al XIII

seminario taller y XII muestra tecnológica.• Presentación del mini curso.• Aplicaciones simuladas en el mini curso.• Instalador para compilador C CCS (opcional).• Instalador simulador proteus (opcional).• Archivo con instrucciones para el manejo del

compilador C CCS.

HERRAMIENTAS• Compilador PIC – C.

PCW

• Simulador PROTEUS.ISIS profesional

• Documentos de trabajo con ejemplos, ejercicios y simulaciones.

COMPILADORES PARA PICPROGRAMACION EN LENGUAJES DE BAJO NIVEL:• Códigos en lenguaje de maquina. (0 – 1). En paquetes

de bits.

PROGRAMACIÓN EN LENGUAJES DE ALTO NIVEL:• Utiliza programas independientes a la plataforma

utilizada por los dispositivos.• Algunos programas son: BASIC, FORTRAN, PASCAL y

C.

DIFERENCIAS DESCRIPCIÓN ENSAMBLADOR LENGUAJE C

Facilidad de programación. XTiempos de desarrollo menor. XPortabilidad entre sistemas. XDesarrollos de programas

estructurados.X

Fuertemente dependiente al hardware XMenor numero de instrucciones para

generar una tarea.X

Mayor velocidad de ejecución. XReducido numero de instrucciones X

COMPILADORES DE C PARA PIC

Para la elección del compilador se deben teneren cuenta los siguientes factores:

• Optimización del código generado.• Dispositivos para los que compilador es capazde generar código.

• Funciones y directivas definidas.• Posibilidades adicionales como inserción decódigo ensamblador…

• 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. Básico para iniciar a trabajar

con los PIC.• MPC, CC5X, SDCC compiler…

COMPILADOR C CCS

INTRODUCCIÓN

Desarrollado específicamente para PIC,obteniendo la máxima optimización del compiladorcon esos dispositivos.

Es un compilador que convierte el lenguaje de altonivel en código de maquina.

COMPILADOR C CCS

CARACTERÍSTICAS

• Amplia librería de funciones predefinidas.• Comandos de preprocesado.• Suministra los controladores para:

– LCD.– Convertidores AD.– Relojes en tiempo real.– EEprom.

COMPILADOR C CCS

CARACTERÍSTICAS

Además contiene:

• Directivas estándar (#include, etc).• Directivas específicas para PIC (#device, etc).• Funciones específicas (bit_set(), etc)

INICIAMOS CON LA FORMA DE PROGRAMACION CON EL

COMPILADOR C CCS PARA MICROCONTROLADORES PIC

SIGAMOS LA PRESENTACIÓN DETALLADAMENTE

ENTORNO DE TRABAJOExisten tres compiladores básicos:

• 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 yPCWH).

Los ficheros utilizados son: C, H, PJT, HEX,COF

ENTORNO DE TRABAJO

COMO CREAR UN PROYECTO?

COMO CREAR UN ARCHIVO FUENTE?

ENTORNO DEL ARCHIVO FUENTE

CREA PROYECTO MANUAL

SELECCION DEL MICROCONTROLADOR A TRABAJAR

OJO!!!!!!DIRECTIVAS, FUNCIONES

E INSTRUCCIONES USADAS EN C CCS

Para escribir un programa en C en CCS sedebe tener en cuenta la siguiente estructura:

• Directivas de preprocesado: controlan la conversióndel programa a código máquina por parte delcompilador.

#include<16f877.h>• Programas o funciones: conjunto de instrucciones.

void main()• Instrucciones: Indica el comportamiento del PIC entodo momento.

eneable_interrupts(global);• Comentarios: permite describir lo que significa cadalínea.

// habilita interrupción general

VARIABLES “Global - Local”Se utilizan para nombrar posiciones de memoria.Pueden ser de tipo LOCAL o GLOBAL.

OPERADORESASIGNACION:

OPERADORES

ARITMETICOS

OPERADORES

RELACIONALES - LOGICOS

OPERADORES

DE BITS - PUNTEROS

FUNCIONES EN CLas funciones pueden devolver valores a lassentencias que la invocan, indicando el tipo de dato.En caso que no se requiera devolver valores se debeespecificar con el valor VOID.

Las funciones pueden agruparse en ficheros delibrerías <fichero.h>, que se pueden utilizar mediante ladirectiva #include<fichero.h>

DIRECTIVAScomienzancon el símbolo# y continúancon uncomandoespecífico.

COMO LAS EMPLEAMOS?#DEVICE chip: permite definir el PIC a utilizar.

#device PIC16f877#FUSES options: define la palabra de configuraciónpara programar un PIC.

#device PIC16f877#fuses XT, NOWDT

#INCLUDE “filename”: permite incluir el fichero en elprograma.

#include<16f877>#USE DELAY (CLOCK=SPEED): define la frecuenciadel oscilador del PIC.

#include<16f877>#use delay(clock=4000000)

FUNCIONES PREDEFINIDAS EN C CCSC CCS poseefuncionespredefinidaspara usar elPIC y susperiféricos.

LISTO!!!EMPECEMOS A CAMELLAR

MANEJO DE PUERTOS

Se pueden gestionar de dos formas:• Definiendo su posición de memoria en

RAM.#byte variable = cte;

• Usando las directivas específicas del compilador.

#use fast_io(), #use fixed_io(), #standard_io().

PRIMERA FORMA

Accediendo a la RAM usando ladeclaración de registros en C.

#BYTE TRISB = 0x86;#BYTE PORTB = 0x06;

Después de declaradas, pueden ser usadas por medio de asignaciones sencillas en C:

TRISB = 0x00; //Puerto B como salidaPORTB = 0Xff; //Pines del puerto B activos

FUNCIONES RELACIONADASEl uso de estas directivas debe veniracompañado de algunas funciones específicasdel 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 RELACIONADASO 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

Desarrollar un sistema que permita prender yapagar dos LEDs, a manera de complemento,en donde, el primero encienda y el segundoapague, usando como mando un suiche.

#include <16f887.h>#use DELAY (clock = 4000000) //reloj 4 MHz#FUSES XT, NOWDT

//definición de registros por RAM#BYTE TRISA = 0x85#BYTE PORTA = 0x05#BYTE TRISB = 0x86#BYTE PORTB = 0x06#BYTE OPTION_REG = 0x81

//programa principalvoid main(){

//habilitar pull-upbit_clear(OPTION_REG,7);

//pines como entrada / salidabit_set(TRISB,0); //B0 entradabit_clear(TRISB,1); //B1 salidabit_clear(TRISA,0); //A0 salida

//ciclo infinito de ejecuciónwhile(1){

//prendo/apago LEDsif(bit_test(PORTB,0) == 1){

bit_set(PORTB,1);bit_clear(PORTA,0);}

//prendo/apago LEDselse{

bit_clear(PORTB,1);bit_set(PORTA,0);}

}}

SIMULACION

AHORA MANEJEMOS… DISPLAY LCD.

TECLADOS MATRICIALES.

COMO MANEJO UN DISPLAY LCD?

El compilador C CCS tiene un driver quepermite manipular los LCD.

El archivo es LCD.C y debe llamarsecomo:

#include <lcd.c>

FUNCIONES RELACIONADASFunciones definidas para el manejo de LCD:

lcd_init(); //primera función que debe ser llamada.

//¿Qué hace?//borra LCD - configuración a 4 bits – doblelínea – modo //encendido – cursor apagado ysin parpadeo – autoincremento //de puntero dedirecciones – sin desplazamiento real.

OTRAS FUNCIONES RELACIONADAS

lcd_gotoxy(x,y); //posición en LCD (x,y).

lcd_getc(x,y); //lee carácter en posición (x,y).

lcd_putc(s); //escribe variable tipo char.

También se tiene las siguientes funciones:

\f //limpia LCD.

\n //cursor salta de línea.

\b //cursor retrocede.

Además: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 función.

El formato utilizado es %nt, cuya indicación lomuestran las siguientes tablas:

n puede ser: indicación1-9 Cuantos caracteres.

01 – 09 Cantidad de ceros a la izquierda.

1.1-9.9 Coma flotante.

t puede ser: indicaciónc caracters Cadena o carácteru Entero sin signo.d Entero con signo.

Lu Entero largo sin signoLd Entero largo con signox Entero hexadecimal (minúscula).X Entero hexadecimal (mayúscula).Lx Entero largo hexadecimal (minúscula).LX Entero largo hexadecimal (mayúscula).f Flotante con truncado.g Flotante con redondeoe Flotante en formato exponencial.w Entero sin signo con decimales

insertados.

COMO CONECTO LA LCD AL MICROCONTROLADOR?

Por defecto se usa el PORTD, pero en caso quese requiera usarlo en el PORTB, se debeacceder directamente al driver de la LCD y secomenta la instrucción:

//#define use_portb_lcd TRUE

LIBRERIA LCD

APLICACION 2

Desarrollar un sistema que permita visualizaren display LCD el resultado de una operaciónmatemática y obtener los resultados endecimal y hexadecimal, cambiando losresultados por medio de un mando externoingresados por el PORTA.

#include <16f887.h>#fuses XT, NOWDT#use delay (clock = 4000000)#include <LCD.C>

#BYTE TRISA = 0x85 //definición de registros por RAM.#BYTE PORTA = 0x05

int i=0, resultado; //declaración de variables globales

void decimal(); //declaración de funciones.void hexa();

void main(){ //programa principal

int valor1=3, valor2=17; //declaración de variable de operación

lcd_init(); //inicialización de LCD

bit_set(TRISA,0); //A0 entradaresultado = valor1 + valor2; //operación

//ciclo infinito de ejecuciónwhile(1){

//ciclo infinito de ejecuciónwhile(1){

//menú principallcd_gotoxy(1,1);printf(lcd_putc, "INICIO OPERACION");lcd_gotoxy(1,2);printf(lcd_putc, "SELECCIONE...");

//pregunta por pulso de mando externo PORTA

if(bit_test(PORTA,0) == 1){if(i == 0){

delay_ms(300); //anti rebotedecimal();}

}if(bit_test(PORTA,0) == 1){

if(i == 1){delay_ms(300); //anti rebotehexa();}

}

//función para resultado decimal

void decimal(){lcd_gotoxy(1,1);printf(lcd_putc, "\fRESUL DECIMAL:%u\n", resultado);delay_ms(1000);i++;

}//función para resultado hexadecimal

void hexa(){lcd_gotoxy(1,1);printf(lcd_putc, "\fRESUL HEXA:%x\n", resultado);delay_ms(1000);i=0;

}

SIMULACION

COMO MANEJO UN TECLADO MATRICIAL?

Este compilador tiene incluido en sus librerías,el driver KBD.C, usado para el manejo deteclados matriciales de 3 x 4.

#include <kbd.c>

FUNCIONES DEFINIDAS PARA EL MANEJO DEL TELADO MATRICIAL

kbd_init(); //primera función que debe ser llamada.

kbd_getc (); //retorna valor de tecla pulsada.

COMO CONECTO UN TECLADO MATRICIAL ALMICROCONTROLADOR?

Este archivo viene por defecto para trabajar por elPORTD, pero en caso de requerir el manejo deldispositivo por el PORTB, se debe desactivar lasiguiente instrucción del driver utilizado:

#define use_portb_kbd TRUE

APLICACION 3

Desarrollar un sistema que permita ingresar una clave de tresdígitos por medio de un teclado matricial de 3 x 4. Visualizar elcarácter “*” cuando se van ingresando los datos en un displayLCD de 2 x 16. El usuario en caso de ingresar los datos mal, en lapantalla aparecerá un mensaje <<calve incorrecta>>, en caso deacertar con la clave, aparecerá el mensaje <<clave correcta>>, einmediatamente encenderá un LED.

#include <16F877.h>#fuses XT,NOWDT,NOPROTECT,NOLVP#use delay(clock= 4000000)

#include <lcd.c> //llamada a librería del LCD

#include <kbd.c> //llamada a librería de teclado.

char valido[3]={'1','2','3'}; //clave valida

void main() { //programa principal

char k;int i, a, b;char data[3], clave[3]; //variables guardar clave y datos

kbd_init(); //inicializa tecladolcd_init(); //inicializa LCDport_b_pullups(TRUE); //activa resistencias de pull up

while (TRUE) { //ciclo de ejecución infinitoi=0; a=2; b=3;

printf(lcd_putc,"\fnumero 1\n"); //Para primer dato

while(i<=2){ //corrimiento de tres datosk=kbd_getc(); //Lee el tecladoif (k!=0) { //Si se ha pulsado alguna tecla

data[i]=k; //se guarda en la posición correspondiente

i++;

printf(lcd_putc,"\fnumero %u\n",i+1); //Siguiente dato

lcd_gotoxy(1,2); //visualiza caracter '*'printf(lcd_putc, "*");lcd_gotoxy((a-1),2); //visualiza caracter '*'printf(lcd_putc, "*");lcd_gotoxy((b-2),2); //visualiza caracter '*'printf(lcd_putc, "*");

a++;b++;

}}

for (i=0;i<=2;i++) { clave[i]=valido[i]; } //Clave valida

//Compara los datos con la claveif ((data[0]==clave[0])&&(data[1]==clave[1])&&(data[2]==clave[2])){

//datos correctos!!!printf(lcd_putc,"\fClave correcta"); output_high(PIN_A0); //activa LEDdelay_ms(1000);output_low(PIN_A0); //desactiva LED

}

else //datos incorrectos!!!printf(lcd_putc,"\fClave incorrecta"); //Clave incorrectadelay_ms(1000);

}}

SIMULACION

OTRA VENTAJAOtra ventaja que ofrece el compilador C CCSpara el manejo de teclados matriciales es queestos se pueden trabajar con los display LCDen el mismo puerto, permitiendo ladisminución de pines a la hora de algunaaplicación especial.

NOTA: esto se puede realizar siempre ycuando no requiera el manejo de lasinterrupciones externas por RB4 – RB7.

APLICACION 4

Desarrollar un sistema que permita visualizaren un display LCD de 2 x 16, la palabracorrespondiente a la tecla presionada. Use elmínimo de pines posible.

#include <16F877.h>#fuses XT,NOWDT,NOPROTECT,NOLVP#use delay(clock= 4000000)

#include <lcd.c>#include <kbd.c>

void main() { //función principalchar k; //declaración de variablesint x;

lcd_init(); //inicialización de LCD.kbd_init(); //inicialización de teclado.port_b_pullups(TRUE); //resistencias de pullups activas

lcd_putc("\fOprima tecla...\n");

//ciclo de ejecucion infinitowhile (TRUE) {

k=kbd_getc(); //lectura de tecladox=k-48; //Conversión numéricaif(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.

LA INTERRUPCION EXTERNA RB0La fuente de interrupciones externa INT/RB0 es muyimportante para atender eventos externos en tiemporeal. Cuando la línea RB0/INT se hace una petición deinterrupción el bit INTF del registro INTCON se pone a“1” de forma automática y, si el bit GIE está a “1”, sepone en marcha el mecanismo ya comentado de lainterrupción.

LA INTERRUPCION EXTERNA RB0Mediante el bit INTDEG del registro OPTION_REG esseleccionado el flanco activo de RB0/INT, ya que conéste puesto a “1” el flanco activo es el ascendente ycuando está a “0” el flanco activo es el descendente. Elprograma de atención a la interrupción antes deregresar al programa principal debe borrar el flag INTF,puesto que en caso contrario al ejecutar la instrucciónde retorno de interrupción RETFIE se volverá adesarrollar el mismo proceso de interrupción.

COMO TRABAJO CON LA INTERRUPCION EXTERNA RB0?

Si se utilizan las directivas de interrupción, elcompilador genera el código necesario paraejecutar la función que sigue a la directiva.Además genera el código necesario paraguardar al principio y restituir al final elcontexto; también borrara el flag activo por lainterrupción.

#INT_EXT

FUNCIONES DEFINIDASenable_interrupts(aplicacion); //habilita interrupción.

desable_interrupts(aplicacion); //deshabilita interrupción.

aplicación es un constante definida en el fichero de cabecera#include<16F87x.h>

Además se pueden utilizar las siguientes funciones:

ext_int_edge(H_TO_L); //interrupción por flanco de bajada.

ext_int_edge(L_TO_H); //interrupción por flanco de subida.

Enable_interrupts(aplicacion) INTCONGLOBAL 11000000 – C0hINT_EXT 00010000 – 10h

APLICACION 5

Desarrollar un sistema que permita encenderun LED durante 1 segundo cuando seproduzca una pulsación originada en el pinRB0.

#include <16F887.h>#fuses XT, NOWDT, PUT, NOWRT#use delay(clock= 4000000) //frecuencia de reloj

#BYTE TRISB = 0x86 //definición de registros

#BYTE PORTA = 0x06

#INT_EXT //directiva de interrupción por cambio en RB0

ext_isr(){ //Función de interrupción

output_high(PIN_B1); //enciende LED

delay_ms(1000); //tiempo de 1 segundo

output_low(PIN_B1); //Apaga LED

}

void main() { //Programa principal

bit_set(TRISB,0); //B0 entradabit_clear(TRISB,1); //B1 salida

output_low(PIN_B1); //Apaga LEDport_b_pullups(TRUE); //Pull-up para RB0

enable_interrupts(INT_EXT); //Habilita interrupción RB0.ext_int_edge(L_TO_H); //flanco de subidaenable_interrupts(GLOBAL); //Habilita interrupción global

while (1){ //ciclo de ejecución infinito}

}

SIMULACION

AHORA MANEJEMOS…

EL TMR0

EL CONTADOR/TEMPORIZADOR TMR0

Los TIMERs interrumpen la ejecución del programacuando los registros vinculados a estos, se desbordan,es decir, reinician su conteo después de llegar almáximo del valor. El máximo valor depende del tamañode este.

El TMR0 tiene asociado un registro de 8 bits.

Los registros asociados son:• OPTION_REG: configura el hardware.• INTCON: permite trabajar con la interrupción.• TRISA: habilita la patita RA4.

EL CONTADOR/TEMPORIZADOR TMR0

El registro OPTION_REG modifica lo siguiente:

T0CS: bit de selección de la fuente de reloj para el TMR0.1 = transición RA4/T0CKI. 0 = ciclo de reloj interno (CLKOUT).

T0SE: flanco de transición del TMR0.1 = incrementa con transición de alto a bajo.0 =incrementa con transición de bajo a alto.

PSA: asignación del preescalador.1 = el preescalador es asignado a el WDT.0 = el preescalador es asignado al modulo Timer0.

PS2:PS0: bits de selección para la frecuencia del preescalador.

EL CONTADOR/TEMPORIZADOR TMR0

La siguiente tabla determina el divisor de frecuencia programado:

El tiempo de desbordamiento el TMR0 se calcula según lasiguiente ecuación:

PS2, PS1 y PS0 TMR0000 1:2001 1:4010 1:8011 1:16100 1:32101 1:64110 1:128111 1:256

COMO TRABAJO CON LA INTERRUPCION POR DESBORDAMIENTO DEL TMR0?

El compilador C CCS tiene una directiva usada para elmanejo de interrupciones usando el desbordamientodel TMR0:

#INT_TIMER0

Funciones definidas para el manejo del TMR0:setup_timer_0(mod); //configura el TMR0Donde mod indica la función a realizar por el TMR0

set_timer0(valor); //escribe valor (8 bits) en el registro.

aux=get_timer0(valor); //lee valor (8 bits) actual del registro.

FUNCIONES DEFINIDAS

Los mod se pueden agrupar mediante elsímbolo |.

mod OPTION_REGRTCC_INTERNAL 0X00

RTCC_EXT_L_TO_H 0X20RTCC_EXT_H_TO_L 0X30

RTCC_DIV_1 0X08RTCC_DIV_2 0X00RTCC_DIV_4 0X01RTCC_DIV_8 0X02

RTCC_DIV_16 0X03RTCC_DIV_32 0X04RTCC_DIV_64 0X05

RTCC_DIV_128 0X06RTCC_DIV_256 0X07

APLICACION 6

Desarrollar un sistema que permita generaruna señal cuadrada de 1 kHz utilizando lainterrupción TMR0

EXPLICACION!!!Para generar una señal de 1 kHz se necesita unsemiperiodo de 500 us. Según la ecuación para calculodel TMR0, utilizando un cristal de 4 MHz y upreescalador de 2, se tiene:

Esta relación solo se cumple en ensamblador, pero enlenguaje C, el compilador genera líneas de código queaumentan el tiempo de ejecución. Por tanto el valor acargar es:

#INCLUDE <16F876.h>#use delay(clock=4000000)#fuses XT,NOWDT#use standard_io(B)

#int_TIMER0 //directiva de int. desb. TMR0

void TIMER0_isr(void) {output_toggle(PIN_B0);set_timer0 (0x1B); } //Se recarga el timer0

void main() {setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); //Configuración timer0

set_timer0 (0x1B); //Carga del timer0

enable_interrupts(INT_TIMER0); //Habilita interrupción timer0

enable_interrupts(global); //Habilita interrupción general

while (1); //bucle infinito

SIMULACION

SIGAMOS CON…

EL CONVERSOR ANALOGO DIGITAL (A/D)

CARACTERISTICASLos microcontroladores PIC de gama mediaposee un C A/D con las siguientescaracterísticas:

• 10 bits de resolución.• 8 Canales de entrada.• La resolución es función de la tensión de referencia.

EJEMPLO

Vref+ = 5Vdc Vref- = tierraY el numero de bits del convertidor es: N = 10Resolución= 5 / 1024Resolución = 4.8 mV / bit.

Ahora, si la lectura es 512 LSB, la tensión analógica leída es:

VIN = 512 * 4.8 mVVIN = 2,4567 V

REGISTROS DE TRABAJOEl módulo de A/D tiene cuatro registros. Estos

registros son:• ADRESH : Parte alta del resultado de la

conversión.• ADRESL: Parte baja del resultado de la

conversión.• ADCON0: Registro de Control 0 ;control del

funcionamiento del conversor.• ADCON1: Registro de Control 1;

configuración de los pines del puerto.

REGISTRO ADCON0Controla la operación del CA/D

• ADCS1:ADCS0: En estos dos bits se hace laselección de la frecuencia de reloj para elConvertidor A/D.

00 = Fosc/201 = Fosc /810 = Fosc/3211 = FRC (Procede del oscilador RC interno)

REGISTRO ADCON0Controla la operación del CA/D

• CH2:CH0: Aquí se selecciona el canal analógico por dondeentrará la señal a digitalizar.

000 = Canal 0, (RA0/AN0)001 = Canal 1, (RA1/AN1)010 = Canal 2, (RA2/AN2)011 = Canal 3, (RA3/AN3)100 = Canal 4, (RA4/AN4)101 = Canal 5, (RA5/AN5)110 = Canal 6, (RA6/AN6)111 = Canal 7, (RA7/AN7)

REGISTRO ADCON0Controla la operación del CA/D

• GO/#DONE: bit de estado de la conversión A/D.1 = La conversión A/D está en marcha (mientras está a 1 se está

realizando la conversión).0 = La conversión ha finalizado. (el bit se pone a cero

automáticamente por hardware cuando la conversión A/D finaliza)el resultado de la conversión aparece en ADRESH:ADRESL.

• ADON: bit de puesta en marcha1 = El convertidor A/D está operativo.0 = El convertidor A/D está apagado y no consume corriente.

REGISTRO ADECON1Se trata de un registro de configuración de los pinesdel puerto, este registro se compone de 8 bits:

• ADFM: Selecciona el formato del resultado de laconversión A/D.1 = Pone en el registro ARDESH los seis bits de mayor peso a “0”.0 = Pone los 6 bits de menor peso del registro ADRESL a “0”.

REGISTRO ADECON1

• PCFG3:PCFG0: bits de configuración de los canalesde entrada del convertidor A/D. Se utilizan paraconfigurar las patillas como E/S digital o comoentrada analógica: A= Entrada Analógica; D = E/S Digital

REGISTROS ADRESH - ADRESL

El par de registros ADRESH:ADRESL se carga con elresultado de 10 bits de la conversión A/D. Este par deregistros se extienden hasta 16 bits. El módulo A/Dtiene la posibilidad de justificar el resultado de 10 bitsdentro de los 16 bits de la pareja de registros. Laselección del formato de justificación a la izquierda oderecha se realiza con el bit ADFM (ADCON1). Los bitsrestantes (a los 10 de la conversión) se llenan conceros.

NOTA:Estos dos registros cuando el convertidor A/D está enOFF y no se utiliza, pueden utilizarse como dosregistros de 8 bits de propósito general.

COMO TRABAJO CON EL CONVERSOR ANALOGO DIGITAL?

En el compilador C las funciones para manejarel conversor A/D son las siguientes:setup_adc(modo);modo: para la configuración del módulo conversor A/Dcorrespondientes a los bits 7:6 del registro ADCON0.

setup_adc(modo); 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

COMO TRABAJO CON EL CONVERSOR ANALOGO DIGITAL?

setup_adc_ports(valor);Valor: definición de las entradas analógicas correspondientes alos bits 3 – 0 del ADCON1.

setup_adc_channel(canal);Canal: selección del canal analógico correspondiente a los bits5:3 del registro ADCON0.

Posibles valores para SETUP_ADC_PORTS(VALOR);

ADEMAS…Valor = read_adc(); //Lectura del ADC.Lectura del resultado donde valor es un número enterode 16 bits según la directiva #DEVICE ADC =empleada. Dicha directiva trabaja según la tabla:

APLICACION 7

Desarrollar un sistema que permita leer unatensión analógica por el canal 0 (AN0),proveniente de una fuente, realizando lavariación por medio de un potenciómetro.

#include <16F876.h>#device adc=10 //directiva para manejo ADC 10 bits

#FUSES XT, NOWDT#use delay(clock=4000000) //reloj

#include <LCD.C> //librería LCD

void main() { //inicio de programaint16 q; //declaracion de variables.float p;

setup_adc_ports(AN0); //Canal 0 analógicosetup_adc(ADC_CLOCK_INTERNAL); //Fuente de reloj RC

lcd_init();

for (;;) { //ciclo infinito de ejecuciónset_adc_channel(0); //Habilitación canal 0delay_us(20); //tiempo de estabilizaciónq = read_adc(); //Lectura canal 0p = 5.0 * q / 1024.0; //Conversión a tensión

printf(lcd_putc, "\fADC = %4ld", q);printf(lcd_putc, "\nVoltage = %01.2fV", p);

delay_ms(100);}

SIMULACION

SIGAMOS CON…

COMUNICACION SERIAL USANDO EL MODULO

USART

COMUNICACION SERIALCARACTERISTICAS:

• Transmisión de un bit a la vez.• Comunicación mucho más lenta.• Requiere de un número menor de líneas para

la transmisión.• Distancia de transferencia mayor.

COMUNICACION SERIALEs una interfaz que designa una norma para elintercambio serie de datos binarios entre un equipoterminal de datos (DTE) y un equipo de terminación delcircuito de datos (DCE). Permite comunicación conotras computadoras y otros dispositivos como: mouse,impresoras, microcontroladores.

COMUNICACION SERIALEl RS-232 C es una norma para la conexión entre un DTE y unDCE que define:

• Las características eléctricas.• Los niveles de tensión.• Las longitudes máximas a distintas velocidades.• Los nombres de las señales que intervienen en el

funcionamiento y la estructura del protocolo de comunicación.• El tipo de conector a emplear.

Esta norma establece una señalización eléctrica bipolar:

Recepción:• Nivel lógico 0 : +15...+3Voltios.• Nivel lógico 1 : -15...-3Voltios.Transmisión:• Nivel lógico 0 : +15…+5 Voltios.• Nivel lógico 1 : -15…-5 Voltios.

COMUNICACION SERIALExisten dos formas de comunicación serial:

Sincrónica: además de una línea sobre la quetransfieren los datos, se necesita otra que contengalos pulsos de reloj.La duración del bit está determinada por la duracióndel pulso de sincronismo.

COMUNICACION SERIALExisten dos formas de comunicación serial:

Asincrónica: los pulsos de reloj no son necesarios yse acude a otros mecanismos para realizar lalectura/escritura de los datos.la duración de cada bit está determinada por lavelocidad con la cual se realiza la transferencia dedatos.

COMUNICACION SERIE SINCRONA: USART

Los microcontroladores PIC16f8xx dispone de unmódulo USART capaz de soportar la comunicaciónsíncrona y asíncrona.En el modo asíncrono, la transferencia de informaciónse realiza sobre dos líneas TX (transmisión) y RX(recepción), a ritmo de una frecuencia controladainternamente por el USART.

COMUNICACION SERIE SINCRONA: USART

Los bloques que configuran la arquitectura USART:

• Circuito de muestreo: identifica el bit de informaciónrecibido por medio de muestreo.

• Generador de Baudios: frecuencia en Baudios (bitspor segundo) a la que se realiza la transferencia:

330, 600, 1200,2400,4800,9600,19200,38400,….

Registro SPBRG, TXSTA.

COMUNICACION SERIE SINCRONA: USART

Ecuación para el cálculo del valor conque se carga el registro generador defrecuencia SPBRG:

X=(Fosc/(FrecBaudios*K))-1

K = 64, BRGH = 0, baja velocidad.K = 16, BRGH = 1, alta velocidad.

REGISTROS QUE INTERVIENEN EN UNA COMUNICACION ASINCRONA

TXSTA: transmisor asíncrono. Registro queinterviene en la transferencia de información:

Bit [0] TX9D.- Este es el noveno bit de datos en el caso de una transmisión de 9 bits. Bit [1] TRMT.-Cuando está en 1 indica que el registro de transmisión TXREG está vacío, esto

implica que puede escribirse un nuevo dato. Bit [2] BRGH.- Este bit sólo se utiliza en modo asíncrono, 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 síncrono o a 0 para el modo asíncrono. Bit [5] TXEN.- En modo asíncrono este bit se pone a 1 para activar las transmisiones de datos. Bit [6] TX8/9.- Este bit selecciona una transmisión de 8 bits si está a 1 o de 9 bits si está a 1. Bit [7] CSRC.- En modo asíncrono, este bit no se utiliza.

REGISTROS QUE INTERVIENEN EN UNA COMUNICACION ASINCRONA

BRG: depende del valor X cargado en el registro degeneración de la relación de baudios SPBRG y delestado del bit BRGH del registro TXSTA

REGISTROS QUE INTERVIENEN EN UNA COMUNICACION ASINCRONA

RCSTA: receptor asíncrono. Los datos se reciben enserie bit a bit por la patita RC7 y se va introduciendosecuencialmente en el registro de desplazamiento.

• Bit [0] RX9D.- Este es el noveno bit de datos en el caso de una transmisión 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]. – Detección de dirección. Maestro y esclavos.• Bit [4] CREN.- En modo asíncrono debe estar a 1 para autorizar la recepción. En modo

asíncrono autoriza que se continúe la recepción.• Bit [5] SREN.- En modo asíncrono no se utiliza, en modo asíncrono este bit debe estar a 1 para

activar la recepción.• Bit [6] RX8/9.- Este bit debe estar a 1 para activar la transmisión de 9 bits.• Bit [7] SPEN.- Este bit debe estar a 1 para activar la USART.

COMO MANEJO EL MODULO USART EN MODO ASINCRONO?

Configuración genérica de la USART:

# USE rs232 (opciones) //Directiva para rs232

Se configuran varios parámetros de la USART:

• velocidad de transmisión (EN BAUDIOS).– BAUD = X

• bits de transmisión (8 o 9 bits).– BITS = X

• pines utilizados (transmisión / recepción).– XMIT = pin

COMO MANEJO EL MODULO USART EN MODO ASINCRONO?

Una anotación importante para el uso de la directiva esque se debe definir primero la directiva: # use delay()

Ejemplo:

#use delay (clock = 4000000)#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7, bits=8)

FUNCIONES DEFINIDASAlgunas 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 DEFINIDASPara transmisión de datos:

putc(cdata);putchar(cdata);

cdata es un carácter de 8 bits.

puts(string);string es una cadena de caracteres constante o matrizde caracteres terminada con un 0. (puts () manda loscaracteres de la cadena uno a uno por medio de lafunción putc ()…).

OTRAS FUNCIONESprintf (fname, cstring, values…);

cstring: es una cadena de caracteres o matriz decaracteres terminados con un 0.

fname: las funciones utilizadas para escribir la cadenaindicada (por defecto se utiliza la función putc).

values: valores a incluir en la cadena separados porcomas. %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.

c carácters Cadena o carácteru Entero sin signod Entero con signo

Lu Entero largo sin signoLd Entero largo con signox Entero hexadecimal (minúsculas)X Entero hexadecimal (mayúsculas)Lx Entero largo hexadecimal (minúsculas)LX Entero largo hexadecimal (mayúsculas)

f Flotante con truncadog Flotante con redondeoe Flotante en formato exponencialw Entero sin signo con decimales insertados

FUNCIONES DEFINIDASFunciones para recepción de datos:

value = getc ();value = getch ();value = getchar ();

value es un carácter de 8 bits.

valor = kbhit ();valor es 0 (FALSE) getc() debe esperar a que llegueun carácter.valor es 1 (TRUE) ya hay un carácter que puede serleído por la función getc().

APLICACION 8

Desarrollar un sistema que permita enviar los datos del0 al 10, en modo asíncrono, entre dos PIC, visualizarcon LCD los datos enviados y los recibidos. Larecepción de datos se realizara por interrupción deUSART.

DESARROLLO DEL SISTEMA DE

TRANSMISION PARA EL MICROCONTROLADOR A

#include <16F877.h>#FUSES XT,NOWDT

#use delay(clock=4000000) //reloj

#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7)//Configura velocidad en baudios 9600, pin C6 para TX,//pin C7 para RX

#include <LCD.C> //directiva LCD

void main() { //función principalint valor; //declaración de variable.

lcd_init(); //inicializa LCD

while(1){ //ciclo de ejecución infinitofor (valor=0;valor<=10;valor++) { //envío de datosPUTC(valor); //envía datos al hiper terminalprintf(lcd_putc,"\fenviando=%1D",valor); //envía dato a LCDdelay_ms(500);

}}

}

DESARROLLO DEL SISTEMA DE RECEPCION

PARA EL MICROCONTROLADOR B

#include <16F876.h>#FUSES XT,NOWDT

#use delay(clock=4000000) //reloj

#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8)//Configura velocidad en baudios 9600, pin C6 para TX,//pin C7 para RX, 8 bits de datos.

#include <LCD.C> //directiva para manejo de LCD

//para el manejo de interrupción cuando se recibe un datose usa la //directiva #INT_RDA

#INT_RDA //Directiva de interrupción por//recepción de datos

RDA_isr(){

valor=GETC(); //lee el dato recibido y guarda en valor

}

void main() { //función principallcd_init(); //inicializa LCDenable_interrupts(INT_RDA); //int. Por recepción activa

enable_interrupts(GLOBAL); //permiso global de int.

for (;;) { //ciclo infinito de ejecución

lcd_gotoxy(1,1);printf(lcd_putc,"recibiendo=%1D",valor);//escribe en LCD en la posición 1,1.

}}

SIMULACION

PARA FINALIZAR…

EL MODULO I2C (InterfazInter – Circuitos) Y LAS MEMORIAS EEPROM

EL BUS I2C…

CARACTERISTICAS:

• Se basa en la comunicación a través de dos hilos.• Dos líneas de colector abierto reloj (SCL) y datos (SDA).• Se debe usar resistencias de pullups.• Cada dispositivo conectado al bus tiene una dirección.• Se configura como mono maestro o multi maestro.• El maestro se encarga de: inicio y finalización de transferencia,

con quien y el sentido de la misma.• El maestro inicia transferencia enviando la dirección del

dispositivo con que se quiere conectar, ya sea para lectura oescritura.

• El numero de dispositivos conectados y la longitud de conexiónse limitan por la capacidad de direccionamiento (de 7 a 10 bits) ypor la máxima carga del bus (400pF).

• La velocidad máxima estándar es 100 Kbps y en adelante paraversiones mejoradas.

CONDICIONES DELBUS

FORMATOS DE TRANSFERENCIA DE INFORMACION

• ESCRITURA EN EL ESCLAVO: Maestro como transmisor y esclavocomo receptor.

• LECTURA DEL ESCLAVO: El maestro lee informacion proveniente delesclavo inmediatamente después de transmitir el byte de control y seconfigura como receptor.

FORMATOS DE TRANSFERENCIA DE INFORMACION

• FORMATO COMBINADO: este formato implica elcambio de sentido de la informacion, así que eldispositivo que en principio se comporta comoreceptor, luego lo hará como transmisor.

CARACTERISTICAS ELECTRICAS• Permite la interconexión de diversas tecnologías (CMOS,

NMOS, TTL,…).• Dispositivos con niveles de entrada fijos (5 V):

– VIL = 1.5 v (estado bajo “0”).– VIL = 3 v (estado alto “1”).

• Terminales conectados al bus I2C, no deberán sumir ni drenarcorrientes superiores a 10 uA, ni capacidad mayor a 10 pF.

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 1’000.000.• Velocidad máxima de operación 400 KHz.• Consumo durante la escritura 3 mA a 5.5 V.• Consumo durante la lectura 400 uA a 5.5 V.• Capacidad de retención mayor a 200 años.

COMO MANEJO EL BUS I2C?Configuración genérica:

#USE I2C(opciones)MULTI_MASTER Establece modo multi maestro

MASTER Establece modo maestro.SLAVE Establece modo esclavo.

SCL = pin Especifica el pin SCL.SDA = pin Especifica el pin SDA.

ADDRESS = pin Especifica la dirección en modo esclavo.FAST Utiliza velocidad alta.SLOW Utiliza velocidad baja.

RESTART_WDT Borra el WDT mientras espera una lectura.FORCE_HW Utiliza las funciones I2C hardware.

NOFLOAT_HIGH No permite señales flotantes.SMBUS Utiliza el bus en formato SMBUS.

STREAM = id Asocia un identificador stream.

FUNCIONES DEFINIDAS PARA EL MANEJO DE LA MEMORIA EEPROM

Función de escritura:

write_ext_eeprom(direccion, valor);

Función de lectura:

valor = read_ext_eeprom(direccion);

APLICACION 9

Desarrollar un sistema que permita guardar yleer 50 datos en una memoria EEPROM I2C.Mostrar los valores escritos y leídos en undisplay LCD.

#include <16f877.h> //usamos el pic 16f877#fuses xt, nowdt, nolvp, noprotect#use delay(clock=4000000) //reloj

#include <LCD.C> //Librería LCD#include <J24lc256.H> //librería 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() //función principal{lcd_init(); //Inicia LCDinit_ext_eeprom(); //Inicia memoria

while(true) // bucle infinito{

// escritura de la memoria con el valor de la posi +2for(cnt=0;cnt<=50;cnt++){

write_ext_eeprom(cnt,(cnt+2)); // función de escrituraprintf(lcd_putc,"\fESCRI.. POSI %u",cnt);delay_ms(500);

}

//lectura de las 50 posi de la memoriafor(cnt=0;cnt<=50;cnt++){

jaso=read_ext_eeprom(cnt); // función de lecturaprintf(lcd_putc,"\fLEER.. POSI %u",jaso);delay_ms(500);}

}}

SIMULACION

El mini curso que acabamos depresenciar permite explorar un poco masacerca de cómo podemos programar losmicrocontroladores PIC usandoherramientas de alto nivel como lo es elcompilador C CCS y el simuladorproteus, que permiten obtener el máximorendimiento en nuestras habilidadescomo programador y la optimización yfuncionalidad del microcontrolador ensus diferentes aplicaciones.

Recordemos que este mini curso e unapequeña introducción a lo que USTEDcomo programador se puede enfrentarde ahora en adelante…

ANIMO!!!A PROGRAMARSE DIJO!!!...

top related