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.
SISTEMA MICROPROCESADO
MEMORIES UNIT
ALU
UC
REGS
I/O UNIT
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
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
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
/ %
++ --
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
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 )
Instrucciones
input_x( ) : Lee un dato por un puerto.
Dato=input_a( ) Dato=input_b( ) Dato=input_c( ) Dato=input_d( ) Dato=input_e( )
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)
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
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 )
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_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)
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)
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
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
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)
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
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
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.
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
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
R/W
0/1
6 7 8 9 10 11 12 13 14 15 16
E DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 A (Algunos) K (Algunos)
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
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.
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
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.