interrupciones y temporizadores

38
MICROCONTROLADORES Raúl Alvarado Guerra Página 1 UNIDAD 4 Microcontroladores 4.1 Desarrollo y clasificación de los microcontroladores. 4.2 Arquitectura Básica 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 Programación 4.3.1 Modos de direccionamiento 4.3.2 Interrupciones 4.3.3 Subrutinas 4.3.4 Manejo de periféricos internos del microcontrolador 4.4 Aplicaciones INTERRUPCION: Una Interrupción consiste en un mecanismo por el cual un evento interno o externo puede interrumpir la ejecución normal del programa en cualquier momento. Hay dos tipos de interrupciones posibles: externa, es decir mediante la activación 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 periféricos integrados y pueden aceptar hasta 12 posibles causas (Fuentes) diferentes de interrupción. Algunas de ellas se mencionan a continuación: FUENTES DE INTERRUPCION: - Interrupción 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 - Interrupción del modulo captura/compara 1 - Interrupción del modulo captura/compara 2 - Transmisión o recepción de un caracter por la interface serie sincrónica - Transmisión o recepción de un caracter por la interface serie asincrónica - Fin de conversión A/D - Lectura/escritura del puerto paralelo de comunicación con otros microprocesadores

Upload: alberto-hai-re

Post on 07-Aug-2015

91 views

Category:

Documents


2 download

DESCRIPTION

INTERRUPCIONES Y TEMPORIZADORES en CCS

TRANSCRIPT

Page 1: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 1

UNIDAD 4 Microcontroladores 4.1 Desarrollo y clasificación de los microcontroladores. 4.2 Arquitectura Básica

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 Programación 4.3.1 Modos de direccionamiento 4.3.2 Interrupciones 4.3.3 Subrutinas 4.3.4 Manejo de periféricos internos del microcontrolador

4.4 Aplicaciones INTERRUPCION: Una Interrupción consiste en un mecanismo por el cual un evento interno o externo puede interrumpir la ejecución normal del programa en cualquier momento.

Hay dos tipos de interrupciones posibles: externa, es decir mediante la activación 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 periféricos integrados y pueden aceptar hasta 12 posibles causas (Fuentes) diferentes de interrupción. Algunas de ellas se mencionan a continuación: FUENTES DE INTERRUPCION:

- Interrupción 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

- Interrupción del modulo captura/compara 1

- Interrupción del modulo captura/compara 2

- Transmisión o recepción de un caracter por la interface serie sincrónica

- Transmisión o recepción de un caracter por la interface serie asincrónica

- Fin de conversión A/D

- Lectura/escritura del puerto paralelo de comunicación con otros microprocesadores

Page 2: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 2

- Escritura de EEPROM finalizada

Al producirse una interrupción valida, se salva el valor actual del contador del programa(PC) guardando su valor en la primera posición de la PILA, a continuación salta automáticamente a la dirección del vector de interrupción de la memoria de programa y ejecuta el código correspondiente de atención a la interrupción, hasta encontrar la instrucción RETFIE.

Page 3: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 3

Los registros asociados con las interrupciones son el INTCON, PIR1, PIR2, PIE1 y PIE2. El bit GIE de activación global del permiso de interrupción, situado en el registro INTCON, se borra automáticamente cuando se reconoce una interrupción para evitar que se produzca otra cuando se atiende a la inicial. Al retornar de la interrupción, el bit GIE se vuelve a activar. El registro INTCON contiene varios bits para la activación, de algunas flags y la habilitación de algunas interrupciones como: interrupción por desbordamiento del TMR0, interrupción externa por el pin RB0 y interrupción por cambio de estado en la líneas del PUERTOB.

Page 4: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 4

El registro PIE1 contiene los bits para habilitar las interrupciones de los periféricos.

Page 5: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 5

El registro PIR1 Contiene los bits de las flags, para las interrupciones de los periféricos.

Page 6: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 6

El registro PIE2 Contiene los bits para habilitar las interrupciones de otros periféricos como son:

Page 7: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 7

El modulo CCP2, colisión de bus SSP y escritura EEPROM.

Page 8: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 8

El registro PIR2 Contiene los bits de las flags, para las interrupciones del modulo CCP2, colisión de bus SSP y escritura EEPROM

Como la interrupción puede producirse por diversas causas, el software inicial de la rutina de interrupción comienza explorando cual ha sido la causa que la ha provocado. Los señalizadores de las fuentes de interrupción se deben borrar por software, después de atender a una de ellas, para prevenir falsas interrupciones. La interrupción externa, producida por la activación de una patita, debe mantenerse con el nivel activo al menos 3 o 4 ciclos de instrucción, dependiendo de cuando se produce. Se puede programar para ser sensible al flanco ascendente o al descendente, mediante el bit <6> del registro OPTION.

Page 9: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 9

5-3-1 Fases de una interrupción Se expone ordenadamente la secuencia de acciones que se llevan a cabo cuando se atiende a una interrupción. 1ª. Se activa una posible causa de interrupción. El señalizador de dicha causa, el bit de permiso correspondiente y el global para todas las interrupciones (GIE) están a nivel alto. 2ª. Para evitar que se produzca otra interrupción 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 interrupción. 5ª. La rutina de interrupción comienza explorando el valor de los señalizadores, para determinar la causa que la ha provocado. 6ª. Según la causa de la interrupción, la rutina se bifurca a la subrutina correspondiente. 7ª. Se borran los señalizadores por software, antes de realizar el retorno. 8ª. Cuando se llega a la ultima instrucción de la rutina de interrupción, 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 función que le sigue es una función de atención a la interrupción; y no requiere de ningún otro parámetro. Las interrupciones que aceptan los PIC16F877 son:

INTERRUPCION DESCRIPCION

#INT_AD Conversión AD completa.

#INT_EXT Interrupción externa por cambio de estado en el PIN_RB0

#INT_RB Interrupción externa por cambio de estado en alguno de los pines. B4 - B7

#INT_RDA RS232 Dato recibido

#INT_TBE RS232 Buffer de transmisión vacio.

#INT_TIMER0 Desbordamiento del TIMER 0.

#INT_TIMER1 Desbordamiento del TIMER 1.

#INT_TIMER2 Desbordamiento del TIMER 2.

#INT_EEPROM Escritura EEPROM Finalizada.

#INT_CCP1 Interrupción por el modulo 1 de Captura, Compara y PWM.

#INT_CCP2 Interrupción por el modulo 2 de Captura, Compara y PWM.

La instrucción enable_interrupts (interrupción) permite habilitar las interrupciones deseadas

Page 10: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 10

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. Posteriormente debe de habilitarse cada una de las interrupciones deseadas.

Page 11: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 11

Para habilitar las funciones se utiliza la instrucción: enable_interrupts (interrupción); donde interrupción corresponde a la etiqueta asignada para cada interrupción que se desea habilitar, de acuerdo con la tabla anterior. Para deshabilitar se utiliza disable_interrupts (interrupción); Ejemplo:

void main(){ enable_interrupts (INT_RTCC); // Habilita interrupción por desbordamiento del TIMER0 enable_interrupts (INT_AD); // Habilita interrupción por fin de conversión AD enable_interrupts (GLOBAL); // otorga permiso para efectuar interrupciones

}

Interrupción externa por cambio de estado en el PIN RB0 Un cambio de estado en algunos de los pines del Mcc, puede producir una interrupción, el cambio de estado se puede configurar para que sea de alto a bajo o de bajo a alto. Para hacer dicha configuración se utiliza la instrucción: ext_int_edge (L_TO_H); La interrupción será por flanco de subida. ext_int_edge (H_TO_L); La interrupción será por flanco de bajada. 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.

Page 12: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 12

//Programa que demuestra el funcionamiento de la interrupción externa RB0, cada que se pulse el botón //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 //Atención a interrupción por cambio en RB0 void inter_RB0(){ //Función de interrupción 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 } }

Page 13: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 13

Ejercicio 1 - Realice un Programa que genere una señal cuadrada a través 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 duración es de 1 ms. Utilice la interrupción externa.

Ejercicio 2 - Realizar un Programa que permita controlar la velocidad de un motor de CD mediante la modulación 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 botón. Al llegar al 100% de velocidad si se pulsa nuevamente el BOTON regresara al estado inicial de PARO (Velocidad 0%).

TAREA

Page 14: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 14

TEMPORIZADORES Los PIC16F87X disponen de tres temporizadores (sin contar el WDT) que son el TMR0, TMR1, TMR2. Las características de cada uno se listan a continuación. Características 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 señal de reloj externa

- Dispone de una interrupción por desbordamiento al pasar de FFh a 00h

Page 15: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 15

- Selección de flanco ascendente o descendente para el flaco del reloj externo

Características 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 señal de reloj externa

- Dispone de una interrupción por desbordamiento al pasar de FFFFh a0000h

Características 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 señal de reloj externa

- Dispone de una interrupción al coincidir TMR2 y PR2

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 señalizador TOIF (bit 2 del registro INTCON).

Los impulsos aplicados al TMR0 pueden provenir de los pulsos aplicados al pin TOCK1 o de la señal 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 Instrucción (Fosc/4) y cuando el registro se desborde provocará una interrupción (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 interrupción (opcional). T0SE es el Bit4 del Registro

Page 16: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 16

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 comúnmente 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 configuración queda básicamente 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 instrucción 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 asignación del Prescaler

1 = Divisor asignado al WDT

0 = Divisor asignado al TMR0

Bit 2-0: PS2, PS1, PS0: Selección del prescaler (divisor de frecuencia), el valor del prescaler se selecciona mediante la combinación de los bit PS2: PS0, tal como se muestra en la siguiente tabla

PS2 PS1 PS0 División del TMR0 División del WDT NOTA: La Sincronización del genera un pequeño retraso de 2 ciclos de instrucción mientras sincroniza el prescaler con el reloj interno.

Page 17: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 17

Como hacer una temporización con el registro TMR0 El tiempo empleado en una temporización se puede calcular a partir de un ciclo de instrucción (es decir 1 instrucción por cada microsegundo, si estas trabajando con un XT de 4 Mhz), también 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 ecuación que permite realizar el cálculo es la siguiente:.

Temporización = 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 ecuación anterior:

Temporización = Tins x Prescaler x (256- valor de TMR0)

500 = 1 x 2 x (256 – valor de TMR0)

Despejando:

Valor de TMR0= 256 – (500/2) = 6

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 utilización 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 instrucción 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 instrucción permite cargar un valor (inicial) al TIMER0

Page 18: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 18

Los distintos modos se pueden agrupar mediante el empleo del símbolo ¦. setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_2);

Page 19: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 19

EJEMPLO – Configure el TIMER0 para que trabaje como temporizador, con un prescaler de 4, e inicialícelo con un valor de 0x25. void main() { setup_timer_0(RTCC_INTERNAL | RTCC_DIV_4); set_timer_0(0x 25); }

EJEMPLO – Generar una señal cuadrada de 1 KHz con un ciclo de trabajo del 50%, utilizando la interrupción 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 Temporización = Tins x Prescaler x (256- valor de TMR0)

500 = 1 x 2 x (256 – valor de TMR0)

Despejando:

Valor de TMR0= 256 – (500/2) = 6

#INCLUDE <16F877.h> #use delay(clock=4000000) #fuses XT,NOWDT,NOLVP, NOPROTECT #use standard_io(B) #int_TIMER0 void TIMER0_interrup(void) { output_toggle(PIN_B0); set_timer0 (27); //Se carga elTIMER0 con el valor inicial } void main() { setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); //Configuración timer0 set_timer0 (27); //Carga del timer0 enable_interrupts (INT_TIMER0); //Habilita interrupción timer0 enable_interrupts (global); //Habilita interrupción general while (1) //bucle infinito { ; }

}

Page 20: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 20

En la siguiente figura se muestra el circuito con el programa cargado. Se utiliza el COUNTER TIMER en el modo de frecuencímetro 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 Botón de SETUP que permita seleccionar el parámetro a cambiar: hrs, min o seg, y otro el Botón 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.

Page 21: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 21

Reloj digital en operación.

Al presionar el botón SETUP permite seleccionar y modificar el valor de la hr, min, y seg.

Page 22: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 22

EL USART: Universal Synchronous Asynchronous Receiver Transmitter Los PIC16F87X dispones de un modulo USART capaz de soportar la comunicación serie síncrona y asíncrona. El USART llamado SCI (Serial Comunications Interface), puede funcionar como un sistema de comunicación bidireccional asíncrono, adaptándose a multitud de periféricos y dispositivos que transfieren información de forma serial, tales como una PC, instrumentos de medición, monitores CRT, etc. También puede trabajar en modo síncrono unidireccional para soportar periféricos como memorias, conversores, etc. En resumen, el USART puede trabajar de tres maneras: 1) Asíncrona (Bidireccional) 2) Síncrona-MAESTRO (Unidireccional) 3) Síncrona-ESCLAVO (Unidireccional) En el modo asíncrono, la comunicación serie del USART en los PIC16F87X esta soportada por las líneas RC6/TX/CK y RC7/RX/DT por las cuales entran y salen los bits a una frecuencia controlada internamente por el USART. En el modo síncrono, los bits de información se transmiten en ambos sentidos por la línea DT a la frecuencia de los impulsos que genere el maestro por la línea CK. Es decir en este modo de trabajo se tienen dos posibles formas de configuración: como MAESTRO y como ESCLAVO. En el modo

MAESTRO la transmisión y recepción no tienen lugar al mismo tiempo, cuando se transmite un dato, la recepción es inhabilitada y viceversa.

MODO ASINCRONO

TRANSMISOR RC6/TX/CK

RECEPTOR RC7/RX/DT

USART

PERIFÉRICO RS232-C TX RX

TX RX

PIC16F87X

Page 23: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 23

Figura x.x Posibles formas de trabajo al utilizar el modulo USART de los PIC16F87X.

Dada la importancia del protocolo asíncrono del USART, nos vamos a enfocar el estudio del modo de comunicación asíncrona. En esta forma de comunicación serie, se usa la norma RS-232-C, donde cada palabra de información o dato se envía independientemente de los demás. Suele constatar de 8 o 9 bits y van precedidos por un bit de START (inicio) y detrás de ellos se coloca un bit de STOP (parada), de acuerdo con las normas del formato estándar 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 asíncrono son:

- Circuito de Muestreo - Generador de Baudios - Transmisor Asíncrono - Receptor Asíncrono

El circuito de muestreo es un circuito que actúa sobre la patita RC7/RX, que es por donde se reciben los bits de información o control y se encarga de muestrear tres veces su valor, para decidir este por mayoría. Generador de Baudios Para el protocolo asíncrono 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. Según este bit se obtendrá el valor de una constante K necesaria en la determinación de la frecuencia de funcionamiento.

RELOJ RC6/TX/CK

DATOS RC7/RX/DT

USART

CK CK

DT DT

PIC16F87X

RELOJ RC6/TX/CK

DATOS RC7/RX/DT

USART

PIC16F87X MODO SINCRONO

MAESTRO

ESCLAVO

Page 24: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 24

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 ecuación 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 asíncrono 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 cálculos para el valor de la frecuencia de operación del USART, para las frecuencias de trabajo (XT) mas comunes.

Page 25: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 25

Page 26: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 26

Transmisor Asíncrono La figura muestra el diagrama por bloques de la sección de transmisión del USART en modo asíncrono.

El dato que se desea transmitir por el USART se deposita en el registro TXREG y a continuación se Traspasa al registro de desplazamiento TSR, que va sacando los bits secuencialmente y a la frecuencia establecida. Además, antes de los bits del dato de información incluye un bit de INICIO y después de sacar todos los bits añade un bit de PARADA. El USART receptor recibe, uno a uno, los bits, elimina los de control y los de información una vez que han llenado el registro de desplazamiento RSR los traslada automáticamente al registro RCREG, donde quedan disponibles para su posterior procesamiento. Cuando se escribe otro dato sobre TXREG, el señalizador TXIF se pone a 0. El bit TRMT sirve para indicar el estado del registro TSR y vale 1 cuando esta vacío. La secuencia de pasos a seguir para una transmisión en el USART es la como sigue: 1. Configurar las líneas 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 asíncrono.

3. Si el dato consta de 9 bits, en lugar de los 8 típicos, 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 transmisión con TXEN = 1(TXSTA). El bit TXIF tendrá valor 1; ya que TXREG se encuentra

vacío.

6. Cargar en TXREG el dato a transmitir. Comienza la transmisión.

Page 27: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 27

Los registros de control del USART son el TXSTA (Registro y estado de control Receptor) y el RCSTA (Registro y estado de control Receptor).

Registro de Estado y Control TXSTA (Transmisor)

bit 7 CSRC: bit de selección de reloj

Modo asíncrono: no incluye Modo síncrono 1 = Modo maestro (reloj generado internamente desde BRG) 0 = Modo esclavo (reloj generado por una fuente externa)

bit 6 TX9 : Habilita el bit 9 de transmisión 1 = Selecciona transmisión de 9 bits 0 = Selecciona transmisión de 8 bits

bit 5 TXEN: Activa la transmisión 1 = Transmisión activada 0 = Transmisión desactivada Nota: SREN/CREN anula TXEN en modo síncrono.

bit 4 SYNC: Bit de selección del modo del USART 1 = Modo síncrono 0 = Modo asíncrono

bit 3 No implementado: Leído como '0' bit 2 BRGH: Bit de selección de la velocidad de baudios

Modo asíncrono: 1 = Alta velocidad 0 = Baja velocidad Modo Síncrono: No se usa en este modo

bit 1 TRMT: Bit de estado del registro de desplazamiento de transmisión

1= TSR vacío 0 = TSR no vacío

bit 0 TX9D: Bit 9 del dato a transmitir (puede ser el bit de paridad)

Page 28: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 28

Registro de estado y Control RCSTA (Receptor)

bit 7 SPEN: Habilitación del puerto serie

1 = Puerto serie habilitado (configura patillas RC7/RX/DT y RC6/TX/CK para el puerto serie) 0 = Puerto serie deshabilitado

bit 6 RX9: Habilita el bit 9 de recepción 1 = Selecciona recepción de 9 bits

0 = Selecciona recepción de 8 bits bit 5 SREN: Configura la recepción sencilla

Modo asíncrono no incluye Modo síncrono maestro 1 = Habilita recepción sencilla 0 = Deshabilita recepción sencilla Modo síncrono esclavo no se utiliza

bit 4 CREN: Configura la recepción continua Modo asíncrono: 1 = Habilita modo de recepción continua 0 = Deshabilita recepción continua Modo síncrono: 1 = Habilita recepción continua hasta que el bit CREN es borrado 0 = Deshabilita recepción continua

bit 3 ADDEN: Detección de dirección Modo asíncrono con 9 bits (RX9 = 1): 1 =Activa la detección de dirección, activa la interrupción y descarga el buffer de recepción al activarse RSR<8> 0 =Desactiva la detección de dirección, todos los bits son recibidos y el bit 9 puede ser utilizado como bit de paridad

bit 2 FERR: Bit de error de trama 1 = Error de trama (puede ser actualizado leyendo el registro RCREG y recibir el siguiente dato válido 0 = No hay error de trama

bit 1 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

bit 0 RX9D: Bit 9 del dato recibido (Puede ser el bit de paridad)

Page 29: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 29

Receptor Asíncrono La figura muestra el diagrama de bloques de la sección receptora del USART

Los datos se reciben en serie, bit a bit, por la línea RC7/RX/DT y se van introduciendo secuencialmente en el registro de desplazamiento RSR que funciona a una frecuencia 16 veces más rápida 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 información se colocará en el bit RX9D del registro RCSTA. Una vez que el modo asíncrona sido seleccionado, la recepción es habilitada colocando a el bit CREN = 1 (RCSTA<4>). Después de detectar el bit de parada el dato presente en RSR es transferido al registro RCREG ( si es que está vacío). Si la transferencia ha sido completada con éxito el RCIF (PIR1<5>) es puesto a 1-lógico. El bit RCIF solo es de lectura y colocado a 0-lógico por hardware ; es decir cuando el registro RCREG esta vacío. La siguiente es la secuencia de pasos a realizar para configurar la recepción asíncrona: 1. Inicializar el registro SPBRG con el valor apropiado que genere los baudios necesarios. No olvide colocar

un valor al bit BRGH en función a si va o no a transmitir en alta velocidad.

2. Habilite la puerta serial asíncrona 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 recepción del noveno bit. El noveno bit

se colocará en RX9D (RCSTA)

4. Habilite la recepción 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 algún error resetee el bit CREN, es decir CREN = 0 .

Page 30: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 30

COMUNICACIÓN SERIE EL USART EN C: Universal Synchronous Asynchronous Receiver Transmitter Configuración genérica del USART: #USE RS232(opciones) Esta directiva permite configurar varios parámetros del USART: velocidad de transmisión, pines utilizados, etc. Se puede modificar en cualquier parte del programa, pero siempre después 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 configuración se indican en la siguiente tabla:

BAUD= X Velocidad de baudios.

XMIT= pin Pin de transmisión.

RCV= pin Pin de recepción.

PARITY= X Donde X puede ser N, E u O.

BITS= X 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 recepción y envió de datos se encuentran:

c = GETC() c = GETCH() c = GETCHAR()

Estas funciones esperan un carácter por la patilla RCV del dispositivo RS232 y retorna el carácter recibido.

Hay otra función que se puede utilizar también para la recepción de datos que es:

GETS(char *string)

Esta función 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 transmisión de datos se cuenta con las funciones:

Page 31: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 31

PUTC(dato) PUTCHAR(dato)

Donde dato es un carácter de 8 bits. Estas funciones envían el carácter por el pin XMIT.

Cuando se quiere transmitir más de un carácter se se pueden utilizar las funciones:

PUTS(string)

Esta función envía cada carácter de string a la patilla XMIT del dispositivo.

PRINTF(string, dato)

Esta función envía cada carácter 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 (máximo 10 caracteres) y pulsa enter:”);

gets (nombre);

printf (lcd_putc,“ Nombre:”);

lcd_gotoxy(1,2);

printf (lcd_putc,“ %s”, nombre);

}

Page 32: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 32

CONEXIÓN DE UN MICROCONTROLADOR A UNA PC

El puerto serie de una PC normalmente tiene un conector DB9, mediante el cual permite una establecer una comunicación serie de datos, bajo la norma RS-232 (RS-232C).

Tabla de conexión:

Número de PIN Nombre

1 CD: Detector de transmisión

2 RXD: Recibir datos

3 TXD: Transmitir datos

4 DTR: Terminal de datos lista

5 GND: Señal de tierra

6 DSR: Ajuste de datos listo

7 RTS: Permiso para transmitir

8 CTS: Listo para enviar

9 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

Page 33: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 33

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 carácter a través del puerto serie, una vez que recibe el carácter lo muestra en el LCD y envía el mensaje de "Recibido" a la PC.

PIC

16

F87

7

RX

TX

MCLR

OSC1

OSC2

Vss VDD

2

2

3

5

3

5

Page 34: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 34

#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); } }

Page 35: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 35

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 envía por el puerto serie, el micro la recibe y envía 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 envía un mensaje de recibido, ver figura siguiente:

Page 36: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 36

Ejemplo.- E siguiente Programa que envía a través del puerto serie un mensaje para que el usuario introduzca su nombre y lo envíe a través 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); }

Page 37: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 37

Page 38: INTERRUPCIONES Y TEMPORIZADORES

MICROCONTROLADORES

Raúl Alvarado Guerra Página 38

TAREA Realizar un Programa que lea el valor de un canal analógico y lo muestra en un LCD, además lo debe de enviar a una PC a través del puerto Serie (USART). El circuito debe contener un multimetro que muestre el voltaje de la entrada analógica para verificar