PRACTIK6-INTERRUPCIONES Y TEMPORIZADORES EN LENGUAJE C.docx

18
ESCUELA SUPERIOR POLITÉCNICA DEL LITORAL Laboratorio de Microcontroladores Práctica INTERRUPCIONES Y TEMPORIZADORES EN LENGUAJE C Alumnos OSCAR LOOR QUEVEDO DENISSE VILLAMAR HERRERA Paralelo: # 6 Grupo: # 2 Fecha de presentación: 20 DICIEMBRE 2013

Transcript of PRACTIK6-INTERRUPCIONES Y TEMPORIZADORES EN LENGUAJE C.docx

Page 1: PRACTIK6-INTERRUPCIONES Y TEMPORIZADORES EN LENGUAJE C.docx

ESCUELA SUPERIOR POLITÉCNICA DEL LITORAL

Laboratorio de Microcontroladores

PrácticaINTERRUPCIONES Y TEMPORIZADORES EN

LENGUAJE C

AlumnosOSCAR LOOR QUEVEDO

DENISSE VILLAMAR HERRERA

Paralelo: # 6Grupo: # 2

Fecha de presentación:20 DICIEMBRE 2013

2013 – 2° TÉRMINO

Page 2: PRACTIK6-INTERRUPCIONES Y TEMPORIZADORES EN LENGUAJE C.docx

PARTE 1

1. Enunciado del proyecto

La función de la aplicación es aumentar el número en el puerto B del PIC 16F887 configurado como salida cada 400 interrupciones. Cabe indicar que se utilizan resistencias, fuente de energía y conexiones a tierra para el buen funcionamiento de la aplicación.

2. Diagrama de bloques

3.1. Diagrama de Flujo funcional del Programa principal

3.2. Diagrama de Flujo Funcional de la Subrutina

INTERRUPT

PIC 16F887 8 LEDs

Page 3: PRACTIK6-INTERRUPCIONES Y TEMPORIZADORES EN LENGUAJE C.docx

4. Descripción 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

interrupción 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: (Explicación 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 interrupción*//*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}

Page 4: PRACTIK6-INTERRUPCIONES Y TEMPORIZADORES EN LENGUAJE C.docx

6. Copia impresa del circuito armado en PROTEUS para la simulación en el momento de su ejecución

RESPONDER:1) Verifique el tiempo que demora en ocurrir una interrupción

0.026 segundos

2) ¿Cuánto demoran las 400 interrupciones?10.34 segundos

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

Page 5: PRACTIK6-INTERRUPCIONES Y TEMPORIZADORES EN LENGUAJE C.docx

PARTE 2

7. Enunciado del proyecto

Cada vez que TMR1 (TMR1H, TMR1L) se desborda ocurre una interrupción.

8. Diagrama de bloques

9.1 Diagrama de Flujo funcional del Programa principal

PIC 16F887 8 LEDs

Page 6: PRACTIK6-INTERRUPCIONES Y TEMPORIZADORES EN LENGUAJE C.docx

9.2 Diagrama de Flujo funcional de la subrutina INTERRUPT

10. Descripción 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 interrupción 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: (Explicación 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 interrupción*/

/*Header******************************************************/

unsigned short cnt; // Define variable cnt

Page 7: PRACTIK6-INTERRUPCIONES Y TEMPORIZADORES EN LENGUAJE C.docx

12. Copia impresa del circuito armado en PROTEUS para la simulación en el momento de su ejecución

RESPONDER:1) Cada qué tiempo se interrumpe con el Timer 1

0.16 segundos2) ¿Cuánto demoran las 76 interrupciones?

12.45 segundos

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

Page 8: PRACTIK6-INTERRUPCIONES Y TEMPORIZADORES EN LENGUAJE C.docx

PARTE 3

13.Enunciado del proyecto

Cada vez que TMR2 se desborda ocurre una interrupción.

14.Diagrama de bloques

15.1 Diagrama de Flujo funcional del Programa principal

PIC 16F887 8 LEDs

Page 9: PRACTIK6-INTERRUPCIONES Y TEMPORIZADORES EN LENGUAJE C.docx

15.2 Diagrama de Flujo funcional de las subrutinas

INTERRUPT

REPLACE

16. Descripción 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 interrupción 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: (Explicación 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 interrupción*/

Page 10: PRACTIK6-INTERRUPCIONES Y TEMPORIZADORES EN LENGUAJE C.docx

18. Copia impresa del circuito armado en PROTEUS para la simulación en el momento de su ejecución

/*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 }}

// mainvoid 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 } }}

Page 11: PRACTIK6-INTERRUPCIONES Y TEMPORIZADORES EN LENGUAJE C.docx

RESPONDER:1) Cada qué tiempo se interrumpe con el Timer 2

0.3296 segundos2) ¿Cuánto demoran 31 interrupciones?

10.22 segundos

Page 12: PRACTIK6-INTERRUPCIONES Y TEMPORIZADORES EN LENGUAJE C.docx

PARTE 4

19. Enunciado del proyecto

Para que este programa funcione correctamente es necesario habilitar el uso del perro guardián con ProjectEdit Project.

20.Diagrama de bloques

21. Diagrama de Flujo funcional del Programa principal

22. Descripción del algoritmo.

1. Asignar pre escalador 1:64 al perro guardián. 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.

PIC 16F887 8 LEDs

Page 13: PRACTIK6-INTERRUPCIONES Y TEMPORIZADORES EN LENGUAJE C.docx

5. Lazo infinito limpiando el perro guardián.

23. Programa fuente en lenguaje ensamblador.

24. Copia impresa del circuito armado en PROTEUS para la simulación en el momento de su ejecución

/* * Nombre del Proyecto: P6d_wdt.c * Nombre del Autor: (c) Mikroelektronika, 2009. * Description: (Explicación 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 guardián 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); // 30mS delay PORTB = 0xF0; // Porta B value different from initial

while (1){

asm CLRWDT; // Assembly command to reset WDT timer

}}

Page 14: PRACTIK6-INTERRUPCIONES Y TEMPORIZADORES EN LENGUAJE C.docx

RESPONDER:1) Quite la instrucción: asm CLRWDT y explique lo que ocurre.

El perro guardián resetea el sistema.

25.Conclusiones

TMR0 y TMR2 tienen un valor aproximado por interrupción. 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 simulación 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 podría provocar problemas e impedir la compilación. 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 función ‘label’ para no tener errores de compilación.

Se recomienda utilizar cristales de cuarzo en circuitos donde la precisión de los retardos es un factor crítico. La precisión 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 precisión.