Reporte 6

Post on 07-Feb-2016

6 views 0 download

Transcript of Reporte 6

ESCUELA SUPERIOR POLITÉCNICA DEL LITORAL

FIEC

Laboratorio de Microcontroladores

Práctica #6

Interrupciones y Temporizadores en Lenguaje C

Alumnos:

Milton Andrés Romero QuirozGermán Ramos León

Paralelo: # 10

Grupo: # 4

Fecha de presentación:15-diciembre-2011

2011 – II TÉRMINO

1. Enunciado del proyecto

En la parte a se trata del encendido y apagado de LEDS a través del puerto B usando interrupciones debido al Timer0.En la parte b se trata del encendido y apagado de un grupo de 4 LEDS a través del puerto B gracias al uso de las interrupciones debido al Timer1.En la parte c se trata del encendido y apagado de LEDS a través del puerto B usando las interrupciones debido al Timer2.En la parte d se trata del encendido y apagado de un grupo de LEDS a través del puerto B gracias al uso de la interrupción que ocurre cuando desborda el perro guardián.

2. Diagramas de bloques

Parte a – b – c – d

PIC16F887

LEDS

3.- Diagrama de Flujo funcional del Programa principal

Parte a

Parte b

Parte c

Parte d

4.- Diagrama de Flujo funcional de las Subrutinas

Parte a

Parte b

Parte c

5.- Descripción del algoritmo o estrategia utilizada

Parte a

1. Definimos el tipo de microcontrolador, seteamos los parámetros de configuración.

2. Definimos la variable cnt.

3. Se configura al PORTB como salidas digitales y se programa al TMR0 como temporizador con un pre-escalador de 32.

4. Se encera el PORTB, se le asigna de valor inicial al TMR0 de 96.

5. Se habilitan las interrupciones por desbordamiento del TMR0 y se encera la variable cnt.

6. Si cnt es igual a 400, se incrementa el valor de PORTB y se encera la variable cnt. Si cnt no es igual a 400, se vuelve a preguntar hasta que sea igual a 400.

Interrupción

1. Se incrementa en uno la variable cnt.

2. Se setea el valor inicial de TMR0 con 96 y se borra la bandera de interrupción del TMR0 (T0IF).

Parte b

1. Definimos el tipo de microcontrolador, seteamos los parámetros de configuración.

2. Definimos la variable cnt, y configuramos al PORTB como salidas digitales.

3. Se habilitan las interrupciones por desbordamiento del TMR1 y enceramos la variable cnt.

4. Seteamos un valor inicial a PORTB de 0xF0.

5. Si cnt es igual a 76, PORTB toma el valor de 0x0F y se encera la variable cnt. Si cnt no es igual a 76, se vuelve a preguntar hasta que sea igual a 76.

Interrupción

1. Se incrementa en uno la variable cnt.

2. Se encera la bandera de interrupción del TMR1 y TMR1H como TMR1L toman sus valores iniciales.

Parte c

1. Definimos el tipo de microcontrolador, seteamos los parámetros de configuración.

2. Definimos la variable cnt, y configuramos al PORTB como salidas digitales.

3. Se programan las interrupciones por desbordamiento del TMR2 y le damos un valor inicial a TMR2 de cero.

4. Seteamos un valor inicial a PORTB de 0xAA.

5. Seteamos los bits GIE y PEIE del registro INTCON.

6. Si cnt es mayor a 30, PORTB toma el valor de 0x55y se encera la variable cnt. Si cnt no es mayor a 30, se vuelve a preguntar hasta que sea mayor a 30.

Interrupción

1. Si la bandera de interrupción del TMR2 ha sido activada, entonces se incrementa en uno la variable cnt, se encera dicha bandera y se le vuelve a asignar el valor inicial de cero.

2. Si dicha bandera no ha sido activada, es porque aun no ocurre una interrupción.

Parte d

1. Definimos el tipo de microcontrolador, seteamos los parámetros de configuración.

2. Se configura al PORTB como salidas digitales y se programa al WDT como temporizador con un pre-escalador de 64.

3. Se encera al WDT.

4. Seteamos un valor inicial a PORTB de 0x0F.

5. Definimos un retardo de 30 ms y seteamos a PORTB con un valor de 0xF0.

6. El programa se mantendrá aquí hasta que ocurra un reseteo del PIC debido al desbordamiento del WDT.

6.- Listado del programa fuente en lenguaje ensamblador con comentarios en las líneas de código que considere fundamentales.

Parte a

/* * Nombre del Proyecto: P6a_t0.c * Nombre del Autor: (c) Mikroelektronika, 2009. * Description: El programa consiste en el apagado y encendido de LEDS debido a que se hace incrementar a PORTB desde 0x00 hasta 0xFF y esto ocurre cuando existe una interrupción del TMR0. * 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}

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 b

/* * Nombre del Proyecto: P6b_t1.c * Nombre del Autor: (c) Mikroelektronika, 2009. * Description: El programa consiste en el apagado y encendido de LEDS debido a que se hace variar a PORTB entre 0xF0 y 0x0F y esto ocurre cuando existe una interrupción del TMR1. * 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

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 c

/* * Nombre del Proyecto: P6c_t2.c * Nombre del Autor: (c) Mikroelektronika, 2009. * Description: El programa consiste en el apagado y encendido de LEDS debido a que se hace variar a PORTB entre 0xAA y 0x55 y esto ocurre cuando existe una interrupción del TMR2. * 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

*/

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

Parte d

/* * Nombre del Proyecto: P6d_wdt.c * Nombre del Autor: (c) Mikroelektronika, 2009. * Description: El programa consiste en el apagado y encendido de LEDS debido a que se hace variar a PORTB entre 0x0F y 0XF0 y esto ocurre cuando existe una interrupción del WDT. * 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 = 0x0E; // Prescaler is assigned to timer WDT (1:64)

asm CLRWDT; // Assembly command to reset WDT timer

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); // Endless loop. Program remains here until WDT // timer resets the microcontroller}

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

Parte a

Parte b

Parte c

Parte d

8. Conclusiones

Al utilizar el lenguaje C para programar resulta mucho mas sencillo que al programar en lenguaje ensamblador, debido a que el lenguaje C es de mayor nivel lo que simplifica las líneas de código ya que unas cuantas líneas en lenguaje C pueden significar cientos de líneas de código en lenguaje ensamblador

El espacio de trabajo mikroC es un poco distinto al que se utilizaba en Mplab pero funcionan de la misma manera, aunque en mikroC es diferente la forma en que se utiliza el timer para observar el tiempo que toma algún lazo o alguna interrupción

9. Anexos

Parte a

1. Verifique el tiempo que demora en ocurrir una interrupción

2.56 mseg.

2. Cuanto demoran las 400 interrupciones?

1.024 seg.

Parte b

1. Cada qué tiempo se interrumpe el TMR1?

131.07 mseg.

2. Cuanto demoran las 76 interrupciones?

9.961 seg.

Parte c

1. Cada qué tiempo se interrumpe el TMR2?

32.76 mseg.

2. Cuanto demoran las 31 interrupciones?

1.015 seg.

Parte d

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

Según lo que pude ver, no ocurrió nada.