You are on page 1of 22

ESCUELA SUPERIOR POLITCNICA DEL LITORAL

FIEC

Laboratorio de Microcontroladores

Prctica 6

EJERCICIOS SOBRE INTERRUPCIONES Y TEMPORIZADORES EN LENGUAJE C

Alumnos

Briones Espinoza Petter Glvez Nan Daniel

Paralelo: 3 Grupo: 1

Fecha de presentacin: 19 - 07 - 2013

2013 1 TRMINO

1.- Enunciado del proyecto En este proyecto vamos a utilizar el lenguaje C para programar el PIC en cuestin que hemos utilizado a lo largo del curso ya que este lenguaje nos permite mayor facilidad al momento de la programacin y el programa que soporta este lenguaje es mikroC PRO for PIC de Mikroelektronika y para la simulacin emplearemos PROTEUS.

2.- Diagrama de Bloques


PIC16F8 87
FUENTE DE

DISPL AY DE 7 SEGM ENTO S

3.- Diagrama de Flujo funcional del Programa principal y de las subrutinas.

PROGAMA 1 = P6a_t0.c

INICI O

unsigned cnt;

void main() { }

OPTION_REG = 0x84;

Seteo de bancos y puertos

INTCON = 0xA0;

cnt = 0;

do { subrutina} while(1);

end

SUBRUTINA 1 = P6a_t0.c
INICIO SUBRUTINA

cnt ==400

No

PORTB = PORTB++; cnt = 0;

RETURN

PROGAMA 2= P6a_t1.c
INICI O

unsigned cnt;

void main() { }

Seteo de bancos y puertos

PIR1.TMR1IF = 0;

TMR1H = 0x80; TMR1L = 0x00;

PIE1.TMR1IE = 1

cnt = 0;

INTCON = 0XC0

do {subrutina (1);

end

SUBRUTINA 2 = P6a_t1.c

INICIO SUBRUTINA

cnt ==76

No

PORTB = ~PORTB; cnt = 0; RETURN

PROGAMA 3= P6a_t2.c
INICI O

unsigned cnt;

void main() { }

ANSEL = 0; ANSELH = 0;

PORTB = 0b10101010;

TRISB = 0; TMR2 = 0;

PIE1.TMR2IE = 1;

INTCON = 0XC0

do {subrutina } (1);

end

SUBRUTINA 3 = P6a_t2.c

INICIO SUBRUTINA

No cnt > 30

Replace();

cnt = 0;

RETURN

SUBRUTINA 4 = P6a_t2.c
INICIO SUBRUTINA

PORTB = ~PORTB;

RETURN

PROGAMA 4= P6d_wdt.c

INICI O

void main() {

OPTION_REG = 0x08;

WDTCON=0X01;

asm CLRWDT;

PORTB = 0x0F; TRISB = 0;

Delay_ms(300);

PORTB = 0xF0;

while (1)

end

4.- Descripcin del algoritmo o estrategia utilizada. PROGRAMA 1: P6a_t0.c 1. Declaramos la variable contador con la instruccin unsigned cnt; 2. La ejecucin del programa viaja directamente al prototipo viod main { 3. Se mueve 0x84 a OPTION_REG el cual configura al TIMER0 como temporizador, desactiva las interrupciones externas generadas por las resistencias PULL UP del PORTB y el pre-escalador del TIMER0 queda configurado con 1:8. 4. Se configuran los puertos como digitales. 5. Se configuran PORTB como salida. 6. Se encera PORTB. 7. Se le asigna un valor al TIMER0 con el objetivo de obtener cierto valor. 8. Habilitamos las banderas para las interrupciones globales, interrupciones por desbordamientos del TIMER0. 9. Enceramos la variable cnt. 10. Se ingresa al lazo infinito do-while. 11. Se verifica que el contador ser igual a 400

a. Si es verdadero ingresamos a la subrutina b. Si es falso no ingresa y se espera a que el TIMER0 se desborde y se genere una interrupcin.

SUBRUTINA PROGRAMA 1: P6a_t0.c 1. Se incrementa el valor del PORTB. 2. Se encera el valor de la variable cnt. 3. Se regresa a la ejecucin normal del programa.

PROGRAMA 2: P6a_t1.c 1. 2. 3. 4. 5. 6. Declaramos la variable contador con la instruccin unsigned cnt; El programa continua con el prototipo void main { Seteo de bancos y puertos. Se configura T1CON con 1 para habilitar el TIMER1. Habilita la bandera del TIMER1 en el registro PIR1. Se inicializan los valores de TMR1H y TMR1L con 0x80 y 0x00 respectivamente. 7. Enceramos la variable cnt. 8. Se habilitan las interrupciones globales en el registro INTCON. 9. Se ingresa en el lazo do { subrutina } while (1); 10. Se viaja a la subrutina cuando se desborda el TIMER1 11. Fin del programa.

SUBRUTINA PROGRAMA 2: P6a_t1.c 1. Se invierte el PORTB 2. Se encera el valor de la variable cnt. 3. Se regresa a la ejecucin normal del programa. PROGRAMA 3: P6a_t2.c 1. Declaramos la variable contador con la instruccin unsigned cnt; 2. El programa continua con el prototipo void main { 3. Enceramos la variable cnt. 4. Seteo de bancos y puertos. 5. Se mueve PORTB = 0b10101010 6. Se configura PORTB como salida por medio de la instruccin TRISB 7. Se configura T2CON = 0xFF; lo cual asigna el pos-escalador 1:16 al TIMER2, con TMR2On=1 enciende el funcionamiento del TIMER2 y se configura el pre-escalador 1:16 8. Se encera el TIMER2 9. Con PIE1.TMR2IE = 1; habilitamos la bandera de interrupciones del TIMER2. 10. Se habilitan las interrupciones globales por medio INTCON=0XC0

11. Se ingresa en el lazo do {subrutina} while (1);

12. Se viaja a la subrutina cuando se desborda el TIMER2 13. Fin del programa. SUBRUTINA 1 PROGRAMA 3:P6a_t2.c INTERRUPCIN 1. Ingresa a PIR1.TMR2IF si la bandera est deshabilitada. 2. Incrementa la variable cnt. 3. Habilita las banderas para interrupciones para el TIMER2 4. Se encera el TIMER2 5. Se regresa de al programa principal SUBRUTINA 2 PROGRAMA 3:P6a_t2.c REPLACE 1. Se invierte el PORTB 2. Se regresa a la ejecucin normal del programa. PROGRAMA 3: P6d_wdt.c 1. El programa continua con el prototipo void main { 2. Asigna el pre-escalador al WDT 3. Le asigna un valor al perro guardian 4. Comando de ensamblador para el perro guardian 5. Se asigna PORTB = 0x0F; 6. Seteo de bancos y puertos. 7. Se llama al DELAY por 300miseg. 8. Se invierten los valores en PORTB = 0xF0; 9. Se ingresa a un lazo mudo para esperar el desbordamiento del WDT 10. Se va a la subrutina de la interrupcin del WDT, 11. Fin del programa

5.- Listado del programa fuente en lenguaje ensamblador con comentarios en las lneas de cdigo que considere fundamentales

PROGRAMA1: P6a_t0.c
/* * Nombre del Proyecto: P6a_t0.c * Nombre del Autor: (c) Mikroelektronika, 2009. * Description: ESTE PROGRAMA PRENDE UN LED CADA OCASIONADAS POR EL TIMER0 * Test configuration: MCU: PIC16F887 Oscillator: HS, 08.0000 MHz SW: mikroC PRO for PIC * NOTES: 400 INTERRUPCIONES LAS CUALES SON

Cada vez que el TMR0 se desborda ocurre una interrupcin */ /*Header******************************************************/ unsigned cnt; void interrupt() { cnt++; TMR0 = 96; INTCON = 0x20; } void main() { OPTION_REG = 0x84; ANSEL = 0; ANSELH = 0; TRISB = 0; PORTB = 0x0; TMR0 = 96; INTCON = 0xA0; cnt = 0; do { if (cnt == 400) { PORTB = PORTB++; cnt = 0; } } while(1); } // Define variable cnt // Interrupt causes cnt to be incremented by 1 // Timer TMR0 is returned its initial value // Bit T0IE is set, bit T0IF is cleared

// Prescaler is assigned to timer TMR0 // All I/O pins are configured as digital // // // // // // // // // All port B pins are configured as outputs Reset port B Timer T0 counts from 96 to 255 Enable interrupt TMR0 Variable cnt is assigned a 0 Endless loop Increment port B after 400 interrupts Increment number on port B by 1 Reset variable cnt

PROGRAMA2: P6a_t1.c
/* * Nombre del Proyecto: P6b_t1.c * Nombre del Autor: (c) Mikroelektronika, 2009. * Description: Este programa trabaja con el TIMER1 cuando este se desborda entonces se invierte el valor que inicialmente este puerto * 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++ ; PIR1.TMR1IF = 0; // Interrupt causes cnt to be incremented by 1 // Reset bit TMR1IF

TMR1H = 0x80; TMR1L = 0x00; } void main() { ANSEL = 0; ANSELH = 0; PORTB = 0xF0; TRISB = 0; T1CON = 1; PIR1.TMR1IF = 0; TMR1H = 0x80; TMR1L = 0x00; PIE1.TMR1IE = 1; cnt = 0; INTCON = 0xC0; do { if (cnt == 76) { PORTB = ~PORTB; cnt = 0; } } while (1); }

// TMR1H and TMR1L timer registers are returned // their initial values

// All I/O pins are configured as digital // // // // // Initial value of port B bits Port B pins are configured as outputs Set timer TMR1 Reset bit TMR1IF Set initial value for timer TMR1

// Enable interrupt on overflow // Reset variable cnt // Enable interrupt (bits GIE and PEIE) // // // // Endless loop Change port B state after 76 interrupts Number in port B is inverted Reset variable cnt

PROGRAMA3: P6c_t2.c
/* * Nombre del Proyecto: P6c_t2.c * Nombre del Autor: (c) Mikroelektronika, 2009. * Description: Este programa ingresa el valor de * Test configuration: MCU: Oscillator: SW: * NOTES: Cada vez que el TMR2 se desborda ocurre una interrupcin PIC16F887 HS, 08.0000 MHz mikroC PRO for PIC PORTB = 0b10101010 para luego invertirlo cuando el TIMER2 se desborde

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

PIR1.TMR2IF = 0;// Reset bit and

if (cnt > 30) { // Change PORTB after more than 30 interrupts

PROGRAMA 4: P6d_wdt.c
/* * Nombre del Proyecto: P6d_wdt.c * Nombre del Autor: (c) Mikroelektronika, 2009. * Description: Este programa imprime en el PORTB un valor para despus de un retardo Implementado por el DELAY cambian los valores y por ltimo cuando el WDT se desborda se genera un reset * Test configuration: MCU: PIC16F887

Oscillator: SW:

HS, 08.0000 MHz 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:1) WDTCON=0X01;

asm CLRWDT;

// Assembly command to reset WDT timer

PORTB = 0x0F; TRISB = 0;

// Initial value of the PORTB register // All port B pins are configured as outputs

Delay_ms(300); PORTB = 0xF0;

// 30mS delay // Porta B value different from initial

while (1) //{//asm{CLRWDT }} ;

// Endless loop. Program remains here until WDT // timer resets the microcontroller

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

PROGRAMA1: P6a_t0.c

PROGRAMA2: P6a_t1.c

PROGRAMA3: P6a_t2.c

PROGRAMA 4: P6d_wdt.c

7.- Conclusiones

En este proyecto usamos el lenguaje C para poder realizar la implementacin del mismo con una mayor facilidad pero tenemos conocimiento que al utilizar este lenguaje y al convertirlo a ensamblador entonces se genera un mayor bloque de cdigo que si lo hubisemos hecho en principio en ensamblador pero como ahora los PIC cuentan con mayor espacio de memoria entonces no nos preocupamos mucho por eso.

Vimos al importancia de recordar siempre habilitar las interrupciones ya que si no lo hacemos entonces el temporizador TIMER0, TIMER1 y TIMER2 realizar un reset a casa momento y no nos va a permitir seguir con la ejecucin normal del programa, ests bandera se encuentra en el registro INTCON y son los bits GIE y T0IF.

El manejo de un software de simulacin del proyecto que realizamos en cada prctica nos ayuda a ver cmo es que funciona el mismo para cuando sea el momento de realizarlo en placa entonces no tengamos muchas complicaciones y poder realizar el proyecto con xito

8.- Recomendaciones

Como estamos utilizando un nuevo programa para la programacin del PIC entonces lo recomendable es que se prctica de manera frecuente para que as obtengamos mayor facilidad en la utilizacin del mismo. Siempre se deber tener en cuenta la configuracin de la frecuenta que tiene el PIC en el programa de simulacin del circuito PROTEUS, ya que no importa lo que est en el cdigo de ensamblador con respecto a la frecuencias ya que el PIC es el que manda en este aspecto y la frecuencias que utilizamos en esta prctica fue de 4MHz. Tener en cuenta al momento de armar el circuito simulado en PROTEUS, ya que es muy comn que aparezcan ciertos errores como lo son, poner mal la etiqueta en el cable que usamos o peor an no hacer bien el contacto entre los diferentes dispositivos que utilizamos con frecuencia. Tener en cuidado con los cambios bancos, cuando se quiera usar un registro primero se tiene que estar en el banco correspondiente de dicho registro caso contrario habr error, en este caso usamos BANKSELF este busca el banco donde se encuentra el registro.

ANEXO DE RESPUESTAS A PRCTICA 6 INTEGRANTE 1: Briones Espinoza Petter INTEGRANTE 2: Galvez Nan Daniel PARALELO: 3 GRUPO: 1 PROGRAMA1: P6a_t0.c RESPONDER: 1) Luego de analizar el programa coloque en la cabecera la descripcin correspondiente.
/* * Nombre del Proyecto: P6a_t0.c * Nombre del Autor: (c) Mikroelektronika, 2009. * Description: ESTE PROGRAMA PRENDE UN LED CADA 400 INTERRUPCIONES LAS CUALES SON OCASIONADAS POR EL TIMER0 * 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 */

2) Verifique el tiempo que demora en ocurrir una interrupcin 2.56u seg 3) Cunto demoran las 400 interrupciones? 1.024 mseg PROGRAMA2: P6a_t1.c RESPONDER: 1) Luego de analizar el programa coloque en la cabecera la descripcin correspondiente. 2) Cada qu tiempo se interrumpe con el Timer 1 22.52mseg 3) Cunto demoran las 76 interrupciones? 1.71 seg RESPONDER: : P6a_t2.c

1) Luego de analizar el programa coloque en la cabecera la descripcin correspondiente.


/* * Nombre del Proyecto: P6c_t2.c * Nombre del Autor: (c) Mikroelektronika, 2009. * Description: Este programa ingresa el valor de PORTB = 0b10101010 para luego invertirlo cuando el TIMER2 se desborde * 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

2) Cada qu tiempo se interrumpe con el Timer 2


2.09 seg

3) Cunto demoran 31 interrupciones? 65.011 seg

RESPONDER: P6d_wdt.c 1) Luego de analizar el programa coloque en la cabecera la descripcin correspondiente.


/* * Nombre del Proyecto: P6d_wdt.c * Nombre del Autor: (c) Mikroelektronika, 2009. * Description: Este programa imprime en el PORTB un valor para despus de un retardo Implementado por el DELAY cambian los valores y por ltimo cuando el WDT se desborda se genera un reset * Test configuration: MCU: Oscillator: SW: * NOTES: Para que este programa funcione correctamente es necesario habilitar el uso del perro guardin con Project'Edit Project */ PIC16F887 HS, 08.0000 MHz mikroC PRO for PIC

2) Quite la instruccin: asm CLRWDT y explique lo que ocurre. Si eliminamos esta lnea de instruccin en el lenguaje ensamblador no se reinicia el temporizador perro guardin

You might also like