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

Documentos relacionados
Temporizadores/Contadores

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

MICROCONTROLADORES PIC

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

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

Segundo Parcial Programación en Mikro C PIC16F877

PIC16F88. Características

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

RECURSOS FUNDAMENTALES

PIC 18F45XX EL TIMER 0

Interrupciones Fuentes de Interrupciones para el PIC16F1787

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

PRÁCTICA 5: Medida del tiempo en un PIC

TUTORIAL PRIMERA PARTE: GENERACIÓN DE UN RETARDO CON TIMER.

El TIMER 0. (c) Domingo Llorente

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

INTRODUCCIÓN. Comunicación Serial.

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

SISTEMAS ELECTRÓNICOS AVANZADOS. ING. TÉC. INDUSTRIAL ELECTRÓNICO

Microcontroladores PIC

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

Microcontrolador PIC16F84: Arquitectura

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

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

Registros SFR vistos hasta ahora: Microcontroladores PIC

PIC 18F45XX CARACTERÍSTICAS GENERALES

Microcontroladores PIC

COMUNICACIÓN I2C (Bus de circuito inter-integrado)

Diagrama de bloques del sistema

Resumen. Palabras clave: PIC18F2550, temporizador, retardo.

PIC16C5X (GAMA BAJA) Solo en dispositivos de 28 pins. Encapsulado y patillaje:

Taller de Firmware. Introducción al PIC16F877. Facultad de Ingeniería Instituto de Com putación

PROFESOR: Práctica 9. Convertidor Analógico-Digital

CURSO BÁSICO MICROCONTROLADORES PIC

Tema 14. Interrupciones. Las. C. F. G.S. D.P.E. Módulo de Proyectos 1

CAPÍTULO 3. Las principales funciones del microcontrolador son: adquirir por medio del A/D y también, mostrar mensajes de pesos y voltaje en el LCD.

Pines de entrada/salida (I/O) de propósito general. Mediante ellos, el micro PIC puede monitorizar y controlar otros dispositivos.

Dependiendo del dispositivo usado, se tienen hasta 5 puertos de entrada/salida disponibles: PORTA PORTB PORTC PORTD PORTE

Capítulo 1. Introducción a los PIC de 8 bits

Elección de un microcontrolador

Contenido MICROCONTROLADORES PIC16F877A Y PIC16F887 / SALVATIERRA. Alfaomega. 3.4 Soporte Muestras... 25

ÍNDICE CAPÍTULO 1 FUNDAMENTOS DE LOS MICROCONTROLADORES

Manipulación directa de puertos. Usando los puertos digitales.

PROFESOR: Práctica 5. Manejo de Motores

Guía #2 Acceso a registros y uso de puertos.

UNIVERSIDAD NACIONAL DE SAN AGUSTÍN FACULTAD DE INGENIERÍAS DE PRODUCCIÓN Y SERVICIOS ESCUELA PROFESIONAL DE INGENIERIA ELECTRÓNICA

4.4 Interrupciones RBI (Interrupciones por cambio de estado)

Práctica 6. Control de LCD 16x2 con PIC 16F84A.

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

Características PIC16F84

Guía de Microcontroladores

EL módulo conversor A/D. (c) Domingo Llorente

2.2-1 Visión Interna PIC16F873/876. SBM

RESEÑA DE LENGUAJE C

MICROCONTROLADORES II (FAMILIA PIC16F87X) LENGUAJE C PARA PICS

TARJETA DE ENTRADAS Y CONTADORES RÁPIDOS (MTC-3052)

DESARROLLO DE SISTEMAS BASADOS EN MICRONTROLADORES Y DSPs

LOS PIC16F88X: LOS PUERTOS DE E/S

ARQUITECTURA DEL PIC16F84A

Empieza con // y termina con la siguiente línea de código. Son ignorados por el programa y no ocupan espacio en memoria.

MANUAL DEL PIC 16F87X v 1.0

Teclado Matricial. Ing. Diego Chacón

MICROCONTROLADORES : COMPILADOR MPLAB 16FXX, UNA INTRODUCCION. ING. YESID EUGENIO SANTAFE RAMON DOCENTE PROGRAMA DE INGENIERIA ELECTRONICA

MICROCONTROLADORES PIC16F84 ING. RAÚL ROJAS REÁTEGUI

PROFESOR: Práctica 10. Modulación por ancho de pulso (PWM) Emplea un microcontrolador para procesamiento de señales analógicas y digitales

Figura 2. Formato de un dato serie síncrono.

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

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

ITT-327-T Microprocesadores

Diseño de Microcontroladores

SALTOS EN FUNCIONDE UN BIT Aquéllas que pueden producir el salto en función del estado de un bit. Son btfsc y

Programación y Aplicaciones de los Microcontroladores PIC16FXXX (Nivel Básico) ING. EULER DEZA FIGUEROA

Características Técnicas del PIC 16F84

INDICE Capitulo 1. Microcontroladores Programables: La Solución está en un CHIP Capitulo 2. Microcontroladores de 8 BITS: Los <<PIC>>

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

LOS PIC16F87X. Características Generales. IES Juan de la Cierva (Madrid). Desarrollo de Productos Electrónicos

Controladores Lógicos Programables

SISTEMA MÍNIMO BASADO EN EL PIC16F84

PRÁCTICA 4 LOS BITS DE CONFIGURACIÓN DEL PIC16F628

Timer s Escuela Superior de Cómputo IPN. Departamento de Posgrado Dr. Julio Cesar Sosa Savedra curso.escom@yahoo.com

PIC 16F87X TRABAJO EXPLICACIÓN

Temporizadores y contadores en tiempo real: El módulo Timer0 del PIC.

Periféricos: Timer. Cesáreo Fernández Martínez Álvaro Sánchez Miralles

COMUNICACIÓN SERIE ENTRE MICROCONTROLADORES MEDIANTE UART SW

Tema 4. Organización de la memoria

Bach. Pablo Sanabria Campos. Programa de Tecnologías Educativas Avanzadas

Conversores Análogo-Digital

Cartilla para Microcontrolador PIC16F /40 Pin 8-Bit CMOS FLASH.

PIC 16F87X TEMA LA MEMORIA DE DATOS MEMORIA RAM

INTRODUCCIÓN. Interrupciones.

MICROPROCESADORES II LENGUAJE C EN LOS MICROCONTROLADORES PIC

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

Temporizadores y contadores en tiempo real: El módulo Timer0 y el prescaler del PIC

Display 7 segmentos. Ing. Diego Chacón, Mdhd.

Lenguaje C. República Bolivariana de Venezuela Fundación Misión Sucre Aldea Fray Pedro de Agreda Introducción a la Programación III

TEMPORIZADORES Y CONTADORES

FUNCIONES. Identificador valido. Tipo-Funcion Identificador_de_la_funcion (Tipo par1,tipo par2 )

Conceptos básicos de Arduino:

La familia PIC18 USB posee 4 timers: Timer0, Timer1, Timer2 y Timer3, cada uno de los cuales tiene sus características únicas.

Duración: 2 h MCF52221 PTA[2:0] SCL SDA PQS0 PQS1 PQS2 PQS3 PQS4 PQS5. Figura 1. Diagrama de bloques del sistema.

Transcripción:

TEMPORIZADORES

DEFINICION TEMPORIZADOR. - Dispositivo periférico programable que tiene la facultad de contar pulsos de reloj o pulsos externos al sistema. 12345678 TEMPORIZADOR 1, 2, 3, 4, 5, 6, 7, 8,... Registro de conteo de pulsos

Temporizador Microcontrolador Dispositivo externo Timer/contador Oscilador Selección Temporizador o Contador de eventos externos

Temporizador Preescalador (divisor de frecuencia).- Toma N pulsos de entrada y genera un solo pulso de salida. Generador de pulsos 1 2 3 4 5 6 7 8 No usa el preescalador Preescalador 2:1 12345678 Al temporizador Preescalador 4:1... Preescalador 256:1

Temporizador 12345678 Generador de pulsos Usa el preescalador Preescalador 2:1 1 2 3 4 Al temporizador 12345678 Generador de pulsos 1 2 Al temporizador Usa el preescalador Preescalador 4:1

Temporizador Postescalador (divisor de frecuencia).- Cuenta el número de veces que se desborda el timer. Cuando se cumple el número predeterminado se activa la bandera del temporizador 1 2 3 4 1 2 3 4 Temporizador/ contador Se desborda 4 veces el timer Postescalador 1:1 Se activa 4 veces la bandera TF

Temporizador Temporizador/ contador 1 2 3 4 1 2 Postescalador 2:1 Se desborda Se activa 4 veces 2 veces la el timer bandera TF 1 2 3 4 1 Temporizador/ contador Se desborda 4 veces el timer Postescalador 4:1 Se activa 1 vez la bandera TF

Temporizador/contador El PIC16F877 tiene 3 timer/counter (temporizador/contador) TMR0 Contador de 8 bits, con un pre-escalador escalador de 8 relaciones (2, 4, 8, 16, 32,64, 128, 256) ) TMR1 Contador de 16 bits, con un pre-escalador escalador de 4 relaciones (2, 4, 8, 16) TMR2 Contador de 8 bits, con un pre-escalador escalador (1, 4, 16), un post-escalador ( 12, 13, 14, 15, 16) ) y un registro de periodo PR2 escalador (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,

TIMER 0 Temporizador de pulsos de reloj interno y contador de pulsos externos.

TIMER0 Este temporizador/contador tiene un registro de conteo de pulsos, que se denomina de la misma forma TMR0. Es accesible desde d código, se puede verificar su valor por programa.

TIMER0 El conteo de este registro es incremental. Cuando se desborda, se necesita recargar el valor de conteo, para evitar conteos erróneos. Se quiere contar 5 pulsos pero no se recarga el valor de conteo. Se quiere contar 4 pulsos y se recarga el valor de conteo. TMR0 = 251 cargamos el valor inicial TMR0 = 252 TMR0 = 253 TMR0 = 254 TMR0 = 255 TMR0 = 0 desborde del timer TMR0 = 1 TMR0 = 2 TMR0 = 3 TMR0 = 4 TMR0 = 5 no hay desborde TMR0 = 6... TMR0 = 252 cargamos el valor inicial i i TMR0 = 253 TMR0 = 254 TMR0 = 255 TMR0 = 0 desborde del timer TMR0 = 252 recargamos el valor inicial TMR0 = 253 TMR0 = 254 TMR0 = 255 TMR0 = 0 desborde del timer TMR0 = 252 recargamos el valor inicial TMR0 = 253

TMR0 (registro OPTION_REG) Bit Nombre Función 7 /RBPU Activa las resistencias de PULL UP del puerto B. 6 INTEDG 5 TOCS 4 TOSE 3 PSA 0-2 PS2 PS1 PS0 Selecciona el filo de activación de la interrupción externa. Selección de fuente de entrada de pulso para el TMR0 1 = Incremento del contador por pulso en la terminal T0CKI 0 = Pulso interno cada ciclo de maquina (CLKOUT) Selección del filo de incremento del TMR0 1 = Incremento en transición negativa en la terminal T0CKI 0 = Incremento en transición positiva en la terminal T0CKI Asignación del preescalador 1 = El Preescalador es asignado al WDT 0 = El Preescalador es asignado al modulo Timer0 Selección de la escala del Preescalador Valor escala TMR0 escala WDT 000 1 : 2 1 : 1 000 1 : 2 1 : 1 001 1 : 4 1 : 2 010 1 : 8 1 : 4 011 1 : 16 1 : 8 100 1 : 32 1 : 16 101 1 : 64 1 : 32 101 1 : 64 1 : 32 110 1 : 128 1 : 64 111 1 : 256 1 : 128

TMR0

Configuración del TMR0 Se tiene que asignar valores a los siguientes registros: TMR0.- valor de conteo. OPTION_REG.- Configuración del TIMER0. INTCON (opcional).- Configuración de interrupción.

Configuración del TMR0 Si queremos que el TMR0 haga: Un conteo de 10 microsegundos usando un cristal de 4 MHz. Como el registro TMR0 puede contar hasta 256 pulsos, en esta ocasión no será necesario usar el preescalador. Tbuscado en μseg TMR0 256 Pr eescalador 4 T ciclo il de reloj lj 10μseg 256 1 4 0.25 μ seg 10 TMR0 256 1 256 10 246 //Instrucciones de configuración OPTION_REG = 0b00001000; TMR0 = 246;

Configuración del TMR0 Si queremos que el TMR0 haga: Un conteo de 10 ms ( 10000 microsegundos ) usando un cristal de 4 MHz. Como no podemos contar los 10000 pulsos con el registro tenemos que usar el preescalador. Tbuscado en μ TMR0 256 Pr eescalador 4 T seg ciclo de maquina 10000 μseg 256 256 4 0.25 μseg 10000 TMR0 256 256 39.06 216.94 217 256 //Instrucciones de configuración OPTION_REG = 0b00000111; TMR0 = 217;

Configuración del TMR0 Si queremos que el TMR0 haga: Un conteo de 150 pulsos externos utilizando RA4/TOCK0 No es necesario usar el preescalador Para el conteo se utilizará flanco negativo # pulsos externos 150 TMR0 256 256 256 150 Pr eescalador 1 TMR0 106 //Instrucciones de configuración OPTION_REG = 0b00111000; TMR0 = 106;

Registros asociados al TMR0 El registro INTCON nos sirve para: Activar al TMR0 ( T0IE ) Activar el vector de interrupciones i ( GIE ) Verificación de Bandera del TMR0 ( T0IF )

Maneras de utilizar los recursos. Poleo.- Verificación constante dentro del programa de la bandera del TMR0 ( INTCON.T0IF ) Interrupción.- Cuando la bandera del TMR0 se activa (1) el programa deja el programa principal p y va hacia el vector de interrupciones (dirección 0004h)

Interrupciones El PIC16F87X tiene implementado 14 fuentes de interrupción. 1. Cambio en PORTB nible alto 2. Interrupcion externa 0. 3. Desborde en el TIMER0. 4. Desborde en el TIMER1. 5. Desborde en el TIMER2. 6. Escritura de la memoria EEPROM. 8. Termino de conversión del convertidor analógico-digital. 9. Recepción de puerto serial. 10. Transmisión de puerto serial. 11. Puerto serial síncrono. 12. Modulo de captura/comparación/pwm 0. 13. Modulo de captura/comparación/pwm 1. 7. Recepción o transmisión de puerto paralelo esclavo. 14. Colisión de datos en el bus I 2 C.

Registro INTCON Bit Nombre Función 7 GIE 6 PEIE 5 T0IE 4 INTE 3 RBIE Habilitación de interrupción general (permite el uso del vector de interrupciones). 1 = Habilita todas las interrupciones mascarables. 0 = Deshabilita todas las interrupciones. Habilitación de interrupción de periféricos. 1 = Habilita todas las interrupciones mascarables de periféricos 0 = Deshabilita todas las interrupciones de periféricos. Habilitación de interrupción de desborde del TMR0 1 = Habilita la interrupción del TMR0. 0 = Deshabilita la interrupción del TMR0. Habilitación de la interrupción externa de terminal RB0/INT 1 = Habilita la interrupción externa. 0 = Deshabilita la interrupción externa Habilitación de la interrupción de cambio en el puerto B (RB4-RB7). 1 = Habilita la interrupción. 0 = Deshabilita la interrupción.

Registro INTCON 2 TOIF 1 INTF 0 RBIF Bandera de interrupción de desborde del TMR0. 1 = El registro TMR0 se ha desbordado. 0 = El registro TMR0 no se ha desbordado. Bandera de interrupción externa de la terminal RB0/INT. 1 = La interrupción externa RB0/INT ha ocurrido. 0 = La interrupción externa RB0/INT no ha ocurrido. Bandera de interrupción de cambio en el puerto B (nible alto). 1 = Al menos uno de las terminales del puerto B ha cambiado. Una condición de igualación será colocado en este bit. Una lectura del puerto B finalizara la igualación y permitirá que sea borrado este bit. 0 = Ninguna de las terminales del PB ha cambiado de estado.

Vector de interrupciones El PIC16F877 maneja únicamente un solo vector de interrupciones. Todos los recursos que pueden generar una interrupción llegan siempre a él. La dirección física en donde se encuentra dicho vector es la dirección 0004h.

Vector de interrupciones Las interrupciones pueden ser manejadas fácilmente en MIKROC usando la palabra reservada interrupt. void interrupt(void void); void interrupt(void) {. } ); // Definición de la función prototipo. // Definición de función.. // Escribe el código de la subrutina de interrupción. // (cuerpo de función)..

Vector de interrupciones 2 MikroC guarda los siguientes registros SFR en el stack cuando se ejecuta la interrupción y los recupera cuando se termina la rutina: PIC12 : W, STATUS, FSR, PCLATH PIC16 : W, STATUS, FSR, PCLATH PIC18 : FSR (WREG, STATUS, BSR) Nota: MikroC no soporta interrupciones de baja prioridad; para los PIC18XXX, las interrupciones deben ser de prioridad alta.

Vector de interrupciones 3 Se puede llamar funciones desde la rutina de interrupción. El compilador guarda los registros que se usan en ambos procedimientos, programa principal como la ISR. void interrupt(void p(void) {. escribe();. } // Llamada a función void escribe(void) { PORTB.F0 = 1; }

Vector de interrupciones 4 Condiciones para funciones llamadas en la ISR: No debe usar la pila, o el stack debe ser salvado antes de la llamada y restaurado posteriormente. Debe usar variables globales l únicamente (no se permiten variables locales o pasar parámetros a la función). Nunca utilizar retardos por software dentro de una ISR. Nota: Para que el enlazador de mikroc reconozca estas funciones, es necesario hacer una llamada fantasma en código C, fuera del cuerpo de la interrupción (en alguna funcion o dentro del programa principal): if (0) func1();

Vector de interrupciones (ejemplo( 1) Para manejar la interrupción del TMR0, siendo el único periférico que genera una interrupción: void interrupt(void) { // ISR TMR0 } INTCON.F2 = 0; // // Baja la bandera del TMR0 TMR0 = 96; // Recarga del valor de conteo counter++; // incrementa un contador

Vector de interrupciones (ejemplo 2) En caso de interrupciones múltiples, se necesita probar cual de las interrupciones esta ocurriendo y entonces proceder con su ISR: void interrupt() { if (INTCON.TMR0IF) { // ISR TMR0 INTCON.F2 = 0; // T0IF = 0 TMR0 = 96; counter++; } else } if (INTCON.RBIF) { // ISR nible alto PUERTO B INTCON.F0 = 0; // RBIF = 0 counter--; }

Funciones 1 Fundamentales en la programación en C. Definidas como subprogramas, los cuales regresa un valor basado en un número de parámetros de entrada. Equivalentes a los procedimientos en otros lenguajes de programación, tales como Pascal

Funciones 2 Declaradas como prototipos en archivos de encabezados o dentro de programas. Tienen enlazamiento externo y son accesibles desde cualquier archivo en el programa. Son declaradas en el archivo fuente o están disponibles en librerías precompiladas.

Declaración de funciones 1 tipo_resultado nombre_función ( lista-parámetros ); El nombre_función debe ser un identificador válido. Este nombre es usado para llamar a la función; El tipo_resultado representa el tipo de resultado que dará la función, y puede ser cualquier tipo predefinido o definido por el usuario. Para funciones que no regresan valores se debe usar el tipo void.. ( int por default ) El tipo puede ser un apuntador. Por ejemplo: float * significa que la función regresara como un apuntador un valor tipo flotante. Apuntadores genéricos ( void * ) son también permitidos. Las funciones no pueden regresar un arreglo u otra función.

Declaración de funciones 2 tipo_resultado nombre_función ( lista-parámetros ); Entre paréntesis, lista_parámentros es una lista formal de argumentos que una función toma. Esta declaración especifica el tipo de dato para cada uno de los parámetros de la función. El compilador usa esta información para verificar si las llamadas a las funciones son validas. Si la lista esta vacía, la función no tomara argumentos. Al igual que si la lista es de tipo void. Cada argumento necesita su propio tipo de dato y posible calificador constante o volátil.

Funciones prototipos Permite un mejor control sobre el número de argumentos y verificación de tipo de datos, así como la conversión entre tipos de variables. Dos prototipos para una misma función: int test ( const char * ) ; /* declara la función test */ int test ( const char *p ) ; /* declara la misma función test */ Las funciones prototipos son de gran ayuda para documentar los códigos.

Funciones prototipos 2 Por ejemplo: La función Cf_Init toma dos parámetros: puerto de Control y puerto de Datos. La pregunta es, cual es cual? void Cf_Init(char *ctrlport, char *dataport); La función prototipo lo hace mas claro. Si un archivo de cabecera contienen funciones prototipos, se puede leer este archivo para tener información para escribir programas que hagan llamadas a estas funciones.

Escribiendo funciones 1 Consiste en su declaración (nombre, parámetros y resultados) y en el cuerpo de la función ( instrucciones encerradas entre { } ). Todas las variables declaradas dentro de la función son locales a la función. Para regresar un resultado, se usa la instrucción return.

Escribiendo funciones 2 Función simple: /* La función max regresa el argumento mas grande: */ int max(int x, int y) { return (x >= y)? x : y; } Función que modifica los valores de los apuntadores: /* La función convierte coordenadas rectangulares (x,y) a polar (r,fi): */ #include <math.h> void polar(double x, double y, double *r, double *fi) { *r = sqrt(x * x + y * y); *fi = (x == 0 && y == 0)? 0 : atan2(y, x); return; */ } /* esta línea puede ser omitida

Contador de segundos ( (problema) Se desea generar un contador de segundos ( 00-99 ), utilizando para generar los retardos el temporizador/contador TMR0.

Contador de segundos ( (algoritmo) 1. Inicializa variable contador, puertos y LCD 2. Convierte contador a cadena a 3. Envía a LCD 4. Retardo de 1 segundo usando TMR0 5. Incrementa contador 6. Si contador es menor a 100 ir a 2 7. Contador igual a cero 8. Ir a 3

Contador de segundos ( (diagrama de flujo 1) contador Inicia puertos y LCD short conteo ( short cuenta ); void retardo ( void ); Inicia variable void main ( void ) { short contador; Lcd_Init ( &PORTB ); contador = 0; while(1) { contador = conteo ( contador ); } } Conteo

Contador de segundos ( (diagrama de flujo 2) conteo Convierte numero a ASCII short conteo ( short cuenta ) { char datos[6]; ShortToStr ( cuenta, datos ); Lcd_Out ( 2, 1, datos ); retardo(); cuenta ++; if ( cuenta >= 100 ) { cuenta = 0 ; } Envía a LCD } return cuenta; Retardo de un segundo Contador 100 Contador = 0 Incrementa contador Fin conteo

Contador de segundos (diagrama de flujo 3) void retardo ( void ) { short decima = 0; retardo Configura TMRO TMRO = valor inicial Habilita temporizador } OPTION_REG = 0b00000111; TMR0 = 217; INTCON = 0x20; do { while ( INTCON.F2 == 0 ) { ; } INTCON.F2 = 0; TMR0 = 217; decima ++; } while ( decima <= 100 ); INTCON = 0; Si TMR0F == 0 décima 100 Si No No Limpia TMR0F TMR0 = valor iniciali i Incrementa décima décima = 0 Deshabilita TMR0 Fin retardo

Contador de segundos ( (diagrama esquemático)

Contador de segundos (programa_1_1) short conteo ( short cuenta ); void retardo ( void ); void main ( void ) { short contador; Lcd_Init ( &PORTB ); contador = 0; while(1) { contador = conteo ( contador ); } }

Contador de segundos (programa_1_2) short conteo ( short cuenta ) { char datos[6]; void retardo ( void ) { short decima = 0; } ShortToStr ( cuenta, datos ); Lcd_Out ( 2, 1, datos ); retardo(); cuenta ++; if ( cuenta >= 100 ) { cuenta = 0 ; } return cuenta; OPTION_REG = 0b00000111; TMR0 = 217; INTCON = 0x20; do { while ( INTCON.F2 == 0 ) { ; } INTCON.F2 = 0; TMR0 = 217; decima ++; } while ( decima <= 100 ); INTCON = 0; }

Contador de segundos (Programa 2_1 diagrama de flujo 1) contador Configura TIMER0 Inicia LCD Inicia variable Manda mensaje Cambio la variable? Si Imprime variable No

Contador de segundos (Programa 2_1 diagrama de flujo 2) Interrupción Recarga TIMER0 Baja la bandera del TMR0 Incrementa variable Limpia variable Incrementa segundos Variable 100? Si Segundos 100? Si Limpia segundos No No IRET

Contador de segundos (programa_2_1) short contador, segundo; void interrupt ( void ) { TMR0 = 217; INTCON.F2 = 0; contador ++; if( contador >= 100 ) { contador = 0; segundo++; if ( segundo >= 100 ) { segundo = 0; } } } void main ( void ) { char cadena [6]; short anterior = 255; OPTION_REG = 0x07; TMR0 = 217; INTCON = 0xA0; // 0b10100000 Lcd_Init ( &PORTB ); Lcd_Out (1, 1, Contador 00-99 ); Lcd_Out (2, 1, usando INTERRUPCION ); contador = segundo = 0; while(1) { if ( anterior!= segundo ) { ShortToStr ( segundo, cadena ); Lcd_Out ( 3, 1, cadena ); anterior = segundo; } } }

Problema propuesto 1 1. Escriba un programa que realice el conteo de décimas de segundos y segundos. Las décimas deben ir desde 0-9, mientras que los segundos deben ir de 00-59. 2. Programa que cuente las veces que se presiona un pulsador conectado en el puerto RA4 dentro de un tiempo de 60 segundos.

Button(/*atributos*/) /) unsigned short Button( unsigned short *puerto, unsigned short pin, unsigned short tiempo, unsigned short estado_activo activo ); Descripción.- La función elimina la influencia de los rebotes cuando se presiona un pulsador. puerto y pin especifican la terminal donde se encuentra conectado el pulsador. tiempo especifica el tiempo mínimo, en ms, que tiene que estar activado el pulsador para que la función regrese un valor verdadero. estado_activo puede ser 0 o 1, y determina si el pulsador es activado cuando proporcione un cero lógico o un uno lógico.

Button(/*atributos*/) /) Ejemplo: Se lee un pulsador conectado a la terminal RB0; Si se tiene una transición ió de 1 to 0 (el pulsador se suelta), el PORTD es invertido: do { if (Button(&PORTB, 0, 1, 1)) oldstate = 1; if (oldstate && Button(&PORTB, 0, 1, 0)) { PORTD = ~PORTD; oldstate = 0; } } while(1);

2.- Contador de segundos condicionado (problema)) Utilice el programa resuelto numero 1. El contador constara de tres botones. El botón 1 (encendido) comienza el conteo, el botón 2 (apagar) detendrá y reiniciará el conteo y el botón 3 (detener) detendrá y continuará el conteo.

Contador de segundos condicionado (algoritmo)) 1. Inicializa variable contador,,p puertos y LCD 2. Si no encendido ir a 2 3. Si apagar ir a 2 4. Si detener ir a 3 5. Convierte contador a cadena 6. Envía a LCD 7. Retardo de 1 segundo usando TMR0 8. Incrementa contador 9. Si contador es menor a 100 ir a 3 10. Contador igual a cero 11. Ir a 3

Contador de segundos condicionado contador (diagrama de flujo) Inicializa puertos (LCD) Inicializa contador No Encendido? Limpia variable Si Detener Si Si Apagado? No No conteo

Contador de segundos condicionado (diagrama esquemático )

Contador de segundos condicionado (programa)) short conteo ( short cuenta ); void retardo ( void ); void main ( void ) { short contador; TRISD =255; Lcd_Init ( &PORTC ); Lcd_Out ( 1, 1, contador de 00-99 ); contador = 0; while(1) { while( PORTD.F0 == 1 ); // Botón de encendido desactivado? while( PORTD.F1 == 1 ) // Botón de apagado activado? { if ( PORTD.F2 == 1) // Botón de detener activado? contador = conteo ( contador ); } contador = 0; } }

Problema 2 Realice el problema anterior, ahora usando el TMR0 como interrupción por hardware. También utilice la función predefinida Button.

T I M E R 1 Temporizador número 1 de pulsos de reloj interno y contador de pulsos externos.

TMR1 Tiene las misma características que el TMR0. Temporizador y contador (RC0). Diferencias: i Registro de 2 bytes (TMR1H y TMR1L). Preescalador (1:1, 1:2, 1:4, 1:8) Generador de reloj (RC0 y RC1)

TMR1 como oscilador Cuando se habilita (T1OSCEN)) las terminales RC1/T1OSI/CCP2 y RC0/T1OSO/T1CKI se convierten en entradas. Se genera una frecuencia de oscilación de hasta 200 khz, usando un cristal de: 32.768 khz ó 100 khz ó 200 khz. Funciona a pesar de la condición SLEEP.

Ejemplos Se quiere contar 5 pulsos pero no se recarga el valor de conteo. TMR1H : TMR1L = 65531 ( 0xFFFB ) TMR1H : TMR1L = 65532 TMR1H : TMR1L = 65533 TMR1H : TMR1L = 65534 TMR1H : TMR1L = 65535 TMR1H : TMR1L = 0 desborde del timer TMR1H : TMR1L = 1 TMR1H : TMR1L = 2 TMR1H : TMR1L = 3 TMR1H : TMR1L = 4 TMR1H : TMR1L = 5 no hay desborde TMR1H : TMR1L = 6... TMR1 Se quiere contar 4 pulsos recargando el valor de conteo. TMR1H : TMR1L = 65532 ( 0xFFFC ) TMR1H : TMR1L = 65533 TMR1H : TMR1L = 65534 TMR1H : TMR1L = 65535 TMR1H : TMR1L = 0 desborde del timer TMR1H : TMR1L = 65532 TMR1H : TMR1L = 65533 TMR1H : TMR1L = 65534 TMR1H : TMR1L = 65535 TMR1H : TMR1L = 0 desborde del timer TMR1H : TMR1L = 65532 TMR1H : TMR1L = 65533 TMR1H : TMR1L = 65534 TMR1H : TMR1L = 65535 TMR1H : TMR1L = 0 desborde del timer TMR1H : TMR1L = 65532 TMR1H : TMR1L = 65533

TMR1 Bit Nombre Función 5:4 T1CKPS1: T1CKPS0 Selección del preescalador del Timer1 11 = 1:8 10 = 1:4 01 = 1:2 00 = 1:1 3 T1OSCEN Habilitación del oscilador del Timer1. 1 = Habilita el oscilador. 0 = El oscilador esta desactivado (el inversor se apaga para eliminar el consumo de potencia). 2 /T1SYNC 1 TMR1CS Control de sincronización de entrada del reloj externo del Timer1 Cuando TMR1CS = 1: 1 = No se sincroniza la entrada del reloj externo. 0 = Se sincroniza la entrada del reloj externo. Cuando TMR1CS = 0: Este bit es ignorado. El Timer1 usa el reloj interno. Selecciona la fuente de reloj para el Timer1. 1 = El reloj es externo desde la terminar RC0/T1OSO/T1CKI (En el filo de caida) 0 = Reloj interno (FOSC/4) 0 TMR1ON Encendido del Timer1. 1 = Encendido. 0 = Detiene el Timer1

TMR1 Cuando T1OSCEN esta desactivado (0) el inversor se deshabilita evitando el consumo de energía.

Configuración del TMR1 Se tiene que asignar valores a los siguientes registros: it TMR1H y TMR1L.- valor de conteo. TMR1H : byte alto TMR1L : byte bajo. T1CON.- Configuración del TIMER 1. INTCON (opcional).- Configuración de interrupción. PIE1 (opcional).- Habilitación del Timer 1. PIR1 (opcional).- Bandera de desborde del Timer 1.

Configuración del TMR1 Si se requiere un temporizador (timer 1) que haga: Un conteo de 10 microsegundos usando un cristal de 20 MHz. Como los registros puede contar desde 1 hasta 65536 pulsos, en esta ocasión no será necesario usar el preescalador. Tbuscado en μseg TMR 1 H : TMR 1 L 65536 Pr eescalador 4 T ciclo de reloj 10 μseg 65536 1 4 0.05μseg TMR1H : TMR1L 65536 10 0.2 65536 50 65486 ( 0xFFCE ) //Instrucciones de configuración T1CON = 0b00000001; TMR1H = 0xFF; TMR1L = 0xCE;

Configuración del TMR1 Si se requiere que el Timer 1 haga: Un conteo de 200 ms ( 200000 microsegundos ) usando un cristal de 8 MHz. Como no podemos contar los 200000 pulsos con el registro tenemos que usar el preescalador. Tbuscado en μseg TMR1H : TMR1L 65536 Pr eescalador 4 T periodo de reloj 200000 μseg 65536 8 4 0.125 μseg 200000 TMR1H : TMR1L 65536 65536 50000 15536 ( 0x3CB0 ) 4 //Instrucciones de configuración T1CON = 0b00110001; TMR1H = 0x3C; TMR1L = 0xB0;

Configuración del TMR1 Si queremos que el Timer 1 haga: Un conteo de 7500 pulsos externos utilizando RC0/T1OSCI/T1CKI No es necesario usar el preescalador Sin sincronización. # pulsos externos TMR1H : TMR1L 65536 Pr eescalador 7500 65536 1 65536 7500 TMR1H : TMR1L 58036 ( 0xE2B4 ) //Instrucciones de configuración T1CON = 0b00000011; TMR1H = 0xE2; TMR1L = 0xB4;

Registros asociados al TMR1 INTCON.- Configurando GIE y PEIE, para activar el vector de interrupciones y activar los registros PIE1, PIE2, PIR1 y PIR2, respectivamente. PIE1.- Activar TMR1IE ( Inicia el uso de la bandera de desborde del Timer 1 ). PIR1.- Verificar TMR1IF ( Bandera de desborde del Timer 1 ).

Frecuencímetro Diseñar un programa que indique la frecuencia de giro de un motor. Dicho programa utilizara el timer 1 como medidor de tiempo entre impulso e impulso.

Frecuencímetro ( (Algoritmo) 1. Configurar interrupción externa para detectar vuelta del motor. 2. Configurar Timer 1 como o temporizador, sin encenderlo. 3. Si es el segundo pulso, ir a 5. 4. No es el segundo pulso, ir a 3 5. Determina frecuencia. 6. Imprime frecuencia. 7. Ir a 3.

Frecuencímetro ( (algoritmo ISR Frecuencímetro (algoritmo ISR) 1. Reinicia la interrupción externa. 2. Cuenta pulso. 3. Si es primer pulso ir a 5 4. No es el primer pulso ir a 7 5. Enciende temporizador 1. 6. Salir de ISR. 7. Apaga temporizador. 8. Reinicia contador de pulsos. 9. Salir de ISR.

Frecuencimetro ( diagrama de flujo 1) frecuencimetro Configura INT-EXT Timer 1 2 pulsos? Si No Encuentra frecuencia Imprime frecuencia

Frecuencímetro ( diagrama de flujo 2) ISR Reinicia la INT-EXT Cuenta el pulso 2 pulsos? Si No Enciende Timer 1 Apaga Timer 1 Terminar

Frecuencímetro ( (programa) unsigned frecuencia, pulso, conteo; char cad[10]; void interrupt (void) { INTCON.F1 = 0; } pulso ++; if ( pulso == 1 ) { T1CON.F0 = 1; } else { T1CON.F0 = 0; INTCON = 0; } void main (void) { TRISB = 255; OPTION_REG = 0b0100000; INTCON = 0b10010000; T1CON = 0b00110000; Lcd_Init ( &PORTD ); Lcd_Out(1,1, Frecuencímetro ); Lcd_Out(3,1, Frecuencia : ) Lcd_Out(2,1, Pulsos : ); TMR1H = TMR1L = 0; while(1) { if ( pulso == 2 ) { conteo = (TMR1H<<8)+TMR1L; WordToStr ( conteo, cad); Lcd_Out (2,12,cad); frecuencia =(1000000/conteo)/8; WordToStr ( frecuencia, cad); Lcd cd_out (3,12,cad);,cad); pulso = 0; TMR1H = TMR1L = 0; INTCON = 0x90; } } }

EJERCICIOS PROPUESTOS DEL TMR1 1. Genere e e un reloj, el cual pueda ser configurado, que tenga hora, minutos y segundos. 2. Modifique el problema propuesto 2 del TMR0, de tal forma que el retardo de 60 segundos sea llevado a cabo por el TMR1 y el conteo de los pulsos sea realizado por el TMR0, configurado como contador de eventos externos.

T I M E R 2 Temporizador de ciclos de reloj y generador de señal de periodo para puerto serial.

TIMER 2 Es un temporizador de 8 bits que tiene un preescalador y un postescalador. Es usado como base de tiempo para el modulo de PWM (CCP) También alimenta al modulo de puerto serial síncrono (SSP), como reloj de corrimiento.

Funcionamiento del timer 2 1. Los pulsos de reloj entran a un preescalador, en este se puede seleccionar una escala de 1, 4 o 16. 2. El registro TMR2 se incrementa a partir de cero, de uno en uno, por cada pulso que le llega del preescalador. 3. Cuando el TMR2 alcanza el valor precargado en el registro PR2, se genera un pulso.

Funcionamiento del TIMER 2 4. El pulso que se genera reinicia el registro TMR2. 5. Este mismo pulso llega a un postescalador que puede tener cualquiera de las siguientes escalas: 1, 2, 3, 4, 5,..., 15 o 16. 6. Como salida este postescalador genera un pulso que activa la bandera del TIMER 2 (TMR2IF).

Registro T2CON Bit Nombre Función 6:3 Selección del postescalador del Timer 2 TOUTPS3: TOUTPS2: TOUTPS1: TOUTPS0 0000 = 1:1 0001 = 1:2 0011 = 1:3 0100 = 1:4... 1110 = 1:15 1111 = 1:16 2 TMR2ON Encendido del Timer 2. 1 = Encendido. 0 = Detiene el Timer 2. 1:0 T2CKPS1: T2CKPS0 Selección del preescalador del Timer 2. 00 = 1:1 01 = 1:4 1X = 1:16

Diagrama a bloques del TIMER 2

Registros de configuración Se tiene que asignar valores a los siguientes registros: TMR2.-Número de pulsos a contar. PR2.- Número de pulsos a contar. T2CON.- Configuración del TIMER 2. INTCON (opcional).- Configuración de interrupción. PIE1 (opcional).- Habilitación del Timer 2. PIR1 (opcional).- Bandera de desborde d del Timer 2.

Configuración del TMR2 Si queremos que el Timer 2 haga: Un conteo de 75 microsegundos usando un cristal de 12 MHz. Como el registro TMR2 puede contar desde 0 hasta PR2 pulsos, en esta ocasión no será necesario utilizar tanto el preescalador como el postescalador. PR2 preescalador T buscado en μseg postescalador 4 T ciclo de reloj 75μseg 1 1 4 0.083μseg 75 PR2 225 ( 0xE1) 0.33 //Instrucciones de configuración T2CON = 0b00000100; PR2 = 0xE1; TMR2 = 0; // 0xE5 // 0xFF // 0x04 // 0x1E

Configuración del TMR2 Si queremos que el Timer 2 haga: Un conteo de 50 milisegundos usando un cristal de 4 MHz. Como el registro TMR2 puede contar desde 0 hasta PR2 pulsos, en esta ocasión se necesita utilizar tanto el preescalador como el postescalador. PR2 preescalador T buscado en μseg postescalador 4 T ciclo de reloj 50000μseg 16 14 4 0.25μseg 50000 PR2 223 ( 0xDF 224 ) //Instrucciones de configuración T2CON = 0b01101111; PR2 = 0xDF; TMR2 = 0;

Registros asociados al Timer 2 INTCON.- Configurando GIE y PEIE, para activar el vector de interrupciones y activar los registros PIE1, PIE2, PIR1 y PIR2, respectivamente. PIE1.- Activar TMR2IE ( Inicia el uso de la bandera de desborde del Timer 2 ). PIR1.- Verificar TMR2IF ( Bandera de desborde del Timer 2 ).

Cerrojo temporizado (problema) Diseñar un programa a que controle o el acceso de una habitación. El sistema cuenta con un sensor de presencia, que envía un pulso cuando hay personas en la habitación. Si el sistema no detecta la presencia de personas durante 5 minutos, se debe activar un cerrojo eléctrico. El cerrojo se desactiva cuando se introduce una clave. Esto último se simulará con un pulso de desactivación.

Cerrojo temporizado ( (algoritmo) Programa a principal pa 1. Configurar interrupción externa. 2. Configurar Timer 2. 3. Si cerrrojo activado y pulso de desactivación presente ir a 5 4. No cerrojo activado o pulso de desactivación ir a 3 5. Desactiva el cerrojo. 6. Reinicia conteo de tiempo. 7. Ir a 3.

Cerrojo temporizado (algoritmo 2 j p ( algoritmo 2) Programa ISR 1. Si es interrupción externa ir a 10 2. No es interrupción externa ir a 3 3. Si es Timer 2 ir a 5 4. No es el Timer 2 salir de ISR. 5. Reinicia Timer 2 6. Incrementa conteo 7. Si conteo es igual a 5 minutos ir a 13 8. No conteo igual a 5 minutos ir a 9 9. Salir de ISR. 10. Reinicia Interrupción externa. 11. Reinicia Timer 2. 12. Salir de ISR. 13. Activa cerrojo. 14. Salir de ISR.

Cerrojo temporizado ( diagrama de flujo 1) Cerrojo temp. Configura INT-EXT Timer 2 Cerrojo activado Y Pulso desactivación? No Si Desactivar el cerrojo Reinicia el conteo de tiempo

Cerrojo temporizado ( diagrama de flujo 2) ISR Reinicia la INT-EXT Cuenta el pulso INT_EXT? No Si Reinicia i i INT_EXT Reinicia conteo 1 Conteo = 5min? Si Timer 2? Si Incrementa conteo No Activa cerrojo 1 No Terminar

Cerrojo temporizado (programa) unsigned decima_segundos, seg, anterior; char cad[10]; void interrupt (void) { if (INTCON.F1 == 1) { INTCON.F1 = 0; decima_segundos d = 0; TMR2 = 0; } if ( PIR1.F1 == 1 ) { PIR1.F1 = 0; decima_segundos++; if ( decima_segundos == 30000 ) { PORTC.F0 = 1; T2CON.F2 = 0; INTCON.F4 = 0; } } }

Cerrojo temporizado (programa 2) void main (void) { OPTION_REG = 0b0100000; INTCON = 0b11010000; PIE1 = 0b00000010; T2CON = 0b01111111; PR2 = 39; TRISC = 0xf0; TRISB = 255; PORTC = 0; TMR2 = 0; Lcd_Init ( &PORTD ); Lcd_Out(1,1, "Cerrojo temporizado"); Lcd cd_out(3, Out(3,1,, "Cerrojo : abierto"); Lcd_Out(2,8, "segundos"); while(1) { if ( PORTC.F0 == 1 && PORTC.F7 == 1) { PORTC.F0 = 0; decima_segundos = 0; TMR2 = 0; T2CON.F2 = 1; } seg = decima_segundos/100; if ( seg!= anterior ) { anterior = seg; WordToStr ( seg, cad); Lcd_Out ( 2, 1, cad ); if (seg == 300) Lcd_Out(3, 11, "Cerrado "); } } }

Comunicación I 2 C Programa que establezca comunicación con una memoria que maneja su acceso bajo el protocolo I 2 C. El programa debe llenar la memoria partiendo de la dirección 0 hasta la máxima dirección los números decrementales partiendo del 255, repitiendo tantas veces como sea necesario.