Está en la página 1de 14

ESCUELA SUPERIOR POLITCNICA DEL LITORAL

Laboratorio de Microcontroladores Prctica INTERRUPCIONES Y TEMPORIZADORES EN LENGUAJE C Alumnos OSCAR LOOR QUEVEDO DENISSE VILLAMAR HERRERA Paralelo: # 6 Grupo: # 2 Fecha de presentacin: 20 DICIEMBRE 2013 2013 2 TRMINO

PARTE 1
1. Enunciado del proyecto La funcin de la aplicacin es aumentar el nmero en el puerto B del PIC 16F887 configurado como salida cada 400 interrupciones. Cabe indicar que se utilizan resistencias, fuente de energa y conexiones a tierra para el buen funcionamiento de la aplicacin. 2. Diagrama de bloques

PIC 16F887

8 LEDs

3.1.

Diagrama de Flujo funcional del Programa principal


Inicio

Definir variable cnt

Asigna preescalador a TMR0

Se configuran los pines I/O como digital y los pines de PortB como salida.

Reset a PortB. Cnt=0 TMR0=96

Cnt==400 si PortB=PortB++ Cnt=0

no

interrupt

3.2.

Diagrama de Flujo Funcional de la Subrutina

INTERRUPT

Inicio

cnt++

TMR0=96

Seteo INTCON=0x20 Bit T0IE es seteado, bit T0IF es limpiado

4. Descripcin del algoritmo. 1. Se definen las variables, se configura los pines I/O como digitales y el puerto B del PIC como salida. 2. Se asigna al pre escalador al timer 0, OPTION_REG=0x84. 3. Resetear el PortB y cnt, asignar el valor 96 a TMR0 y habilitar la interrupcin del TMR0 asignando 0xA0 al registro INTCON. 4. Iniciamos un lazo interminable con do while en el que preguntamos si cnt=400, si es as se aumenta PortB y enceramos cnt, caso contrario, llamar a la subrutina INTERRUPT, donde se incrementa cnt, se reasigna el valor de TMR0, se setea y limpia los bits T0IE y T0IF respectivamente, del registro INTCON. 5. Programa fuente en lenguaje C.

/* * Nombre del Proyecto: P6a_t0.c * Nombre del Autor: (c) Mikroelektronika, 2009. * Description: (Explicacin del ejercicio) * Test configuration: MCU: PIC16F887 Oscillator: HS, 08.0000 MHz SW: mikroC PRO for PIC * NOTES: Cada vez que el TMR0 se desborda ocurre una interrupcin */ /*Header******************************************************/ unsigned cnt; // Define variable cnt

void interrupt() { cnt++; // Interrupt causes cnt to be incremented by 1 TMR0 = 96; // Timer TMR0 is returned its initial value INTCON = 0x20; // Bit T0IE is set, bit T0IF is cleared }

void main() { OPTION_REG = 0x84; // Prescaler is assigned to timer TMR0 ANSEL = 0; // All I/O pins are configured as digital ANSELH = 0; TRISB = 0; // All port B pins are configured as outputs PORTB = 0x0; // Reset port B TMR0 = 96; // Timer T0 counts from 96 to 255 INTCON = 0xA0; // Enable interrupt TMR0 cnt = 0; // Variable cnt is assigned a 0 do { // Endless loop if (cnt == 400) { // Increment port B after 400 interrupts PORTB = PORTB++; // Increment number on port B by 1 cnt = 0; // Reset variable cnt } } while(1); }

6. Copia impresa del circuito armado en PROTEUS para la simulacin en

el momento de su ejecucin

RESPONDER: 1) Verifique el tiempo que demora en ocurrir una interrupcin 0.026 segundos
2)

Cunto demoran las 400 interrupciones? 10.34 segundos

PARTE 2
7. Enunciado del proyecto Cada vez que TMR1 (TMR1H, TMR1L) se desborda ocurre una interrupcin.

8. Diagrama de bloques

PIC 16F887

8 LEDs

9.1 Diagrama de Flujo funcional del Programa principal


Inicio

Se configura los pines I/O como digital.

Se inicializa el valor PorB=0xF0. Los pines PortB son configurados como salida.

Setear el valor de TMR1 con el registro T1CON=1. Resetear el bit TMR1IF. Setear TMR1H=0x80 y TMR1L=0x00. Habilitar interrupcin de TMR1. PIE1.TMR1IE=1 Resetear variable cnt. Cnt=0

Habilitar interrupciones, bits GIE y PEIE. INTCON=0xC0

Cnt=76

no

INTERRUPT

si Invertir PortB y limpiar cnt.

9.2 Diagrama de Flujo funcional de la subrutina INTERRUPT


Inicio

cnt++

Reset bit TMR1IF

Los registros TMR1H y TMR1L retornan al valor inicial. TMR1H=0x80 TMR1L=0x00

10. Descripcin del algoritmo. 1. Se definen las variables, se configura los pines I/O como digitales y el puerto B del PIC como salida. 2. Se inicializa el valor PortB=0xF0. 3. Setear el valor de TMR1 con el registro T1CON=1. Resetear el bit TMR1H=0x80 y TMR1L=0x00. Habilitar interrupcin de TMR1. Resetear variable cnt=0. Habilitar interrupciones del registro INTCON en los bits GIE y PEIE. 4. Iniciamos un lazo interminable con do while en el que preguntamos si cnt=76, si es as PortB se invierte y enceramos cnt, caso contrario, llamar a la subrutina INTERRUPT, donde se incrementa cnt, se reasigna los valores iniciales de TMR1H y TMR1L. 11. Programa fuente en lenguaje ensamblador.

/* * Nombre del Proyecto: P6b_t1.c * Nombre del Autor: (c) Mikroelektronika, 2009. * Description: (Explicacin del ejercicio) * Test configuration: MCU: PIC16F887 Oscillator: HS, 08.0000 MHz SW: mikroC PRO for PIC * NOTES: Cada vez que el TMR1 (TMR1H, TMR1L) se desborda ocurre una interrupcin */ /*Header******************************************************/ unsigned short cnt; // Define variable cnt

void interrupt() { cnt++ ; // Interrupt causes cnt to be incremented by 1 PIR1.TMR1IF = 0; // Reset bit TMR1IF TMR1H = 0x80; // TMR1H and TMR1L timer registers are returned TMR1L = 0x00; // their initial values } void main() { ANSEL = 0; // All I/O pins are configured as digital ANSELH = 0; PORTB = 0xF0; // Initial value of port B bits TRISB = 0; // Port B pins are configured as outputs T1CON = 1; // Set timer TMR1 PIR1.TMR1IF = 0; // Reset bit TMR1IF TMR1H = 0x80; // Set initial value for timer TMR1 TMR1L = 0x00; PIE1.TMR1IE = 1; // Enable interrupt on overflow cnt = 0; // Reset variable cnt INTCON = 0xC0; // Enable interrupt (bits GIE and PEIE) do { // Endless loop if (cnt == 76) { // Change port B state after 76 interrupts PORTB = ~PORTB; // Number in port B is inverted cnt = 0; // Reset variable cnt } } while (1); }

12. Copia impresa del circuito armado en PROTEUS para la simulacin en

el momento de su ejecucin

RESPONDER: 1) Cada qu tiempo se interrumpe con el Timer 1 0.16 segundos 2) Cunto demoran las 76 interrupciones? 12.45 segundos

PARTE 3
13. Enunciado del proyecto Cada vez que TMR2 se desborda ocurre una interrupcin.

14. Diagrama de bloques

PIC 16F887

8 LEDs

15.1 Diagrama de Flujo funcional del Programa principal


Inicio

Reset variable cnt. Se configura los pines I/O como digital.

Se inicializa el valor PorB=0b10101010. Los pines PortB son configurados como salida.

Setear el valor de TMR2 con el registro T2CON=0xFF. Setear TMR2=0.

Habilitar interrupcin de TMR2. PIE1.TMR2IE=1

Habilitar interrupciones, bits GIE y PEIE. INTCON=0xC0

Cnt>30 si Limpiar cnt.

no

INTERRUPT

REPLACE

15.2 Diagrama de Flujo funcional de las subrutinas INTERRUPT


Inicio

TMR2IF=1 si cnt++ TMR2IF=0 Resetear el registro TMR2

no

return

REPLACE
Inicio

Se configura los pines I/O como digital.

16. Descripcin del algoritmo. 1. Se definen las variables, se configura los pines I/O como digitales y el puerto B del PIC como salida. 2. Se inicializa el valor PortB=0b10101010. 3. Setear el valor de TMR2 con el registro T2CON=0xFF. Setear TMR2=0. Habilitar interrupcin de TMR2. Resetear variable cnt=0. Habilitar interrupciones del registro INTCON en los bits GIE y PEIE. 4. Iniciamos un lazo interminable con while en el que preguntamos si cnt es mayor que 30, si es as se llama a la subrutina REPLACE que invierte PortB y enceramos cnt, caso contrario, llamar a la subrutina INTERRUPT, donde se incrementa cnt, se reasigna los valores TMR2IF=0 y el registro TMR2. 17. Programa fuente en lenguaje ensamblador.
Nombre del Proyecto: P6c_t2.c * Nombre del Autor: (c) Mikroelektronika, 2009. * Description: (Explicacin del ejercicio) * Test configuration: MCU: PIC16F887 Oscillator: HS, 08.0000 MHz SW: mikroC PRO for PIC * NOTES: Cada vez que el TMR2 se desborda ocurre una interrupcin */

/*Header******************************************************/ unsigned short cnt; // Define variable cnt

void Replace() { PORTB = ~PORTB; // Define new function 'Replace' } // Function inverts port state void interrupt() { if (PIR1.TMR2IF) { // If bit TMR2IF = 1, cnt++ ; // Increment variable cnt by 1 PIR1.TMR2IF = 0;// Reset bit and TMR2 = 0; // reset register TMR2 } } // main void main() { cnt = 0; // Reset variable cnt ANSEL = 0; // All I/O pins are configured as digital ANSELH = 0; PORTB = 0b10101010; // Logic state on port B pins TRISB = 0; // All port B pins are configured as outputs T2CON = 0xFF; // Set timer T2 TMR2 = 0; // Initial value of timer register TMR2 PIE1.TMR2IE = 1; // Enable interrupt INTCON = 0xC0; // Set bits GIE and PEIE while (1) { // Endless loop if (cnt > 30) { // Change PORTB after more than 30 interrupts Replace(); // Function Replace inverts the port B state cnt = 0; // Reset variable cnt } } }

18. Copia impresa del circuito armado en PROTEUS para la simulacin en

el momento de su ejecucin

RESPONDER: 1) Cada qu tiempo se interrumpe con el Timer 2 0.3296 segundos 2) Cunto demoran 31 interrupciones? 10.22 segundos

PARTE 4
19. Enunciado del proyecto Para que este programa funcione correctamente es necesario habilitar el uso del perro guardin con ProjectEdit Project.

20. Diagrama de bloques

PIC 16F887

8 LEDs

21. Diagrama de Flujo funcional del Programa principal


Inicio Asignar pre escalador 1:64 al perro guardin. OPTION_REG=0x08 WDTCONT=1 Se inicializa el valor PorB=0x0F. Los pines PortB son configurados como salida.

Retardo de 30 milisegundos. Delay_ms(300)

Valor PortB diferente al inicial. PortB=0xF0

Lazo infinito limpiando el perro guardin

22.

Descripcin del algoritmo. 1. Asignar pre escalador 1:64 al OPTION_REG=0x08.WDTCON=1 2. Se inicializa el valor PortB=0x0F. 3. Retardo de 30 milisegundos. 4. Valor PortB diferente al inicial. PortB=0xF0. perro guardin.

5. Lazo infinito limpiando el perro guardin. 23. Programa fuente en lenguaje ensamblador.
/* * Nombre del Proyecto: P6d_wdt.c * Nombre del Autor: (c) Mikroelektronika, 2009. * Description: (Explicacin del ejercicio) * Test configuration: MCU: PIC16F887 Oscillator: HS, 08.0000 MHz SW: mikroC PRO for PIC * NOTES: Para que este programa funcione correctamente es necesario habilitar el uso del perro guardin con Project'Edit Project */ /*Header******************************************************/ void main() { OPTION_REG = 0x08; // Prescaler is assigned to timer WDT (1:64) WDTCON = 1; PORTB = 0x0F; // Initial value of the PORTB register TRISB = 0; // All port B pins are configured as outputs Delay_ms(300); PORTB = 0xF0; while (1) { asm CLRWDT; } } // 30mS delay // Porta B value different from initial

// Assembly command to reset WDT timer

24. Copia impresa del circuito armado en PROTEUS para la simulacin en

el momento de su ejecucin

RESPONDER: 1) Quite la instruccin: asm CLRWDT y explique lo que ocurre. El perro guardin resetea el sistema.

25. Conclusiones TMR0 y TMR2 tienen un valor aproximado por interrupcin. TMR1 tiene un tiempo dos segundos mayor a TMR0 y TMR2. Se debe refrescar el valor de WDT para evitar reset del sistema. 26. Recomendaciones Se recomienda no confiar en un totalmente en los resultados que se obtienen con el simulador de PROTEUS, hay que tener siempre en cuenta que una cosa es simulacin y otra muy diferente es la vida real en la que aparecen muchas sorpresas. No es recomendable corregir el programa sin tener una ltima copia del mismo ya que un cambio podra provocar problemas e impedir la compilacin. El orden es el mejor aliado para evitarse problemas futuros. No olvidar setear los puertos de entrada o salida, dependiendo el uso que se les d en el programa principal, en nuestro caso el puerto b como puerto de salida. Al trabajar en Proteus, al unir las respectivas patitas con el bus de datos, dar el nombre apropiado con la funcin label para no tener errores de compilacin. Se recomienda utilizar cristales de cuarzo en circuitos donde la precisin de los retardos es un factor crtico. La precisin de los retardos generados por software dependen principalmente del tipo de oscilador que se utilice como base de tiempo en el microcontrolador, siendo los osciladores de cuarzo los que tienen mayor precisin.

También podría gustarte