Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
Se configuran los pines I/O como digital y los pines de PortB como salida.
no
interrupt
3.2.
INTERRUPT
Inicio
cnt++
TMR0=96
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); }
el momento de su ejecucin
RESPONDER: 1) Verifique el tiempo que demora en ocurrir una interrupcin 0.026 segundos
2)
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
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
Cnt=76
no
INTERRUPT
cnt++
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); }
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.
PIC 16F887
8 LEDs
Se inicializa el valor PorB=0b10101010. Los pines PortB son configurados como salida.
no
INTERRUPT
REPLACE
no
return
REPLACE
Inicio
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 */
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 } } }
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.
PIC 16F887
8 LEDs
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
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.