Anda di halaman 1dari 102

MICROPROCESADORES

MICROCONTROLADORES PIC Introduccin


Leandro Flrez Aristizbal

Orden del da
Frase del da Presentacin Expectativas Plan de curso Acuerdo pedaggico Diagnstico Acadmico Diagramas de flujo

DIAGRAMAS DE FLUJO
START
PROCESO

DECISIN

PANTALLA

END

DIAGRAMAS DE FLUJO
Realizar un programa en diagrama de flujo que describa el proceso para realizar una llamada. Realizar un programa en diagrama de flujo que describa el proceso para ir a estudiar. Realizar un programa en diagrama de flujo que describa el proceso de una lavadora que: tiene dos ciclos de lavado (fuerte y suave), si se escoge fuerte, se llena el tanque de agua, el lavado durar 3 minutos, se detiene por 30 segundos y expulsa el agua. Si el ciclo es suave, se llena el tanque a la mitad, el lavado durar 1 minuto, se detiene por 10 segundos y expulsa el agua. En ambos ciclos, cuando termine de expulsar el agua, volver al estado inicial.

MICROPROCESADOR (SISTEMA ABIERTO)


BUS DATOS ALU UC REGS BUS DIRECCIONES

SISTEMA MICROPROCESADO

MEMORIES UNIT

ALU
UC

REGS

I/O UNIT

BUS DEL SISTEMA

MICROCONTROLADOR
MEMORY

ALU UC REGS

I/O

ARQUITECTURAS
VON NEUMANN

HARVARD

PIC 16F877A

CARACTERSTICAS
CPU RISC de alto desempeo 35 instrucciones Velocidad de operacin de 20 MHz Memoria de programa FLASH de 8K Memoria de datos de 368 bytes Memoria de datos EEPROM de 256 bytes 14 fuentes de interrupcin Pila de 8 niveles 3 temporizadores PWM ADC de 10 bits Mdulo serial USART

MEMORIAS
D0 A0 A1 A2 000 001 010 011 100 101 110 111 1 1 0 1 1 0 1 1 0 1 0 0 1 0 1 0 0 1 1 0 1 1 1 0 0 0 0 0 0 0 1 0 1 1 0 1 1 0 1 1 1 0 1 0 1 0 1 1 0 0 0 0 1 1 1 0 0 0 1 1 0 0 1 1 D1 D2 D3 D4

D5
D6 D7

REQUERIMIENTOS MNIMOS PARA FUNCIONAMIENTO


Alimentacin (+5V)
Resistencia de 10K a Vcc en pin MCLR Oscilador(2 condensadores de 15 a 33pf y 1 cristal de 4MHz 20MHz)

COMPILADOR CCS C

Estructura de un programa
Directivas de preprocesador: Determinan el funcionamiento del microcontrolador. Programas o funciones: Son un conjunto de instrucciones que cumplen una tarea especfica. Siempre deber haber un programa o funcin principal llamado Main(). Instrucciones: Determinan paso a paso cada una de las tareas que debe ejecutar el microcontrolador.

Comentarios: Ayudan a comprender mejor el programa indicando el significado de algunas instrucciones o conjunto de estas.

Directivas de preprocesador

Especificacin de dispositivo - #include <chip> - #fuses options - #use delay (clock=freq)

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

Funciones
void } void resta(){ //Cdigo que se realizar en la funcin suma(tipo param1, tipo param2){ //Cdigo que se realizar en la funcin

}
void } main(){ //Cdigo del programa principal

Comentarios
Los comentarios son tiles para describir lneas de cdigo o porciones de estas. Ayudan al desarrollador a identificar el propsito y funcionamiento de variables, funciones, ciclos, etc. Para comentar una sola lnea se usa: //Comentario Para comentar una porcin de cdigo se usa: /* Cdigo */

Tipos de datos
TIPO Int1 Short Int Int8 Int16 Long Int32 Float Char Void Signed Int8 Signed Int16 Signed Int32 TAMAO 1 bit 8 bits 16 bits 32 bits 32 bits 8 bits 8 bits 16 bits 32 bits RANGO 0a1 0 a 255 0 a 65535 0 a 4.294.967.295 1175x10E-38 a 3402x10E38 0 a 255 -128 a +127 -32768a +32767 -2E31 a + (2E31)-1 DESCRIPCIN Entero de 1 bit Entero de 8 bits Entero de 16 bits Entero de 32 bits Coma flotante Caracter Sin valor Entero con signo Entero largo con signo Entero de 32 bits con signo

Variables
Separan un espacio en memoria RAM para almacenar datos temporalmente.

Declaracin e inicializacin: Para declararlas deberemos especificar el tipo de variable, su nombre e inicializarla haciendo uso del operador de asignacin =
Tipo Nombre_variable = valor_inicial Int resultado = 0;

Variables
Las variables pueden ser locales o globales.
Variables locales: Se pueden usar solo en la funcin donde hayan sido declaradas. Variables globales: Se pueden usar en cualquier funcin del programa. #include <16f877a> #use delay (clock=4000000) Int contador; //variable global Void funcion(void){ float numero1; //variable local } Void main(){ char letra; //variable local }

Operadores
Asignacin

Op += -= *= /= %=

Descripcin Asignacin de suma (x+=y es lo mismo que x=x+y) Asignacin de resta (x-=y es lo mismo que x=x-y) Asignacin de multiplicacin (x*=y es lo mismo que x=x*y) Asignacin de divisin (x/=y es lo mismo que x=x/y) Asignacin de residuo (x%=y es lo mismo que x=x%y)

Operadores
Aritmticos
Op + * Descripcin Suma Resta Multiplicacin

/ %
++ --

Divisin Mdulo Residuo


Incremento Decremento

Operadores
Relacionales
Op
< > >= <= == !=

Descripcin
Menor que Mayor que Mayor o igual que Menor o igual que Igual Distinto de

Operadores
Lgicos
Op ! Descripcin Not

&&
||

AND
OR

Bits
Op ~ & | ^ >> << Descripcin Complemento a 1 AND OR XOR Desplazamiento a la derecha Desplazamiento a la izquierda

Declaraciones de control
IF ELSE WHILE DO-WHILE FOR SWITCH CASE RETURN BREAK CONTINUE GOTO

Directivas de control de memoria


# byte ID = x : Asigna el nombre ID a la posicin de memoria x.
#byte PORTA=5 #byte PORTB=6 #byte PORTC=7 #byte PORTD=8 #byte PORTE=9

PORTB=5; //si PORTB es de salida, saldr el dato 00000101

Directivas de control de memoria


# bit ID = x.y : Asigna el nombre ID al bit y de la posicin de memoria x
#bit RB0 = 06.0 #bit RB0 = PORTB.0

RB0=1; //Si el bit 0 de PORTB es de salida, saldr un 1 por este PIN.

Instrucciones
Set_tris_x(value) : Configura pines de cada puerto como entrada/salida. Value representa el valor a asignar al registro de configuracin donde un 1 significa entrada y un 0 salida.
Set_tris_a( value ) Set_tris_b( value ) Set_tris_c( value ) Set_tris_d( value ) Set_tris_e( value )

Set_tris_b(0x0F) //0000 1111 Los pines B0 B3 son entradas y B4 B7 son salidas

Instrucciones
input_x( ) : Lee un dato por un puerto.
Dato=input_a( ) Dato=input_b( ) Dato=input_c( ) Dato=input_d( ) Dato=input_e( )

Dato=input_d( ) //Guarda en Dato el valor de portd

Instrucciones
input(pin ) : Entra un dato por un puerto.
Los pines estn definidos en el archivo .h (PIN_A0, PIN_A1, PIN_B2, PIN_C3, PIN_D4)

Dato=input (PIN_B0 ) //Guarda en Dato el valor del PIN 0 de PORTB (1 0)

Instrucciones
bit_test(variable,bit): Evala el estado de un bit de una variable que no necesariamente debe ser un puerto.
Para usarlo con los puertos, estos deben ser declarados como variables por medio de #byte

bit_test(PORTB,7) //Evala el estado del bit 7 de PORTB

Instrucciones
output_x(value) : Saca un dato por un puerto.
output_a( value ) output_b( value ) output_c( value ) output_d( value ) output_e( value )

Output_d(5) //00000101 por portd

Instrucciones
output_bit(pin, value): Saca por el pin especificado un 01.
Los pines estn definidos en el archivo .h (PIN_A0, PIN_A1, PIN_B2, PIN_C3, PIN_D4)

output_bit( PIN_C0, 1) //Saca un 1 por el bit 0 de PORTC

Output_bit(PIN_A0, input(PIN_B7)) //Saca por el bit 0 de PORTA lo mismo que entra por el bit 7 de PORTB

Instrucciones
output_high(pin): Saca por el pin especificado un 1.
Los pines estn definidos en el archivo .h (PIN_A0, PIN_A1, PIN_B2, PIN_C3, PIN_D4)

output_high(PIN_D0) //Saca un 1 por el bit 0 de PORTD

Instrucciones
output_low(pin): Saca por el pin especificado un 0.
Los pines estn definidos en el archivo .h (PIN_A0, PIN_A1, PIN_B2, PIN_C3, PIN_D4)

output_low(PIN_A2) //Saca un 0 por el bit 2 de PORTA

Instrucciones
bit_set(variable,bit): Pone un 1 en un bit especificado de una variable que no necesariamente debe ser un puerto.
Para usarlo con los puertos, estos deben ser declarados como variables por medio de #byte

bit_set(PORTA,2) //Saca un 1 por el bit 2 de PORTA.

Instrucciones
bit_clear(variable,bit): Pone un 0 en un bit especificado de una variable que no necesariamente debe ser un puerto.
Para usarlo con los puertos, estos deben ser declarados como variables por medio de #byte

bit_clear(PORTD,3) //Saca un 1 por el bit 3 de PORTD.

Instrucciones
output_toggle(pin): Cambia el estado del pin especificado.
Los pines estn definidos en el archivo .h (PIN_A0, PIN_A1, PIN_B2, PIN_C3, PIN_D4)

output_toggle(PIN_D2) //Si el bit 2 de PORTD es 0 lo cambia a 1 y viceversa

Instrucciones
delay_ms(milisec): Permite establecer un retardo en milisegundos (milisec). delay_us(microsec): Permite establecer un retardo en microsegundos (microsec)

ENTORNO DE DESARROLLO

ENTORNO DE DESARROLLO
Para iniciar un nuevo programa, haremos click en el comando de manejo de ficheros que se encuentra en la esquina superior izquierda y seleccionaremos crear un nuevo fichero fuente (New -> Source File)

ENTORNO DE DESARROLLO
Click

ENTORNO DE DESARROLLO
Daremos un nombre a nuestro archivo y lo guardaremos en la ubicacin que deseemos. Hecho esto, nos aparecer un editor en blanco con una pestaa en la que aparece el nombre de nuestro archivo. En este editor escribiremos nuestro cdigo fuente.

ENTORNO DE DESARROLLO

Aqu escribiremos el cdigo de nuestro programa

Mi primer programa
Para variar , haremos el programa bsico de encender y apagar un LED. Lo primero que haremos ser escribir la directivas de preprocesador.
#include <16f877A.h>//microcontrolador que deseamos usar #fuses XT//Tipo de cristal XT #use delay(clock=4000000)//Frecuencia del oscilador (4MHz)

Mi primer programa
Seguidamente, crearemos la funcin principal MAIN y un ciclo for(;;) infinito donde escribiremos el cuerpo del programa. El ciclo debe ser infinito para que el programa nunca termine. void main(){ //Programa principal (Inicio) set_tris_b(0x00); //Configuro PORTB como salida (8 pines) for(;;){ //Ciclo infinito output_bit(PIN_B0,1); //Saca un 1 por RB0 (bit 0 de PORTB) delay_ms(1000); //Espera 1000 mS 1 segundo output_bit(PIN_B0,0); //Saca un 0 por RB0 delay_ms(1000); //Espera otro segundo } //Como el ciclo es infinito, retornar al inicio del for(;;) para repetir //este proceso indefinidamente } //Fin de programa

Mi primer programa
Una vez creamos que nuestro programa est libre de errores, procederemos a compilarlo con el botn Build All de la pestaa Compile.

En este proceso, el compilador convierte nuestro cdigo fuente a lenguaje de mquina y crea unos archivos adicionales de los cuales usaremos dos (.hex & .cof) para la simulacin y uno de ellos para programar el microcontrolador (.hex).
En la pestaa Output aparecern los posibles errores de sintaxis o advertencias que gener el cdigo.

Mi primer programa
Click

Click

Aqu aparecern los errores de sintaxis o advertencias

SIMULACIN EN PROTEUS
El software que usaremos para simular nuestros programas es la herramienta ISIS de PROTEUS.

Zona de componentes

SIMULACIN EN PROTEUS
Cuando abrimos el ISIS, nos aparece un espacio en el cual deberemos ubicar nuestros componentes. Para buscarlos, presionamos sobre el botn Component Mode y luego sobre Pick de Devices
Click

Click

SIMULACIN EN PROTEUS
En la ventana Pick Devices, sobre el campo de texto Keywords escribiremos todo o parte del nombre del componente que deseamos. A medida que se escribe, el software ir filtrando la bsqueda; si en esta aparecen ms elementos que cumplen con los criterios, filtraremos an ms seleccionando una categora de la lista Category. El primer elemento ser el PIC16F877A.

SIMULACIN EN PROTEUS
Elemento a buscar

Resultado de la bsqueda

Categoras

SIMULACIN EN PROTEUS
Una vez encontrado el componente daremos doble click sobre l para ubicarlo en la ventana Devices. Ahora buscaremos una resistencia y un diodo LED. Para una resistencia de 220 ohms escribiremos MINRES y entre todos los resultados, buscaremos una de 220R y daremos doble click para seleccionarla. Para el diodo, escribimos LED y filtramos seleccionando la categora Optoelectronics de donde seleccionaremos uno cuya descripcin diga Animated LED model.

SIMULACIN EN PROTEUS
Cuando se haya terminado de escoger los componentes, se cierra la ventana Pick Devices y de la ventana Devices iremos seleccionando uno a uno los elementos y los iremos ubicando en la zona de componentes. Luego los uniremos haciendo click sobre los pines de cada uno y arrastrando la conexin hasta el otro componente.

SIMULACIN EN PROTEUS

Devices

SIMULACIN EN PROTEUS
Para ubicar la tierra, haremos click sobre el botn Terminals Mode y de laventana Terminals seleccionaremos GROUND

Click Click

SIMULACIN EN PROTEUS
El ltimo paso antes de simular es cargarle el programa al microcontrolador. Para esto, damos doble click sobre el PIC o click derecho y seleccionamos Edit Properties para ingresar a las propiedades del dispositivo. En esta nueva ventana buscaremos en Program File el archivo .hex .cof de nuestro programa. La diferencia entre uno y otro es que el .cof nos ayudar a depurar el cdigo al permitir ejecutarlo paso a paso, pausarlo en tiempo de ejecucin, revisar el estado de los registros, etc. Por ltimo, en Processor Clock Frequency escribiremos la frecuencia del oscilador a usar. Finalizamos presionando OK.

SIMULACIN EN PROTEUS
Click Click

Programa Frecuencia

SIMULACIN EN PROTEUS
Por ltimo, para iniciar la simulacin presionaremos el botn Play de la barra de simulacin para correr la simulacin. En esta misma barra encontramos botones para pausar la ejecucin o detenerla.

SIMULACIN EN PROTEUS

Click

SIMULACIN EN PROTEUS

SIMULACIN EN PROTEUS
Como se dijo anteriormente, el archivo .cof permite depurar el cdigo mientras se simula. Para esto, una vez cargado en el PIC el .cof se ejecutar pero con el botn Step de la barra de simulacin. En caso de que no aparezca una ventana con el cdigo, presionaremos Debug en la barra de Men y seleccionaremos PIC CPU Source Code

SIMULACIN EN PROTEUS
Click

Click
Cdigo

INTERRUPCIONES
Las interrupciones son estmulos internos o externos que le indican al microcontrolador sobre una peticin o accin que deba ser ejecutada inmediatamente dejando en espera lo que se encuentre haciendo en ese momento. En el instante que ocurre una interrupcin, no importa que parte de programa se encuentre ejecutando, el contador de programa se dirigir al vector de interrupciones, este es un espacio de memoria reservado para la atencin de todas las interrupciones. El PIC16F877A posee 14 fuentes de interrupcin.

INTERRUPCIONES

INTERRUPCIONES
La ventaja de las interrupciones es que el microcontrolador no necesita estar pendiente de un evento sino que una vez habilitada la interrupcin este podr ejecutar otras tareas hasta que se genere el estmulo. En C la atencin de interrupciones se hace por medio de funciones (una para cada interrupcin que est habilitada). Cuando ocurra la interrupcin, se har un llamado a la funcin correspondiente y una vez finalice sus tareas dentro de esta, retornar a seguir realizando la ejecucin del programa donde fue interrumpido.

INTERRUPCIONES
Para poder usar una interrupcin, se deber habilitar un bit GLOBAL el cual se encarga de gobernar a todas las interrupciones. Si este bit se encuentra deshabilitado, ninguna interrupcin podr ocurrir. Adems del bit GLOBAL, se debern habilitar cada una de las interrupciones que se deseen implementar. Cuando se genera el evento que produce la interrupcin, el bit GLOBAL se deshabilitar para evitar interrupciones sucesivas indeseadas y una bandera(bit) que identifica a la interrupcin generada se activar. Esta bandera deber ser limpiada antes de habilitar de nuevo el bit GLOBAL, de lo contrario, el microcontrolador asumir que se ha producido una nueva interrupcin.

INTERRUPCIONES Registro INTCON


Se encuentra en la direccin 0Bh de la memoria de datos. Es un registro de funcin especial con el cual por medio de algunos bits se habilitan deshabilitan cada una de las interrupciones que posee el microcontrolador y se consultan las banderas asociadas a cada una de las interrupciones.

INTERRUPCIONES Registro INTCON

Los bits 7:3 permiten habilitar o deshabilitar cada una de las interrupciones. Un 1 las habilita y un 0 las deshabilita. Bit 7 (GIE): Bit GLOBAL de interrupciones Bit 6 (PEIE): Bit de interrupciones perifricas Bit 5 (T0IE): Bit de interrupcin por desbordamiento del Timer 0 Bit 4 (INTE): Bit de Interrupcin Externa Bit 3 (RBIE): Bit de interrupcin por cambio de estado en un pin del nibble alto de PORTB

INTERRUPCIONES Registro INTCON

Los bits 2:0 son banderas asociadas a algunas interrupciones. Estas se pondrn en 1 automticamente indicando la interrupcin que se gener. Se deben poner en 0 por software. Bit 2 (T0IF): Bandera de interrupcin por desbordamiento del Timer 0 Bit 1 (INTF): Bandera de Interrupcin Externa Bit 0 (RBIF): Bandera de interrupcin por cambio de estado en un pin del nibble alto de PORTB.

INTERRUPCIN EXTERNA
La interrupcin externa, ocurre por medio del pin RB0 y es un evento externo el que debe generarla, como por ejemplo un pulsador. Esta interrupcin debe ser configurada para ocurrir en un flanco de bajada o de subida. Los bits del registro INTCON que deben ser tenidos en cuenta para esta interrupcin son: El bit GLOBAL de interrupciones (bit 7), el bit de habilitacin de interrupcin externa INTE (bit 4) y la bandera INTF (bit 1). Hay que tener en cuenta que este pin deber ser configurado de entrada. La funcin que ser llamada cuando ocurra una interrupcin deber ser precedida por la directiva:

#INT_EXT

INTERRUPCIN EXTERNA
Seguidamente se implementa la funcin con el cdigo a ejecutar cuando ocurra la interrupcin externa. #INT_EXT //Funcin para interrupcin externa, el nombre //de la funcin no necesariamente tiene que ser //interrupt_ext void interrupt_ext() {
//Cdigo a ejecutar

INTERRUPCIN EXTERNA
Para poder hacer uso de esta interrupcin, como se mencion anteriormente, deber ser configurada para ocurrir en un flanco de bajada o de subida, esto se hace por medio de la funcin:

//Flanco de subida (Low To High) ext_int_edge(L_TO_H); //Flanco de bajada (High To Low) ext_int_edge(H_TO_L);

INTERRUPCIN EXTERNA
Por ltimo, la interrupcin debe ser habilitada. Existe un bit GLOBAL que habilita a todas las interrupciones, y un bit especfico para cada una de ellas, para poder usar cualquier interrupcin no solo esta deber ser habilitada sino tambin el bit GLOBAL. Para esto se usar la funcin enable_interrupts() //Habilita interrupcin externa enable_interrupts(INT_EXT); //Habilita interrupcin Global enable_interrupts(GLOBAL);

INTERRUPCIN POR RB
La interrupcin por RB, ocurre cuando hay un cambio de estado en cualquiera de los pines RB7, RB6, RB5, RB4 y es un evento externo el que debe generarla, como por ejemplo un pulsador. Esta interrupcin ocurrir en cualquier flanco ya sea de subida o de bajada y cualquiera de los pines podr generarla. Los bits del registro INTCON que deben ser tenidos en cuenta para esta interrupcin son: El bit GLOBAL de interrupciones (bit 7), el bit de habilitacin de interrupcin por RB RBIE (bit 3) y la bandera RBIF (bit 0). Para poder habilitar de nuevo el bit GLOBAL, antes se deber leer el puerto B con una instruccin como x=PORTB para verificar el estado de los pines y seguidamente limpiar la bandera RBIF. Hay que tener en cuenta que estos pines debern ser configurados de entrada. La funcin que ser llamada cuando ocurra una interrupcin deber ser precedida por la directiva:

#INT_RB

INTERRUPCIN POR RB
Seguidamente se implementa la funcin con el cdigo a ejecutar cuando ocurra la interrupcin por RB. #INT_RB //Funcin para interrupcin por RB, el nombre de //la funcin no necesariamente tiene que ser //interrupt_RB void interrupt_RB() {
//Cdigo a ejecutar

INTERRUPCIN POR RB
Al Igual que con la interrupcin externa, esta debe ser habilitada. Como se mencion anteriormente, existe un bit GLOBAL que habilita a todas las interrupciones, y un bit especfico para cada una de ellas. La habilitacin se har de nuevo con la funcin enable_interrupts() //Habilita interrupcin por RB enable_interrupts(INT_RB); //Habilita interrupcin Global enable_interrupts(GLOBAL);

MDULO LCD
Los mdulos LCD (Liquid Crystal Display) aparecieron a raz de la necesidad de tener un mtodo de visualizacin que fuera compacto, fcil de manejar y con un consumo de corriente bajo, ya que anteriormente se haca uso de displays de 7 segmentos, lo que haca un poco tediosa la programacin e implementacin de hardware para mostrar datos por estos elementos, adems el consumo de corriente era alto y no era posible visualizar todos los caracteres alfanumricos. El proceso de visualizacin es gobernado por un microcontrolador incorporado a la pantalla, siendo el Hitachi 44780 el modelo ms utilizado.

MDULO LCD

MDULO LCD
El visualizador a usar ser el LM016L que es un LCD de 2 lneas por 16 caracteres cada una. Las caractersticas por las cuales se escogi este visualizador son las siguientes: Consumo de potencia reducido (cerca de 7,5 mW) Pantalla de caracteres ASCII, adems de los caracteres japoneses Kanji, caracteres griegos y smbolos matemticos. Desplazamiento de caracteres hacia la izquierda o derecha. Memoria de 40 caracteres por lnea de pantalla, visualizndose 16 caracteres por lnea. Movimiento del cursor. El usuario puede generar 8 caracteres nuevos. Pueden ser gobernados con un bus de 8 4 bits.

MDULO LCD
Pin N-. Sismologa Nivel I/O Funcin

1
2 3 4

VSS
VCC Vee = Vc RS

0/1

0 Vlts. Tierra (GND).


+ 5 Vlts. DC. Ajuste del Contraste. 0= Entrada de una Instruccin. 1= Entrada de un dato. 0= Escribir en el mdulo LCD.

R/W

0/1

1= Leer del mdulo LCD.


0= Deshabilita el modulo LCD 1= Habilita el mdulo LCD BUS DE DATO LINEA 1 (LSB). BUS DE DATO LINEA 2 BUS DE DATO LINEA 3 BUS DE DATO LINEA 4 BUS DE DATO LINEA 5 BUS DE DATO LINEA 6 BUS DE DATO LINEA 7 BUS DE DATO LINEA 8 (MSB). LED (+) Back Light LED (-) Back Light.

6 7 8 9 10 11 12 13 14 15 16

E DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 A (Algunos) K (Algunos)

0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 -

I I/O I/O I/O I/O I/O I/O I/O I/O -

MDULO LCD

MDULO LCD
El compilador CCS provee una librera llamada LCD.C para el manejo de este dispositivo. La librera deber ser llamada por medio de la directiva #include<LCD.C> que se incluir despus de la directiva #use delay(clock=frecuencia) o de lo contrario no se configurar el reloj para la librera LCD.C lo que generar errores al compilar. La librera LCD.C viene configurada para que el LCD trabaje a 4 bits usando solo el PORTD. Las funciones que provee el archivo LCD.C son:

lcd_init();

//Primera funcin que se debe llamar y permite inicializar el LCD //se debe llamar solo una vez al inicio del programa lcd_gotoxy(x,y); //Ubica el cursor en la posicin x,y de la pantalla lcd_putc(c); //Coloca el carcter o caracteres en la posicin que se encuentre //el cursor.

MDULO LCD

TECLADO MATRICIAL

TECLADO MATRICIAL
El compilador CCS provee una librera llamada KBD.C para el manejo de este dispositivo. La librera deber ser llamada por medio de la directiva #include<KBD.C> que se incluir despus de la directiva #use delay(clock=frecuencia) o de lo contrario no se configurar el reloj para la librera KBD.C lo que generar errores al compilar. La librera KBD.C viene configurada para que el teclado matricial trabaje en el PORTD, pero como este puerto lo estaremos usando para el LCD, se har un cambio en la librera para que trabaje en PORTB; este cambio ser quitar el comentario a una lnea: // Un-comment the following define to use port B #define use_portb_kbd TRUE

Las funciones que provee el archivo KBD.C son: kbd_init(); //Primera funcin que se debe llamar y permite inicializar el //teclado. Se debe llamar solo una vez al inicio del programa kbd_getc(); //Obtiene la tecla pulsada y la devuelve como un carcter.

TECLADO MATRICIAL

CONVERSOR A/D
Un conversor anlogo/digital permite digitalizar una seal de voltaje anlogo. Lo que hace es asignarle un nmero binario a cada cierta cantidad de voltios. El valor mnimo de voltaje que el CAD sensar y digitalizar est dado por la resolucin.
2 1

Vref ser la diferencia de potencial entre el valor mximo de voltaje a sensar y el mnimo.
La resolucin depender del nmero de bits del conversor anlogo digital, de aqu se obtiene el valor de n en la frmula. El PIC16F877A posee un conversor anlogo digital de 10 bits, por lo tanto su resolucin ser
= = 210 1 1023

CONVERSOR A/D
Supongamos que un sensor de temperatura entrega valores entre 0 y 5 Voltios. El sensor convierte la variable fsica Temperatura en voltaje y asumamos que 0 voltios equivale 0C y 5 voltios 150C.
= 5 5 = = 0,00488 = 4,88 210 1 1023

Los valores digitales para cada valor anlogo sern: 0000000000 -> 0,00000 voltios -> 0C 0000000001 -> 0,00488 voltios -> 0,146C 0000000010 -> 0,00976 voltios -> 0,293C 0000000011 -> 0,01464 voltios -> 0,439C 1111111101 -> 4,98534 voltios -> 149,7C 1111111110 -> 4,99022 voltios -> 149,85C 1111111111 -> 5,00000 voltios -> 150C

CONVERSOR A/D
Como se mencion anteriormente, el PIC16F877A posee un conversor de 10 bits y 8 canales (pines) anlogos por los cuales se pueden convertir seales de este tipo. Estos pines debern ser configurados para funcionar como entradas anlogas. Canal 0 (AN0): RA0 Canal 1 (AN1): RA1 Canal 2 (AN2): RA2 Canal 3 (AN3): RA3 Canal 4 (AN4): RA5 Canal 5 (AN5): RE0 Canal 6 (AN6): RE1 Canal 7 (AN7): RE2 En C se usarn las siguientes funciones para hacer uso del conversor anlogo/digital. Setup_adc_ports(valor) //Configura los pines que funcionar como entradas anlogas

CONVERSOR A/D
En C se usarn las siguientes funciones para hacer uso del conversor anlogo/digital. Setup_adc_ports(valor)//Configura los pines que funcionar como entradas anlogas/digitales
valor NO_ANALOGS 7 ALL_ANALOG 0 AN0_AN1_AN2_AN4_AN5_AN6_AN7_VSS_VREF 1 AN0_AN1_AN2_AN3_AN4 2 AN0_AN1_AN2_AN4_VSS_VREF 3 AN0_AN1_AN3 4 AN0_AN1_VSS_VREF 5 AN0_AN1_AN4_AN5_AN6_AN7_VREF_VREF 0x08 AN0_AN1_AN2_AN3_AN4_AN5 0x09 AN0_AN1_AN2_AN4_AN5_VSS_VREF 0x0A AN0_AN1_AN4_AN5_VREF_VREF 0x0B AN0_AN1_AN4_VREF_VREF 0x0C AN0_AN1_VREF_VREF 0x0D AN0 0x0E AN0_VREF_VREF 0x0F // None // A0 A1 A2 A3 A5 E0 E1 E2 // A0 A1 A2 A5 E0 E1 E2 VRefh=A3 // A0 A1 A2 A3 A5 // A0 A1 A2 A4 VRefh=A3 // A0 A1 A3 // A0 A1 VRefh=A3 // A0 A1 A5 E0 E1 E2 VRefh=A3 VRefl=A2 // A0 A1 A2 A3 A5 E0 // A0 A1 A2 A5 E0 VRefh=A3 // A0 A1 A5 E0 VRefh=A3 VRefl=A2 // A0 A1 A4 VRefh=A3 VRefl=A2 // A0 A1 VRefh=A3 VRefl=A2 // A0 // A0 VRefh=A3 VRefl=A2

CONVERSOR A/D
Setup_adc(modo)//Configura el mdulo conversor A/D
Modo ADC_OFF ADC_CLOCK_DIV_2 ADC_CLOCK_DIV_8 ADC_CLOCK_DIV_32 ADC_CLOCK_INTERNAL 0 0x10000 0x0040 0x0080 0x00c0 // ADC Off //Reloj de conversin Fosc/2 //Reloj de conversin Fosc/8 //Reloj de conversin Fosc/32 // Internal 2-6us

Set_adc_channel(canal)//Selecciona el canal del conversor A/D


canal 0 7 // Canal0 Canal7

Read_adc()//Retorna el valor en decimal del dato convertido en el canal seleccionado previamente valor=read_adc(); #device adc=10 //Nmero de bits que el conversor retornar

MDULO PWM
La modulacin de ancho de pulso de una seal consiste en variar el tiempo de trabajo (tiempo activo duty cycle) de esta y as regular la potencia de ciertos dispositivos. El valor promedio de voltaje (y corriente) que alimenta a la carga es controlado switcheando rpidamente para que la seal llegue o no a esta. Entre ms largo sea el tiempo que se suministra voltaje a la carga comparado con el tiempo que no se le suministra, mayor ser la potencia que se le suministra.

DUTY CYCLE

T periodo

MDULO PWM
La frecuencia del PWM depender de la aplicacin en la que se desee usar. El tiempo de trabajo o Duty Cycle hace referencia al tiempo que permanece encendido o que se est alimentando la carga. El PIC tiene destinados 2 pines llamados CCP1 y CCP2 para ser usados como PWM: RC2(CCP1) y RC1 (CCP2). Estos pines debern ser configurados como salidas. La resolucin del PWM es de 10 bits distribuidos en dos registros CCPRxL (8 Msb) y CCPxCON<5:4> (2 Lsb) x x x x x x x x x

MDULO PWM
Para obtener el periodo de la seal PWM, se configuran dos registros de 8 bits llamados TIMER2 y PR2. El prescaler del TMR2 puede ser 1, 4 16. La siguiente frmula permite calcular el periodo del PWM.

PWMT=(PR2+1) x 4 x Tosc x (Valor de prescaler del TMR2)


Cuando el valor del TMR2 alcanza al PR2, suceden tres eventos: TMR2 es limpiado El pin CCPx es puesto a 1 (excepto si el duty cycle = 0%) El duty cycle es cambiado de CCPRxL a CCPRxH

MDULO PWM
Para obtener el ciclo de trabajo de la seal PWM, se usa la siguiente frmula
PWM dutycycle=(CCPRxL:CCPxCON<5:4>) x Tosc x (Valor de prescaler del TMR2)
Valor de 10 bits

MDULO PWM
La funcin setup_timer_2() permite configurar el prescaler del TMR2, el PR2 y el postcale del TMR2 setup_timer_2 (mode, period, postscale) mode: T2_DISABLED, T2_DIV_BY_1, T2_DIV_BY_4, T2_DIV_BY_16

period: entero entre 0-255 equivalente al PR2


postcale: Entero entre 1-16 que determina cuantos desbordamientos del temporizador deben ocurrir antes de una interrupcin

MDULO PWM
Para configurar el mdulo como PWM se usarn las funciones: setup_ccp1(CCP_PWM); setup_ccp2(CCP_PWM); Para configurar el duty cycle se usar la funcin: set_pwm1_duty(valor); set_pwm2_duty(valor); valor: Entero entre 0-1023 que equivale al valor de 10 bits de CCPRxL:CCPxCON<5:4>

MDULO PWM
Para generar un PWM de 250KHz con un duty cycle del 50% del periodo usando un cristal de 4MHz, se proceder de la siguiente forma: 1) Se calcula el valor del PR2 con la frmula: PWMT=(PR2+1) x 4 x Tosc x (Valor de prescaler del TMR2) Asumiendo un valor del prescaler del TMR2=1 El valor de PWMT se conoce al saber cual ser la frecuencia PWMT=1/250000Hz=0,000004 seg 4uS PWMT Tosc=1/Fosc=1/4000000=0,00000025 seg PR2 = (0,000004 x 4000000 x 1/4)-1 = 3

MDULO PWM
2) Se calcula el valor de 10 bits de (CCPRxL:CCPxCON<5:4>) con la frmula: PWM dutycycle=(CCPRxL:CCPxCON<5:4>) x Tosc x (Valor de prescaler del TMR2)
duty

Asumiendo un valor del prescaler del TMR2=1 El valor de PWM dutycycle se conoce al saber el periodo del PWM de 4uS. Como se requiere que sea del 50%, el duty cycle ser de 2uS Tosc=1/Fosc=1/4000000=0,00000025 seg Duty Cycle duty = (0,000002 x 4000000)/1 = 8

PWMT

MDULO PWM
#include <16f877a.h> #fuses xt #use delay(clock=4000000)
int16 duty=8; void main(){ set_tris_c(0x00); setup_timer_2(T2_DIV_BY_1, 3,1); setup_ccp1(CCP_PWM); set_pwm1_duty(duty); for(;;){ } }
Duty Cycle

PWMT

MDULO PWM
Hay que tener en cuenta que los valores del PR2 y duty deben ser enteros, en el caso dado que al calcularlos den con punto decimal, se deber modificar el valor del TMR2. El valor del duty debe ser un entero de 16 bits, de otra forma no funcionar correctamente el mdulo PWM.

Anda mungkin juga menyukai