Interrupciones y Temporizadores
Interrupciones y Temporizadores
Interrupciones y Temporizadores
4.1 Desarrollo y clasificacin de los microcontroladores. 4.2 Arquitectura Bsica 4.2.1 Arquitectura interna 4.2.1.1 Mapa de Memoria 4.2.1.2 Registros 4.2.1.3 ALU 4.2.1.4 Canales (bus) 4.2.2 Arquitectura Externa (terminales) 4.3 Programacin 4.3.1 Modos de direccionamiento 4.3.2 Interrupciones 4.3.3 Subrutinas 4.3.4 Manejo de perifricos internos del microcontrolador 4.4 Aplicaciones
INTERRUPCION: Una Interrupcin consiste en un mecanismo por el cual un evento interno o externo puede interrumpir la ejecucin normal del programa en cualquier momento. Hay dos tipos de interrupciones posibles: externa, es decir mediante la activacin de uno de sus pines, la otra es interna, por cambio de valor en uno de sus registros. En los modelos PIC16F7X se disponen de numeroso perifricos integrados y pueden aceptar hasta 12 posibles causas (Fuentes) diferentes de interrupcin. Algunas de ellas se mencionan a continuacin:
FUENTES DE INTERRUPCION: Interrupcin externa por pin RB0/INT Desbordamiento del TIMER0 Cambio en el estado de los bits 4 a 7 del PUERTOB Desbordamiento del TIMER1 Desbordamiento del TIMER2 Interrupcin del modulo captura/compara 1 Interrupcin del modulo captura/compara 2 Transmisin o recepcin de un caracter por la interface serie sincrnica Transmisin o recepcin de un caracter por la interface serie asincrnica Fin de conversin A/D Lectura/escritura del puerto paralelo de comunicacin con otros microprocesadores
MICROCONTROLADORES
Escritura de EEPROM finalizada
Al producirse una interrupcin valida, se salva el valor actual del contador del programa(PC) guardando su valor en la primera posicin de la PILA, a continuacin salta automticamente a la direccin del vector de interrupcin de la memoria de programa y ejecuta el cdigo correspondiente de atencin a la interrupcin, hasta encontrar la instruccin RETFIE.
MICROCONTROLADORES
Los registros asociados con las interrupciones son el INTCON, PIR1, PIR2, PIE1 y PIE2. El bit GIE de activacin global del permiso de interrupcin, situado en el registro INTCON, se borra automticamente cuando se reconoce una interrupcin para evitar que se produzca otra cuando se atiende a la inicial. Al retornar de la interrupcin, el bit GIE se vuelve a activar.
El registro INTCON contiene varios bits para la activacin, de algunas flags y la habilitacin de algunas interrupciones como: interrupcin por desbordamiento del TMR0, interrupcin externa por el pin RB0 y interrupcin por cambio de estado en la lneas del PUERTOB.
MICROCONTROLADORES
El registro PIE1 contiene los bits para habilitar las interrupciones de los perifricos.
MICROCONTROLADORES
El registro PIR1 Contiene los bits de las flags, para las interrupciones de los perifricos.
MICROCONTROLADORES
El registro PIE2 Contiene los bits para habilitar las interrupciones de otros perifricos como son:
MICROCONTROLADORES
El modulo CCP2, colisin de bus SSP y escritura EEPROM.
MICROCONTROLADORES
El registro PIR2 Contiene los bits de las flags, para las interrupciones del modulo CCP2, colisin de bus SSP y escritura EEPROM
Como la interrupcin puede producirse por diversas causas, el software inicial de la rutina de interrupcin comienza explorando cual ha sido la causa que la ha provocado. Los sealizadores de las fuentes de interrupcin se deben borrar por software, despus de atender a una de ellas, para prevenir falsas interrupciones. La interrupcin externa, producida por la activacin de una patita, debe mantenerse con el nivel activo al menos 3 o 4 ciclos de instruccin, dependiendo de cuando se produce. Se puede programar para ser sensible al flanco ascendente o al descendente, mediante el bit <6> del registro OPTION.
MICROCONTROLADORES
5-3-1 Fases de una interrupcin Se expone ordenadamente la secuencia de acciones que se llevan a cabo cuando se atiende a una interrupcin. 1. Se activa una posible causa de interrupcin. El sealizador de dicha causa, el bit de permiso correspondiente y el global para todas las interrupciones (GIE) estn a nivel alto. 2. Para evitar que se produzca otra interrupcin mientras dura el tratamiento de la que se ha aceptado, el bit GIE se pone a 0. 3. El valor actual del PC se guarda en la Pila. 4. El PC se carga con el valor 0004h, que es el del vector de interrupcin. 5. La rutina de interrupcin comienza explorando el valor de los sealizadores, para determinar la causa que la ha provocado. 6. Segn la causa de la interrupcin, la rutina se bifurca a la subrutina correspondiente. 7. Se borran los sealizadores por software, antes de realizar el retorno. 8. Cuando se llega a la ultima instruccin de la rutina de interrupcin, que es la de RETURN, se carga en el PC el valor que inicialmente se guardo en la Pila y se pone el bit GIE = 1.
INTERRUPCIONES EN C
En el compilador C (PCW) la directiva utilizada para el manejo de las interrupciones es: #INT_XXXX. Especifica que la funcin que le sigue es una funcin de atencin a la interrupcin; y no requiere de ningn otro parmetro. Las interrupciones que aceptan los PIC16F877 son:
INTERRUPCION
#INT_AD #INT_EXT #INT_RB #INT_RDA #INT_TBE #INT_TIMER0 #INT_TIMER1 #INT_TIMER2 #INT_EEPROM #INT_CCP1 #INT_CCP2
DESCRIPCION
Conversin AD completa. Interrupcin externa por cambio de estado en el PIN_RB0 Interrupcin externa por cambio de estado en alguno de los pines. B4 - B7 RS232 Dato recibido RS232 Buffer de transmisin vacio. Desbordamiento del TIMER 0. Desbordamiento del TIMER 1. Desbordamiento del TIMER 2. Escritura EEPROM Finalizada. Interrupcin por el modulo 1 de Captura, Compara y PWM. Interrupcin por el modulo 2 de Captura, Compara y PWM.
MICROCONTROLADORES
MANEJO DEL INTERUPCIONES EN C. En el compilador C la directiva habitual para el manejo de interrupciones es #INT_xxx, donde cada directiva depende del modelo de PIC utilizado. Por ejemplo para el PIC16F877 tenemos:
GLOBAL equivale a GI=PEIE= 1, con lo que se otorga el permiso de todas las interrupciones.
MICROCONTROLADORES
Para habilitar las funciones se utiliza la instruccin: enable_interrupts (interrupcin); donde interrupcin corresponde a la etiqueta asignada para cada interrupcin que se desea habilitar, de acuerdo con la tabla anterior. Para deshabilitar se utiliza disable_interrupts (interrupcin);
Ejemplo:
// Habilita interrupcin por desbordamiento del TIMER0 // Habilita interrupcin por fin de conversin AD // otorga permiso para efectuar interrupciones
Ejemplo el siguiente programa enciende y apaga un LED, cuando hay un cambio de estado en el pin RBO. Para este caso se utiliza la directiva #INT_EXT.
MICROCONTROLADORES
//Programa que demuestra el funcionamiento de la interrupcin externa RB0, cada que se pulse el botn //conectado al pin RB0 el LED cambiara su estado.
#include <16F877A.h> #fuses XT,NOWDT,PUT,NOWRT #use delay (clock= 4MHz) #use fast_io(B)
#INT_EXT //Atencin a interrupcin por cambio en RB0 void inter_RB0(){ //Funcin de interrupcin output_toggle(pin_B7); } void main () { set_tris_B (0x01); // B0 como entrada, B7 como salida output_low (PIN_B7); //Apaga LED enable_interrupts (int_ext); //Habilita int. RB0 ext_int_edge (L_TO_H); //por flanco de subida enable_interrupts(GLOBAL); //Habilita int. general while (1){ } } //Bucle infinito de espera
MICROCONTROLADORES
Ejercicio 1 - Realice un Programa que genere una seal cuadrada a travs de un PIN del Mcc con una frecuencia de 1Hz y un ciclo de trabajo del 50%. A su vez se debe de llevar el conteo de los pulsos enviados por un sensor y mostrarlos en un LCD. Los pulsos pueden ocurrir en cualquier momento y su duracin es de 1 ms. Utilice la interrupcin externa.
TAREA
Ejercicio 2 - Realizar un Programa que permita controlar la velocidad de un motor de CD mediante la modulacin de ancho de pulso. Se debe de tener un BOTON para INCREMENTAR la velocidad; La velocidad debe de mostrarse en un LCD, de 0 a 100% y los incrementos de velocidad deben de llevarse a cabo en un 10% cada vez que se pulse un botn. Al llegar al 100% de velocidad si se pulsa nuevamente el BOTON regresara al estado inicial de PARO (Velocidad 0%).
MICROCONTROLADORES
TEMPORIZADORES
Los PIC16F87X disponen de tres temporizadores (sin contar el WDT) que son el TMR0, TMR1, TMR2. Las caractersticas de cada uno se listan a continuacin. Caractersticas del TMR0: Es temporizador/contador dispone de 8 bits Puede escribirse y leerse Preescaler programable por Software (de 1:256) Puede trabajar con el reloj interno o con una seal de reloj externa Dispone de una interrupcin por desbordamiento al pasar de FFh a 00h
MICROCONTROLADORES
Seleccin de flanco ascendente o descendente para el flaco del reloj externo
Caractersticas del TMR1: Es temporizador/contador dispone de 16 bits Puede escribirse y leerse Preescaler programable por Software (de 1:8 ) Puede trabajar con el reloj interno o con una seal de reloj externa Dispone de una interrupcin por desbordamiento al pasar de FFFFh a0000h
Caractersticas del TMR2: Es un temporizador de 8 bits Dispone de un registro de Periodo (PR2) Puede escribirse y leerse Preescaler programable por Software (de 1:256) Puede trabajar con el reloj interno o con una seal de reloj externa
Funcionamiento del TMR0: El TMR0 se inicializa con un valor, que se incrementa con cada pulso de entrada hasta su valor FF; con el siguiente impulso de entrada su valor se desborda pasando a valer 00 y colocado a 1 el sealizador TOIF (bit 2 del registro INTCON). Los impulsos aplicados al TMR0 pueden provenir de los pulsos aplicados al pin TOCK1 o de la seal de reloj interna (Fosc/4), lo que le permite actuar de dos formas diferentes: Como contador de los impulsos que le llegan por el pin RA4/TOCK1. Como temporizador de tiempos.
En modo Temporizador: El TMR0 se incrementa con cada Ciclo de Instruccin (Fosc/4) y cuando el registro se desborde provocar una interrupcin (opcional). En modo Contador: El TMR0 se incrementar con cada pulso que ingrese por el pin RA4/T0CKI, y por supuesto... cuando se desborde producir la interrupcin (opcional). T0SE es el Bit4 del Registro
MICROCONTROLADORES
OPTION, en l seleccionas el flanco con el cual se incrementar el TMR0 cuando haya un pulso por RA4/TOCKI. El Prescaler es un predivisor de frecuencia que se utiliza comnmente para programar tiempos largos y puedes aplicarlo al TMR0 o al WDT, esto lo configuras en PSA Bit3 del registro OPTION. BITS DE CONFIGURACION DEL TMRO Para controlar el comportamiento del TMR0 se utilizan algunos bits de los registros OPTION e INTCON. Del registro INTCON en este caso solamente se utiliza el bit TOIF (bit 2), por lo que la configuracin queda bsicamente en el registro OPTION.
REGISTRO OPTION
RBPU INTEDG TOCS TOSE PSA PS2 PS1 PS0
Bit 5: T0CS: Selecciona la fuente de Reloj para TMR0 1 = Pulsos por el pin RA4/T0CKI (contador) 0 = Ciclo de instruccin interno (temporizador) Bit 4: T0SE: Flanco de incremento para RA4/T0CKI 1 = Incrementa TMR0 en flanco descendente 0 = Incremento en flanco ascendente Bit 3: PSA: Bit de asignacin del Prescaler 1 = Divisor asignado al WDT 0 = Divisor asignado al TMR0 Bit 2-0: PS2, PS1, PS0: Seleccin del prescaler (divisor de frecuencia), el valor del prescaler se selecciona mediante la combinacin de los bit PS2: PS0, tal como se muestra en la siguiente tabla
PS2 PS1 PS0 Divisin del TMR0 Divisin del WDT NOTA: La Sincronizacin del genera un pequeo retraso de 2 ciclos de instruccin mientras sincroniza el prescaler con el reloj interno.
MICROCONTROLADORES
Como hacer una temporizacin con el registro TMR0 El tiempo empleado en una temporizacin se puede calcular a partir de un ciclo de instruccin (es decir 1 instruccin por cada microsegundo, si estas trabajando con un XT de 4 Mhz), tambin necesitas el valor del Divisor de Frecuencia (el que seleccionabas con los Bit's PS2:PS0), y finalmente con el complemento del valor cargado en TMR0 (es decir 255-TMR0), la ecuacin que permite realizar el clculo es la siguiente:. Temporizacin = Tins x Prescaler x (256 - valor de TMR0) Ejemplo: Qu valor hay que cargar en el TMR0 para lograr un tiempo de 500 us si se utiliza un prescaler de 2 y un cristal de 4 MHz? SOLUCION Sustituyendo en la ecuacin anterior: Temporizacin = Tins x Prescaler x (256- valor de TMR0)
Ejemplo se desea generar una onda cuadrada de 2 KHz con un ciclo de trabajo del 50% con un PIC, utilizando el TMR0. SOLUCION: Los tiempos de periodo y ciclo de trabajo se consiguen mediante la utilizacin del TMR0 Periodo = 1/2KHZ = 0.5 ms = 500 us Ciclo de trabajo = 50% = 250 us
EL TIMER0 EN C
Para configurar el TIMER0 se utilizan las siguientes funciones: setup_timer_0(modo); Con esta instruccin se indica el modo de trabajo (Temporizador o contador) y el valor del prescaler, de acuerdo a la siguiente tabla. set_timer_0(valor); Esta instruccin permite cargar un valor (inicial) al TIMER0
MICROCONTROLADORES
Los distintos modos se pueden agrupar mediante el empleo del smbolo . setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_2);
MICROCONTROLADORES
EJEMPLO Configure el TIMER0 para que trabaje como temporizador, con un prescaler de 4, e inicialcelo con un valor de 0x25.
void main() { setup_timer_0(RTCC_INTERNAL | RTCC_DIV_4); set_timer_0(0x 25); }
EJEMPLO Generar una seal cuadrada de 1 KHz con un ciclo de trabajo del 50%, utilizando la interrupcin del TIMER0, considere una frecuencia de trabajo de 4MHz.
SOLUCION. Periodo = 1/1KHZ = 1 ms = 1000 us Ciclo de trabajo = 50% = 500 us Calculando el valor inicial del TIMER0 Temporizacin = Tins x Prescaler x (256- valor de TMR0) 500 = 1 x 2 x (256 valor de TMR0)
//Configuracin timer0 //Carga del timer0 //Habilita interrupcin timer0 //Habilita interrupcin general //bucle infinito
MICROCONTROLADORES
En la siguiente figura se muestra el circuito con el programa cargado. Se utiliza el COUNTER TIMER en el modo de frecuencmetro para medir la frecuencia generada.
PRACTICA 1- RELOJ DIGITAL- Realizar un Programa utilizando el TIMER1 como temporizador, para contar el tiempo transcurrido en segundos, y mostrarlo en un LCD en el formato: Hrs/Min/seg. Se debe contar con dos botones que permiten ajustar el tiempo. Un Botn de SETUP que permita seleccionar el parmetro a cambiar: hrs, min o seg, y otro el Botn de INCREMENTO que permita incrementar el valor de min y seg de 0 a 59. si se alcanza el valor de 59, y se pulsa nuevamente entonces regresa a 0. De igual forma para las hrs, pero el valor permitido ser de 0 a 24.
MICROCONTROLADORES
Reloj digital en operacin.
Al presionar el botn SETUP permite seleccionar y modificar el valor de la hr, min, y seg.
MICROCONTROLADORES
USART
TRANSMISOR RC6/TX/CK RECEPTOR RC7/RX/DT TX RX PERIFRICO RS232-C
RX
TX
MICROCONTROLADORES
PIC16F87X
MODO SINCRONO
PIC16F87X
USART
RELOJ RC6/TX/CK DATOS RC7/RX/DT CK DT CK DT
USART
RELOJ RC6/TX/CK DATOS RC7/RX/DT
Figura x.x Posibles formas de trabajo al utilizar el modulo USART de los PIC16F87X.
MAESTRO
ESCLAVO
Dada la importancia del protocolo asncrono del USART, nos vamos a enfocar el estudio del modo de comunicacin asncrona. En esta forma de comunicacin serie, se usa la norma RS-232-C, donde cada palabra de informacin o dato se enva independientemente de los dems. Suele constatar de 8 o 9 bits y van precedidos por un bit de START (inicio) y detrs de ellos se coloca un bit de STOP (parada), de acuerdo con las normas del formato estndar NRZ (Non Return-to-Zero) Los bits se transfieren a una frecuencia fija y normalizada. Los cuatro bloques que configuran la arquitectura del USART en modo asncrono son: - Circuito de Muestreo - Generador de Baudios - Transmisor Asncrono - Receptor Asncrono El circuito de muestreo es un circuito que acta sobre la patita RC7/RX, que es por donde se reciben los bits de informacin o control y se encarga de muestrear tres veces su valor, para decidir este por mayora. Generador de Baudios Para el protocolo asncrono RS-232-C, la frecuencia en baudios (bits por segundo) a la que se realiza la transferencia se debe efectuar a un valor normalizado: 330, 600, 1200, 2400, 4800, 9600, 19200, 38400, etc. Para generar esta frecuencia, el USART dispone de un generador de frecuencia en Baudios, BRG, cuyo valor es controlado por el contenido grabado en el registro SPBRG. Aparte del valor X cargado en el registro SPBRG, la frecuencia en baudios del generador depende del bit BRGH del registro TXSTA <2>. En el caso de que BRGH = 0 se trabaja en baja velocidad y si BRGH = 1 se trabaja en alta velocidad. Segn este bit se obtendr el valor de una constante K necesaria en la determinacin de la frecuencia de funcionamiento.
MICROCONTROLADORES
Frecuencia (en Baudios) = Fosc / (K*(X+1)) X es el valor cargado en el registro SPBRG Si BRGH = 0, baja velocidad y K = 64 Si BRGH = 1, alta velocidad y K = 16 Despejando de la ecuacin anterior obtenemos que: X = (Fosc / Frecuencia * K) - 1 Ejemplo.- Se tiene un PIC16F87X trabajando a una Fosc = 16 MHz, y se desea utilizar el USART en modo asncrono y baja velocidad con una frecuencia de 9,600 baudios, calcule el valor de X que hay que cargar en el registro SPBRG y el error que se origina. X = (16,000,000 / (9,600)(64) ) 1 = (16,000,000 / 614,400) 1 X = 26.041666 1 = 25.041666 X = 25 Si se carga el registro SPBRG con 25 la frecuencia real de trabajo ser: Frecuencia = 16,000,000 / ( 64*(25+1) ) = 9,615 baudios Error = ( (9,615 9,600) / 9,600 ) x 100 = 0.16% En el manual vienen unas tablas con clculos para el valor de la frecuencia de operacin del USART, para las frecuencias de trabajo (XT) mas comunes.
MICROCONTROLADORES
MICROCONTROLADORES
Transmisor Asncrono La figura muestra el diagrama por bloques de la seccin de transmisin del USART en modo asncrono.
El dato que se desea transmitir por el USART se deposita en el registro TXREG y a continuacin se Traspasa al registro de desplazamiento TSR, que va sacando los bits secuencialmente y a la frecuencia establecida. Adems, antes de los bits del dato de informacin incluye un bit de INICIO y despus de sacar todos los bits aade un bit de PARADA. El USART receptor recibe, uno a uno, los bits, elimina los de control y los de informacin una vez que han llenado el registro de desplazamiento RSR los traslada automticamente al registro RCREG, donde quedan disponibles para su posterior procesamiento. Cuando se escribe otro dato sobre TXREG, el sealizador TXIF se pone a 0. El bit TRMT sirve para indicar el estado del registro TSR y vale 1 cuando esta vaco. La secuencia de pasos a seguir para una transmisin en el USART es la como sigue:
1. Configurar las lneas RC6/TX/CK como salida y RC7/RX/DT como entrada. 2. Asignar SYNC=0 (TXSTA) y SPEN=1 (RCSTA) para activar el USART como asncrono. 3. Si el dato consta de 9 bits, en lugar de los 8 tpicos, asignar el bit TX9=1(TXSTA). El noveno bit se colocar en TX9D (TXSTA) 4. Se carga el valor adecuado en el registro SPBRG, para producir la frecuencia de trabajo deseada. Hay que controlar el bit BRGH (alta y baja velocidad) 5. Activar la transmisin con TXEN = 1(TXSTA). El bit TXIF tendr valor 1; ya que TXREG se encuentra vaco. 6. Cargar en TXREG el dato a transmitir. Comienza la transmisin.
MICROCONTROLADORES
Los registros de control del USART son el TXSTA (Registro y estado de control Receptor) y el RCSTA (Registro y estado de control Receptor).
bit 7
CSRC: bit de seleccin de reloj Modo asncrono: no incluye Modo sncrono 1 = Modo maestro (reloj generado internamente desde BRG) 0 = Modo esclavo (reloj generado por una fuente externa) TX9 : Habilita el bit 9 de transmisin 1 = Selecciona transmisin de 9 bits 0 = Selecciona transmisin de 8 bits TXEN: Activa la transmisin 1 = Transmisin activada 0 = Transmisin desactivada Nota: SREN/CREN anula TXEN en modo sncrono. SYNC: Bit de seleccin del modo del USART 1 = Modo sncrono 0 = Modo asncrono No implementado: Ledo como '0' BRGH: Bit de seleccin de la velocidad de baudios Modo asncrono: 1 = Alta velocidad 0 = Baja velocidad Modo Sncrono: No se usa en este modo TRMT: Bit de estado del registro de desplazamiento de transmisin 1= TSR vaco 0 = TSR no vaco TX9D: Bit 9 del dato a transmitir (puede ser el bit de paridad)
bit 6
bit 5
bit 4
bit 3 bit 2
bit 1
bit 0
MICROCONTROLADORES
Registro de estado y Control RCSTA (Receptor)
bit 7
SPEN: Habilitacin del puerto serie 1 = Puerto serie habilitado (configura patillas RC7/RX/DT y RC6/TX/CK para el puerto serie) 0 = Puerto serie deshabilitado RX9: Habilita el bit 9 de recepcin 1 = Selecciona recepcin de 9 bits 0 = Selecciona recepcin de 8 bits SREN: Configura la recepcin sencilla Modo asncrono no incluye Modo sncrono maestro 1 = Habilita recepcin sencilla 0 = Deshabilita recepcin sencilla Modo sncrono esclavo no se utiliza CREN: Configura la recepcin continua Modo asncrono: 1 = Habilita modo de recepcin continua 0 = Deshabilita recepcin continua Modo sncrono: 1 = Habilita recepcin continua hasta que el bit CREN es borrado 0 = Deshabilita recepcin continua ADDEN: Deteccin de direccin Modo asncrono con 9 bits (RX9 = 1): 1 =Activa la deteccin de direccin, activa la interrupcin y descarga el buffer de recepcin al activarse RSR<8> 0 =Desactiva la deteccin de direccin, todos los bits son recibidos y el bit 9 puede ser utilizado como bit de paridad FERR: Bit de error de trama 1 = Error de trama (puede ser actualizado leyendo el registro RCREG y recibir el siguiente dato vlido 0 = No hay error de trama OERR: Bit de error de sobrepasamiento 1 = Error de sobrepasamiento (puede ser borrado escribiendo un 0 en el bit CREN) 0 = No hay error de sobrepasamiento RX9D: Bit 9 del dato recibido (Puede ser el bit de paridad)
bit 6
bit 5
bit 4
bit 3
bit 2
bit 1
bit 0
MICROCONTROLADORES
Receptor Asncrono La figura muestra el diagrama de bloques de la seccin receptora del USART
Los datos se reciben en serie, bit a bit, por la lnea RC7/RX/DT y se van introduciendo secuencialmente en el registro de desplazamiento RSR que funciona a una frecuencia 16 veces ms rpida que la de trabajo (baud rate). Cuando el dato consta de 9 bits hay que programar el bit RX9 = 1 y el noveno bit de informacin se colocar en el bit RX9D del registro RCSTA. Una vez que el modo asncrona sido seleccionado, la recepcin es habilitada colocando a el bit CREN = 1 (RCSTA<4>). Despus de detectar el bit de parada el dato presente en RSR es transferido al registro RCREG ( si es que est vaco). Si la transferencia ha sido completada con xito el RCIF (PIR1<5>) es puesto a 1-lgico. El bit RCIF solo es de lectura y colocado a 0-lgico por hardware ; es decir cuando el registro RCREG esta vaco. La siguiente es la secuencia de pasos a realizar para configurar la recepcin asncrona:
1. Inicializar el registro SPBRG con el valor apropiado que genere los baudios necesarios. No olvide colocar un valor al bit BRGH en funcin a si va o no a transmitir en alta velocidad. 2. Habilite la puerta serial asncrona colocando el bit SYNC = 0 y a el bit SPEN =1. 3. Si es un formato de 9 bits poner RX9 = 1 (RCSTA) para permitir la recepcin del noveno bit. El noveno bit se colocar en RX9D (RCSTA) 4. Habilite la recepcin colocando el bit CREN = 1 (RCSTA). 5. El bit RCIF se colocar a 1 cuando un dato llegue completo al microcontrolador 6. Se lee el registro RCSTA para obtener el valor del noveno bit (si es que esta trabajando con 9 bits de datos) 7. Se leen los 8 bits de datos del registro RCREG. 8. Si se ha producido algn error resetee el bit CREN, es decir CREN = 0 .
MICROCONTROLADORES
COMUNICACIN SERIE EL USART EN C: Universal Synchronous Asynchronous Receiver Transmitter
Configuracin genrica del USART: #USE RS232(opciones) Esta directiva permite configurar varios parmetros del USART: velocidad de transmisin, pines utilizados, etc. Se puede modificar en cualquier parte del programa, pero siempre despus de haber definido la directiva #USE DELAY, ya que esta directiva habilita el uso de funciones como getch, putchar y printf. Cuando se utilizan dispositivos con USART, si no se puede alcanzar una tasa de baudios dentro del 3% del valor deseado utilizando la frecuencia de reloj actual, se generar un error. Algunas de las opciones de configuracin se indican en la siguiente tabla:
Velocidad de baudios. Pin de transmisin. Pin de recepcin. Donde X puede ser N, E u O. X Indica el numero de bits (5-9).
Ejemplo: #use rs232 (baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=N) Entre las funciones que utilizan para la recepcin y envi de datos se encuentran:
c = GETC() c = GETCH() c = GETCHAR()
Estas funciones esperan un carcter por la patilla RCV del dispositivo RS232 y retorna el carcter recibido. Hay otra funcin que se puede utilizar tambin para la recepcin de datos que es:
GETS(char *string)
Esta funcin lee caracteres (usando GETC()) de la cadena (string) hasta que encuentra un retorno de carro (valor ASCII 13). La cadena se termina con un 0.
Para la transmisin de datos se cuenta con las funciones: Ral Alvarado Guerra Pgina 30
MICROCONTROLADORES
PUTC(dato) PUTCHAR(dato)
Donde dato es un carcter de 8 bits. Estas funciones envan el carcter por el pin XMIT. Cuando se quiere transmitir ms de un carcter se se pueden utilizar las funciones:
PUTS(string)
Esta funcin enva cada carcter de string a la patilla XMIT del dispositivo.
PRINTF(string, dato)
Esta funcin enva cada carcter de string a la patilla XMIT y el valor de una variable.
Ejemplo: puts("Continuar (s,n)?"); while(respuesta!='s'&& respuesta!='n') { respuesta=getch(); } Ejemplo: puts ( " HOLA " ); printf ("Temperatura = %01.2fV",Temp);
#include <16F877.h> #FUSES XT,NOWDT #use delay(clock=4000000) #use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=N) #include <LCD.C> char nombre[10]; void main() { lcd_init(); puts(Introduce tu nombre (mximo 10 caracteres) y pulsa enter:); gets (nombre); printf (lcd_putc, Nombre:); lcd_gotoxy(1,2); printf (lcd_putc, %s, nombre); }
MICROCONTROLADORES
CONEXIN DE UN MICROCONTROLADOR A UNA PC El puerto serie de una PC normalmente tiene un conector DB9, mediante el cual permite una establecer una comunicacin serie de datos, bajo la norma RS-232 (RS-232C).
Tabla de conexin:
Nmero de PIN 1 2 3 4 5 6 7 8 9
Nombre CD: Detector de transmisin RXD: Recibir datos TXD: Transmitir datos DTR: Terminal de datos lista GND: Seal de tierra DSR: Ajuste de datos listo RTS: Permiso para transmitir CTS: Listo para enviar RI: Indicador de llamada
En la siguiente figura se muestra como conectar un microcontrolador al el puerto serie de una PC mediante el uso de un circuito adaptador de voltajes, el MAX232
MICROCONTROLADORES
TX
OSC1 OSC2 VDD
PIC16F877
MCLR Vss
2 3
RX
2 3
En la figura anterior podemos apreciar como se conecta un microcontrolador PIC a una PC utilizando el circuito Integrado: MAX232.
Ejemplo.- el siguiente Programa espera a recibir un carcter a travs del puerto serie, una vez que recibe el carcter lo muestra en el LCD y enva el mensaje de "Recibido" a la PC.
MICROCONTROLADORES
#include <16F877.h> #FUSES XT,NOWDT #use delay(clock=4000000) #use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=N) #include <LCD.C> char ch; #int_rda void serial_isr() { ch=getchar(); puts ("Recibido"); } void main() { lcd_init(); enable_interrupts(global); enable_interrupts(int_rda); while (1) { lcd_gotoxy (1,1); printf(lcd_putc, " Valor %c",ch); } }
MICROCONTROLADORES
Usando la hiperterminal de Windows podemos enviar y recibir datos a travez del puerto serie. De esta manera al pulsar la tecla con el numero 7 la enva por el puerto serie, el micro la recibe y enva el mensaje de recibido a la PC como se muestra en la siguiente figura:
Al ingresar otro valor en la hiperterminal, el micro lo recibe y lo muestra en el LCD, y como respuesta enva un mensaje de recibido, ver figura siguiente:
MICROCONTROLADORES
Ejemplo.- E siguiente Programa que enva a travs del puerto serie un mensaje para que el usuario introduzca su nombre y lo enve a travs del puerto serie, el micro lo recibe y lo muestra en un LCD. #include <16F877.h> #FUSES XT,NOWDT #use delay (clock=4000000) #include <LCD.C> #use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=N) char nombre[10]; void main() { lcd_init(); puts("Introduce tu nombre (maximo 10 caracteres) y pulsa enter:"); gets (nombre); printf (lcd_putc,"Nombre:"); lcd_gotoxy (1,2); printf (lcd_putc,"%s",nombre); }
MICROCONTROLADORES
MICROCONTROLADORES
TAREA
Realizar un Programa que lea el valor de un canal analgico y lo muestra en un LCD, adems lo debe de enviar a una PC a travs del puerto Serie (USART). El circuito debe contener un multimetro que muestre el voltaje de la entrada analgica para verificar