Sistemas Electrónicos Digitales HOJA 1 Dpto. Ingeniería Electrónica, Universidad de Sevilla 2 de febrero de PROBLEMA: tiempo 2:00 horas

Documentos relacionados
MICROCONTROLADORES PIC

Sistemas Electrónicos Digitales - Diciembre 2011 Problema

Microprocesadores. Temporizadores / Contadores. Prof. Luis Araujo. Universidad de Los Andes

El TIMER 1. (c) Domingo Llorente

Aplicaciones de mc Lenguaje C- CC5x-Temporizadores

PIC16F882/883/884/886/ Funcionamiento de Timer1 6 EL MODULO TMR1 CON PUERTA DE CONTROL Selección de Fuente de reloj

Temporizadores/Contadores

RB0 RB1 RB2 RB3 RB4 RB5 RB6 RB7 PIC 16F87X. Figura # 1

PIC 18F45XX EL TIMER 0

PRÁCTICA 5: Medida del tiempo en un PIC

Capítulo 1. Práctica: Comunicación SPI Enunciado Especificaciones

Una vez comprendido el funcionamiento teórico del dispositivo SRF04 el

MICROCONTROLADORES. 1. El PIC 16F84A es un microcontrolador de: a) 16 bits b) 8 bits c) 4 bits d) 32 bits e) 64 bits

Teclado Matricial. Ing. Diego Chacón

PIC16F88. Características

VDD (varios) VSS (varios) OSC_IN OSC_OUT OSC_OUT PB12. Analógica

MÓDULO Nº7 REGISTROS Y CONTADORES

UNIVERSIDAD DE CASTILLA LA MANCHA ESCUELA SUPERIOR DE INFORMÁTICA. CIUDAD REAL

Módulos CCP. Registro de captura Registro de comparación Registro de ciclo de servicio PWM

Medidas de Distancia mediante Rayos Infrarrojos

ATE-UNIOVI ATE-UNIOVI ATE-UNIOVI ATE-UNIOVI ATE-UNIOVI ATE-UNIOVI

El modo TIMER, (contador de tiempos) es seleccionado poniendo a cero el bit de T0CS (OPTION<5>).

17 Con el chorro de agua pequeño, la cubeta se llena en 10 minutos

MICROCONTROLADOR PIC DE MICROCHIP

TEMPORIZADOR 1, 2, 3, 4, 5, 6, 7, 8,... Registro de conteo de pulsos

Este apunte contiene los problemas para el segundo práctico de Digital II.

ESTRUCTURA DE COMPUTADORES I (Capítulo 16:El Teclado) 1/5 16-EL TECLADO

TUTORIAL Teclado matricial. Manejar teclados matriciales por el método RWR. Conocer el uso y la utilidad de las Pull-Up del puerto B.

TUTORIAL. Hacer uso de las interrupciones. Conocer el problema de los rebotes en los pulsadores y plantear algunas formas de solucionarlo.

Examen 5 de Febrero de 2010

Examen 22 de Febrero 2006

Resumen. Palabras clave: PIC18F2550, temporizador, retardo.

Problemario Electrónica Digital

4.4 Interrupciones RBI (Interrupciones por cambio de estado)

Ejercicios de repaso. 1.- Diseñe un contador asíncrono ascendente módulo 16 utilizando 74XX76. Debe poseer RESET externo.

Microchip Tips & Tricks...

Electrónica Digital II. Contadores

LABORATORIO DE ELECTRÓNICA DE POTENCIA PRÁCTICA N 3

C2. Explica que es una MACRO en lenguaje C y para que se emplean. (0.5 puntos).

Indice general. 1.- Qué es programación? Con qué se programa? y 4

TIMER0 (T0) TMR0 (01h,101h)

Capítulo 1. Práctica: Display alfanumérico Objetivo Especificaciones Para sacar nota

TEMA 8. REGISTROS Y CONTADORES.

PRÓLOGO Este apunte contiene los problemas para el segundo práctico de Digital II.

PROYECTO DE DISEÑO 2 INFORMACIÓN PRELIMINAR

CURSO BÁSICO MICROCONTROLADORES PIC

RECURSOS FUNDAMENTALES

Universidad Tecnológica Nacional Departamento De Electrónica Facultad Regional Buenos Aires. Informática II GUIA DE TRABAJOS PRACTICOS

Capítulo 4 Desarrollo del proyecto

PIC MICRO ESTUDIO Tres Timers ajustables de 0 a 60 Seg 3 Timer Es Clave:

Carrera: Técnico Superior en Técnicas Digitales. Alumnos: Emiliano Teseo y José Luis Fernández

Examen 23 de Diciembre de 2011

Estructura de Microprocesadores. Profesor Ing. Johan Carvajal Godínez

CUESTIÓN 1 (2.5 puntos)

UNIVERSIDAD CARLOS III DE MADRIID

MICROCONTROLADORES PIC BÁSICO (PIC 16F84A / 16F627)

Practica 1 (3.5 %) 1. Realice el diseño y montaje de un R_S discreto activo en bajo.

Segundo Parcial Programación en Mikro C PIC16F877

Desarrollo de Productos Electrónicos

UNIVERSIDAD CARLOS III DE MADRID. Ejercicios de VHDL. Circuitos Integrados y Microelectrónica. Luis Entrena. Celia López.

YK-368 ofrece códigos de multi-usuario o código de usuario único, y proporciona la introducción del código manual o la introducción del auto código.

PRÁCTICA 6: Gobierno del display 7 segmentos

Universidad Carlos III de Madrid Electrónica Digital Ejercicios

Oscilador sinusoidal incrustado de 1 a 150 Hz.

Capítulo 4 Interfase Humana

Elementos de un programa en C

PROBLEMA 1 (5 puntos):

Lección 2 Introducción al lenguaje C

PIC 18F45XX. El módulo CCP de Comparación, Captura y PWM (Pulse Wide Modulation)

Microcontroladores PIC

CONTADORES CARACTERISTICAS IMPORTANTES UTILIDAD CONTADORES DE RIZADO. CONTADOR DE RIZADO MODULO- 16.

U.P.V. - E.H.U. E.U.I. Vitoria-Gasteiz. Ampliación de Sistemas Digitales. Lector de monedas

CURSO: MICROCONTROLADORES UNIDAD 2: MÓDULOS DEL MICRO 16F877- TEORÍA PROFESOR: JORGE ANTONIO POLANÍA 1. TEMPORIZADORES E INTERRUPCIONES

Operación de circuitos electrónicos a equipos de refrigeración y aire acondicionado: CONALEP SLRC DECODIFICADOR

ARQUITECTURA DE SISTEMAS PARALELOS (3º ING. TÉC. INFORMATICA DE SISTEMAS) PRACTICA (CURSO 2004/05) ENTRADA/SALIDA.

Universidad Nacional Autónoma de México

Práctica nº 10. Análisis de flip-flops.

Se trata de generar una señal PWM que salga por PB7, el cual está vinculado al canal 2 del TIM4. Por lo tanto la configuración será como sigue:

Propuesta para la programación básica del Temporizador 1 del microcontrolador PIC18F2550 con el compilador SDCC

SISTEMAS DIGITALES BASADOS EN MICROPROCESADORES

CUESTIÓN (2 puntos): SOLUCIÓN:

APELLIDOS NOMBRE GRADO SOLUCIÓN. Figura 1

HOJA DE PROBLEMAS 8: ELEMENTOS DE MEMORIA

PRÁCTICA 6. CIRCUITOS ARITMÉTICOS

Circuitos Electrónicos. Junio 2006/2007 Problema 1 1º parcial

TEMA 5 LA MEMORIA DE DATOS MEMORIA RAM D.P.E. DESARROLLO DE PROYECTOS 1

PIC 16F87X. Juan González. Escuela Politécnica Superior Universidad Autónoma de Madrid. Flir Networked Systems. Flir Networked Systems

ATE-Universidad de Oviedo

Proyecto final Microcontroladores: Sistema De Seguridad Caja Fuerte Integrantes:

SISTEMAS DIGITALES BASADOS EN MICROPROCESADORES. Examen Ordinario 1

Registros de desplazamiento

TUTORIAL II parte A. Observemos el diagrama de pines del microcontrolador 16F877A:

Laboratorio 8: Controlador VGA

Prof: Zulay Franco Puerto Ordaz, Agosto

Electrónica Digital. La nota final de la práctica será calculada de la siguiente forma:

Informática Ingeniería en Electrónica y Automática Industrial

Microprocesadores. Introducción al Lenguaje C - Parte IV. Prof. Luis Araujo. Universidad de Los Andes

Práctica de Problemas N o 3

Una expresión es una combinación de uno o más operandos y operadores para obtener un resultado.

Transcripción:

stemas Electrónicos Digitales HOJA 1 Dpto. Ingeniería Electrónica, Universidad de Sevilla 2 de febrero de 2012 PROBLEMA: tiempo 2:00 horas APELLIDOS, NOMBRE: Se desea que el PIC16F88 genere un pitido de 5 segundos cuando se pulse la tecla # de un teclado de 4 filas y 3 columnas. El pitido será una onda cuadrada, que atacará directamente un zumbador, en el rango que va desde los 500hz hasta los 2000hz. El valor de la frecuencia anterior se introducirá por teclado y se verá en 4 displays de 7 segmentos. Cada dígito numérico que se teclee se representará en un display de 7 segmentos de forma similar a como se muestran en una calculadora. Cuando se pulse un nuevo número se mostrará en el display de la derecha y los demás correrán una posición a la izquierda. Con la excepción del primer dígito de una frecuencia: sustituye el 0 presente en pantalla por dicho número sin realizar ningún desplazamiento. Una vez que se hayan introducido 4 números ya no aceptará ninguno más y sólo atenderá a la teclas borrar (*) y procesar (#). Estas dos teclas -de función- que tiene el teclado realizarán las siguientes tareas: o La tecla (#) inicia un pitido de 5 segundos si la frecuencia programada es mayor o igual a 500hz y menor o igual a 2000hz. En caso contrario genera un pitido grave de una frecuencia de 100hz. o La tecla (*) borrará el contenido de los displays de forma que se verá el número cero en el display de la derecha (valor menos significativo) y los otros tres estarán apagados. Además, si estuviera sonando un pitido durante 5 segundos lo pararía instantáneamente. Se pide: 1. Dibujar el esquema del circuito de forma que se reduzca al máximo el número de dispositivos externos necesarios y rellenar la siguiente tabla. [1 punto] Pin E/S Objetivo Pin E/S Objetivo RA0 S Fila 1 del teclado RB0 S dato0 para los displays RA1 S Fila 2 del teclado RB1 S dato1 para los displays RA2 S Fila 3 del teclado RB2 S dato2 para los displays RA3 S Fila 4 del teclado RB3 S dato3 para los displays RA4 S Señal cuadrada para el pitido RB4 S Control diplay unidades RA5 E Columna 1 del teclado RB5 S Control diplay decenas RA6 E Columna 2 del teclado RB6 S Control diplay centenas RA7 E Columna 3 del teclado RB7 S Control diplay unidades de millar 2. Diseñar la rutina ProcesarTecla. la tecla pulsada es * hará que el display se ponga a cero (3 displays apagados y el de la derecha mostrará el 0) y pararía un pitido si estuviera sonando en ese momento, si la tecla pulsada es # hará que suene un pitido de la frecuencia indicada por los displays siempre que el número esté dentro del rango anteriormente indicado. es una tecla numérica la procesará para que sea visible en los displays (se ignora la 5º pulsación o sucesivas de teclas numéricas). Esta rutina llamará a dos rutinas llamadas iniciarpitido() y pararpitido() que realizan las tareas que sus propios nombres indican. [Diagrama de flujo: 1.5 puntos y lenguaje C: 0.5 puntos]

stemas Electrónicos Digitales HOJA 2 Dpto. Ingeniería Electrónica, Universidad de Sevilla 2 de febrero de 2012 PROBLEMA (entregar esta hoja aparte) APELLIDOS, NOMBRE: 3. Estructura principal del programa: diagrama/s de estado/s. Explicar el objetivo de cada uno de los estados y realizar el diagrama de flujo de cada uno de ellos. [1 punto] 4. Diagrama de flujo de la rutina que gestione los displays. [1 punto] 5. Añadirle a la gestión de los displays un efecto óptico de parpadeo de manera que durante los 5 segundos que suena un pitido el número mostrado en los displays (entre 200hz y 2000hz) parezca que está parpadeando. Para conseguir tal fin los 4 dígitos estarán de forma repetitiva- visibles durante 20 décimas de segundo y apagados durante otras 20 décimas de segundo mientras dure el pitido. Explicar como se va implementar. Dibujar los diagramas de flujo de las rutinas que fueran necesarias. [2 puntos] 6. Gestión del pitido explicando claramente qué temporizador se utilizará y como se configurará. Diagramas de flujo de las rutinas necesarias para esta tarea así como de las rutinas iniciarpitido() y pararpitido() citadas en el apartado 2. [3 puntos] NOTA: La hoja 1 del enunciado con nombre y apellidos- y las respuestas a las dos preguntas que aparecen en dicha hoja se entregarán por un lado. La hoja 2 del enunciado con nombre y apellidosjunto con las respuestas de dicha hoja (de la 3 a la 6) se entregarán en otro montón diferente. NOTA: Las dos hojas del nombre llevarán el nombre del alumno en el orden indicado: primero los apellidos y después el nombre separados por una coma. Es importante este orden ya que los exámenes se ordenan por apellidos.

Solución Punto 1 (1 punto) Se necesitan 8 pines para los 4 displays (compartirán pines; 4 pines para datos y 4 para control), 7 pines para el teclado (4 filas y 3 columnas) y 1 pin para generar la señal cuadrada que será el pitido. De todos estos pines solo las 3 columnas del teclado son de entrada y el resto son de salida. En total se necesitan 16 pines que son los que tiene disponibles el PIC16F88 utilizando los puertos A y B. Habrá que programar la palabra de configuración del 16F88 para que los pines RA5 (MCLR), RA6 y RA7 dejen sus funciones específicas (reset y oscilador) para pasar a ser pines digitales de propósito general. El pin para el pitido puede ser cualquiera. Solo basta un temporizador que genere una interrupción al doble de frecuencia de la onda cuadrada que se quiere diseñar. El pin debe conmutar cada semiperiodo de la señal. tiene porque utilizarse el módulo PWM. Además este módulo no es lo suficientemente lento (configurando el preescaler a 1:16) para generar una señal de 100hz. se usa el TIMER2 lo más interesante sería configurarlo como PWM para generar el pitido entre 500hz y 2000hz -programando los registros PR2 y CCPR1L (sin necesidad de interrupción)- y para generar la señal de 100hz se podría reconfigurar el TIMER2 como temporizador generando una interrupción a 200hz (ahora se puede utilizar, además, el post-escaler)-. En la solución de este ejercicio se ha utilizado el TIMER1 para el pitido ya que su registro de 2 bytes abarca un rango mayor de frecuencias y puede llegar perfectamente desde los 100hz hasta los 2000hz sin necesidad de reconfigurar el preescalador. La conexión del teclado, displays y zumbador (para el pitido) solo presentan una restricción insalvable: el pin RA5 (MCLR) solo es de entrada (no es configurable). Por tanto, las columnas del teclado deberían estar conectadas a los 3 pines más significativos del puerto A. quieren usarse las librerías del teclado los pines de filas y columnas deben estar agrupados al principio o al final de un puerto. En caso contrario habría que diseñar una rutina específica innecesaria en este problema- para realizar el barrido del teclado. La distribución más simple de pines que puede realizarse en este problema sería la siguiente: - conectar los 4 displays al puerto B (de la misma forma a cómo se hizo en clase para aprovechar las rutinas de gestión de los displays que se piden en el apartado 4). - Las 4 filas del teclado a los pines RA0-RA3 - Las 3 columnas del teclado a los pines RA5-RA7 - La señal de salida de frecuencia programable (pitido) en el pin RA4. Esta salida, a diferencia del PIC16F84, no es a drenador abierto. Por tanto, no necesita una resistencia de pull-up cuando se configura de salida. En la siguiente figura se muestra el esquema del circuito.

Pitido: 4 displays+teclado C1 C2 C3 Los displays tiene por defecto los valores: - Von= 1.5V - Ion= 5mA C3 C2 C1 16 15 4 U1 RA7/OSC1/CLKIN RA0/AN0 RA6/OSC2/CLKOUT RA1/AN1 RA2/AN2/CVREF/VREF- RA5/MCLR RA3/AN3/C1OUT/VREF+ RA4/AN4/T0CKI/C2OUT PIC16F88 CLOCK=8MHz PROGRAM=pitido.COF RB0/INT/CCP1 RB1/SDI/SDA RB2/SDO/RX/DT RB3/CCP1 RB4/SCK/SCL RB5/SS/TX/CK RB6/AN5/T1OSO/T1CKI RB7/AN6/T1OSI 17 F1 18 F2 1 F3 2 F4 3 6 7 8 9 10 11 12 13 RB0 RB1 RB2 RB3 RB4 RB5 RB6 RB7 RA4_pitido LS1 SOUNDER 2 RB7 F1 F2 F3 F4 D1 D2 D3 D4 1N4148 3 1 F1 F2 F3 F4 A B C D U2 2N7000 1 2 3 1 2 3 4 5 6 7 8 9 0 # RB6 R2 25 RB5 R3 10k C1 RA4_PITIDO R4 10k C2 A B C D RB4 R5 10k C3 RB0 7 RB1 1 RB2 2 RB3 6 4 5 3 U3 A B C D BI/RBO RBI LT 7447 QA QB QC QD QE QF QG 13 12 11 10 9 15 14 Q[1..7] E l e c t r o n i c s Autor: R. Millán Pitido: 4 displays+teclado Departamento de Ingeniería Electrónica stemas Electrónicos Digitales Email: rmillan@us.es WWW: http://www.dinel.us.es/ Punto 2 (2 puntos) ProcesarTecla(tecla) Es incorrecta la tecla pulsada? tecla > 11? tecla = 11? Tecla pulsada = '#'? Calcula la frecuencia con los valores almacenados en los dígitos tecla = 10? Tecla pulsada = '*'? Prepara para que se ponga a 0 Se han introducido ya los 4 dígitos? frecuencia= DisplaysDigitos[3]*1000 + DisplaysDigitos[2]*100 + DisplaysDigitos[1]*10 + DisplaysDigitos[0] 500 <=frecuencia<=2000? frecuencia= 100 DisplaysDigitos[3]=0000 0000 DisplaysDigitos[2]=0000 0000 DisplaysDigitos[1]=0000 0000 DisplaysDigitos[0]=0000 0000 DisplaysEstado[1] = 00010000 pararpitido() DisplayEstado[1]= 11110000? DisplaysEstado[0](5) == 0 AND DisplaysDigitos[0]= 00000000? DisplaysDigitos[3]=DisplaysDigitos[2] DisplaysDigitos[2]=DisplaysDigitos[1] DisplaysDigitos[1]=DisplaysDigitos[0] DisplaysDigitos[0]=tecla hay solo un dígito visible y su valor es 0? Se introduce el nuevo número a la derecha. Desplazar el contenido de los displays. tecla=0? DisplaysDigitos[0]=tecla iniciarpitido() DisplaysEstado[1] << 1 DisplaysEstado[1] = 00010000 Primer dígito introducido RTS Se desplaza la variable una posición a la izquierda Se pone a 1 el bit 4 de la variable.

// ===================================== void procesartecla(byte tecla) // ===================================== if (tecla<0 tecla > 11) return; switch (tecla) // Se ha pulsado '*' case 10: displaysdigitos[0]= 0; // El dígito de las unidades será 0 displaysdigitos[1]= 0; // El dígito de las decenas será 0 displaysdigitos[2]= 0; // El dígito de las centenas será 0 displaysdigitos[3]= 0; // El dígito de las u.millar será 0 displaysestado[1]=0b00010000; // Solo visible el dígito de las unidades pararpitido(); break; // Se ha pulsado '#' case 11: // Calculamos la frecuencia a partir de los dígitos de los displays frecuencia= (int)displaysdigitos[3]*1000 + (int)displaysdigitos[2]*100 + (int)displaysdigitos[1]*10 + (int)displaysdigitos[0]; if (frecuencia<500 frecuencia > 2000) frecuencia= 100; iniciarpitido(); break; // Se ha pulsado una tecla numérica entre el 0 y el 9 default: // Ya se han introducido los 4 digitos -> salir sin hacer nada if (displaysestado[1]== 0b11110000) break; // aun no se ha introducido las decenas y el // dígito de las unidades toma el valor 0 if ( ((displaysestado[1] & BIT5) == 0) && displaysdigitos[0]==0) displaysdigitos[0]=tecla; else // desplazamos los digitos una posición a la izquierda displaysdigitos[3]= displaysdigitos[2]; displaysdigitos[2]= displaysdigitos[1]; displaysdigitos[1]= displaysdigitos[0]; displaysdigitos[0]= tecla; displaysestado[1] = displaysestado[1] << 1; displaysestado[1] = BIT4; // del case // de la rutina

Punto 3 (1 punto) La división de un sistema en varios procesos tiene razón de ser cuando estos son casi independientes. Como mucho la interrelación entre procesos puede llegar a que un proceso dispare a otro pero no se inmiscuirá en el funcionamiento interno de éste. En la mayoría de los casos la división de un sistema en varios procesos se debe a cómo el micro atiende a las diferentes señales de entrada que le llegan. En este problema solo las 3 columnas del teclado son de entrada por lo que un proceso para el teclado es el único proceso que se necesita. C3,C2,C1 = 111 Reposo Entradas: [C3,C2,C1]=[RA7,RA6,RA5] C3,C2,C1 <> 111 C3,C2,C1 = 111 Espera C3,C2,C1 <> 111 Mientras no se pulse ninguna tecla, las columnas (entradas para el 16F88) están en su valor de reposo (nivel alto). se pulsa una tecla, la columna correspondiente pasa a 0 lógico y el sistema cambia al estado espera. Permanecerá en este estado mientras la tecla continúe pulsada.

Punto 4 (1 punto) La rutina que rota los displays se llamará dentro de una interrupción periódica cada 8ms. La rutina de interrupción periódica se detallará en el apartado 5 incluyendo la opción del parpadeo. Esta rutina es la de la práctica de la rotación de los displays. Punto 5 (2 puntos) // Interrupción debida al desbordamiento de TMR0 if(tmr0ie && TMR0IF) // Decrementamos cuenta5seg_tmr0 y si vale 0 -> 5 segundos. Se para el pitido // Esta variable se inicia a 625 en la rutina iniciapitido(). if (cuenta5seg_tmr0 > 0) --cuenta5seg_tmr0; if (cuenta5seg_tmr0 <= 0) // Han pasado los 5 segundos? TMR1IE=0; //. Para el Timer1 (genera pitido: onda cuadrada en RA4) TMR0 = TMR0_carga; // Preparamos TMR0 TMR0IF = 0; // Bajamos la bandera que originó la interrupción (flanco bajada en TMR0IF) if (++cuentaparpadeo_tmr0>50) // T<0,1seg -> cuentaint=0 todo el tiempo cuentaparpadeo_tmr0=0; // está activa TMR1 (generando el pitido) y cuentaparpadeo es > 25 -> apagados los displays if (TMR1IE==1 && cuentaparpadeo_tmr0<25) PORTB&= 0b00001111; // [RB7:RB4]= 0000. Se apagan los 4 displays en el parpadeo else //--------------- rotar4displays(); //--------------- La interrupción del Timer0 se programará cada 8ms. Temporizará 3 cosas: - Rotación de los displays. - Parpadeo cada 0,2seg. - 5 segundos del pitido. Se utilizará la variable global cuentaparpadeo_tmr0 (de tipo unsigned char) que se incrementará en esta interrupción. Cada 25 incrementos equivalen a 0,2 segundos. el pitido está en marcha (TMR1IE=1) y la variable cuentaparpadeo_tmr0<25 entonces los displays se apagan durante 0,2seg. En caso

contrario (no hay pitido o la cuenta está entre 25 y 50) los displays rotan normalmente. La variable global cuenta5seg_tmr0 (de tipo unsigned char) se le asigna un valor inicial de 625 en la rutina iniciarpitido(). En cada interrupción se decrementa. Cuando llegue a 0 (625*8ms=5segundos) finaliza el pitido desactivando la interrupción del timer1 (TMR1IE=0). Punto 6 (3 puntos) // Interrupción debida al desbordamiento de TMR1 if(tmr1ie && TMR1IF) TMR1IF=0; // baja la bandera TMR1H= TMR1H_copia; // Prepara la nueva TMR1L= TMR1L_copia; // cuenta // Conmutamos el pin al llegar a un // semiperiodo (desbordamiento de TMR1) RA4=!RA4; void pararpitido() // Deshabilitamos TMR1 (genera el pitido) TMR1IE= 0; // PIE1<1> ='0'. PEIE= 0; // INTCON<6>='0'. TMR1ON= 0; RA4= 0; cuenta5seg_tmr0=0; void iniciarpitido() unsigned int semiperiodo_us, TMR1; cuenta5seg_tmr0= 625; // ------------------------------------------------ // Configura y activa TIMER 1 (cálculo del // semiperiodo, doble frecuencia) // ------------------------------------------------ // semiperiodo_us= 4.Tosc.(65536-TMR1).Preescalador // si Preescalador=1:2, Fosc=8Mhz -> Tosc=0.125us // semiperiodo_us= 65536-TMR1 // // TMR1= 65536 semiperiodo_us (TMR1 son 2 bytes) // // periodo_us= 1e6 (us/1seg) * 1/frec (seg) = 1000000/frec (us) // semiperiodo_us= periodo_us/2= 500000/frec (us) // // Ejemplos: // f= 100hz -> semiperiodo_us= 500000/100 =5000us -> TMR1=65036 // f=1000hz -> semiperiodo_us= 500000/1000= 500us -> TMR1=60536 // ------------------------------------------------ semiperiodo_us =(int) ( (unsigned short long)500000/frecuencia ); TMR1= (65535-periodo_us)+1; // 65536= 65535+1 TMR1H= (TMR1 >> 8) & 0x00FF; TMR1L= TMR1 & 0x00FF; La parte de la rutina de interrupción correspondiente al Timer 1 que es el encargado del pitido es muy simple: (a) bajar la bandera, (b) preparar la nueva cuenta, y (c) conmutar el pin. La rutina pararpitido solo tiene que bloquear la interrupción del timer 1 (TMR1IE=0) para que el pin RA4 deje de parpadear. Este bit de máscara, además, es consultado en la interrupción del Timer 0 provocando la parada del parpadeo. Opcionalmente puede desactivarse el Timer 1 pero no es necesario (TMR1ON=0). También pone a 0 la variable cuenta5seg_tmr0 lo que hace que se ignore la cuenta de 5 segundos en la interrupción del Timer 0. De la rutina iniciarpitido lo más complicado es el cálculo de TMR1H y TMR1L para que se adapten a la frecuencia programada. La interrupción generada por el timer 1 será cada semiperiodo de la onda cuadrada para poder conmutar el pin en la rutina de interrupción. Dado que el micro tiene como base de tiempo el microsegundos (Fosc=8Mhz -> Tosc=0.125us) haré los cálculos en microsegundos. la frecuencia está en herzios, el periodo en microsegundos será (1/f)*1e6 (us). El semiperiodo será la mitad: semiperiodo_us= 500000/frec (us) Tomando como Preescalador la opción 1:2. TMR1H_copia= TMR1H; // Para la interrupción TMR1 TMR1L_copia= TMR1L; // Para la interrupción TMR1 // Configuración TMR1. Registro T1CON T1CKPS1=0; // T1CON<5> = '0'. T1CKPS0=1; // T1CON<4> = '1'. Preescalador a 1:2 T1OSCEN=0; // T1CON<3> = '0'. Este bit no es necesario T1SYNC= 0; // T1CON<2>= '0'. ncronismo de reloj externo // (no hace falta ya que el reloj es interno) TMR1CS= 0; // T1CON<1> = '0'. Utiliza Fosc/4 para temporizar TMR1ON= 1; // T1CON<0> = '1'. Activa el TMR1 TMR1IF= 0; // PIR1<0>='0'. Bandera TMR1 inicialmente abajo TMR1IE= 1; // PIE1<0>='1'. Habilita interrupcion TMR1 PEIE= 1; // INTCON<6>='1'. Máscara de interr. de perif. semiperiodo_us= 4.Tosc.(65536-TMR1).Preescalor semiperiodo_us= 4*0.125*(65536-TMR1)*2 semiperiodo_us= 65536-TMR1, despejando: TMR1= 65536 - semiperiodo_us Para operar con los datos anteriores hay que tener cuidado ya que un tipo entero sin signo (2 bytes) solo puede almacenar números entre 0 y 2 16-1, es decir, entre 0 y 65535. Por tanto, ni 65536 ni 500000 caben en una variable de 2 bytes. TMR1(2 bytes)= (65535(2 bytes)-semiperiodo_us)+1