You are on page 1of 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




3.1. Diagrama de Flujo funcional del Programa principal

Inicio
Definir variable cnt
Se configuran los
pines I/O como
digital y los pines de
PortB como salida.
Asigna preescalador
a TMR0
Reset a PortB.
Cnt=0
TMR0=96
Cnt==400
PortB=PortB++
Cnt=0
si
interrupt
no



3.2. Diagrama de Flujo Funcional de la Subrutina

INTERRUPT


PIC 16F887

8 LEDs
Inicio
cnt++
Seteo INTCON=0x20
Bit T0IE es seteado,
bit T0IF es limpiado
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
}















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





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);
}
PARTE 2
7. Enunciado del proyecto

Cada vez que TMR1 (TMR1H, TMR1L) se desborda ocurre una
interrupcin.


8. Diagrama de bloques





9.1 Diagrama de Flujo funcional del Programa principal


Inicio
Se configura los
pines I/O como
digital.
Setear el valor de
TMR1 con el registro
T1CON=1. Resetear
el bit TMR1IF.
Setear TMR1H=0x80
y TMR1L=0x00.
Se inicializa el valor
PorB=0xF0. Los
pines PortB son
configurados como
salida.
Habilitar interrupcin de
TMR1.
PIE1.TMR1IE=1
Resetear variable cnt.
Cnt=0
Habilitar interrupciones,
bits GIE y PEIE.
INTCON=0xC0
Cnt=76
si
INTERRUPT
no
Invertir PortB y limpiar
cnt.


PIC 16F887

8 LEDs
9.2 Diagrama de Flujo funcional de la subrutina INTERRUPT

Inicio
cnt++
Los registros TMR1H
y TMR1L retornan al
valor inicial.
TMR1H=0x80
TMR1L=0x00
Reset bit TMR1IF


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























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

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);
}
PARTE 3
13. Enunciado del proyecto

Cada vez que TMR2 se desborda ocurre una interrupcin.


14. Diagrama de bloques





15.1 Diagrama de Flujo funcional del Programa principal

Inicio
Reset variable cnt.
Se configura los
pines I/O como
digital.
Setear el valor de
TMR2 con el registro
T2CON=0xFF.
Setear TMR2=0.
Se inicializa el valor
PorB=0b10101010.
Los pines PortB son
configurados como
salida.
Habilitar interrupcin de
TMR2.
PIE1.TMR2IE=1
Habilitar interrupciones,
bits GIE y PEIE.
INTCON=0xC0
Cnt>30
si
INTERRUPT
no
Limpiar cnt.
REPLACE


PIC 16F887

8 LEDs

15.2 Diagrama de Flujo funcional de las subrutinas
INTERRUPT

Inicio
TMR2IF=1
si
return
no
cnt++
TMR2IF=0
Resetear el registro
TMR2


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






























18. Copia impresa del circuito armado en PROTEUS para la simulacin en
el momento de su ejecucin


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

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





21. Diagrama de Flujo funcional del Programa principal

Inicio
Asignar pre
escalador 1:64 al
perro guardin.
OPTION_REG=0x08
WDTCONT=1
Retardo de 30
milisegundos.
Delay_ms(300)
Se inicializa el valor
PorB=0x0F. Los
pines PortB son
configurados como
salida.
Valor PortB diferente al
inicial.
PortB=0xF0
Lazo infinito limpiando el
perro guardin


22. Descripcin del algoritmo.

1. Asignar pre escalador 1:64 al perro guardin.
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
5. Lazo infinito limpiando el perro guardin.

23. Programa fuente en lenguaje ensamblador.

























24. Copia impresa del circuito armado en PROTEUS para la simulacin en
el momento de su ejecucin











/*
* 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); // 30mS delay
PORTB = 0xF0; // Porta B value different from initial

while (1)
{
asm CLRWDT; // Assembly command to reset WDT timer

}
}
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.

You might also like