Академический Документы
Профессиональный Документы
Культура Документы
OBJETIVOS:
Familiarizarse con el entorno de programacin en Lenguaje C Comprender el manejo de interrupciones en C Trabajar con temporizadores y el Perro Guardin (WDT)
PIC16F887
ENCENDIDO DE LEDS QUE REPRESENTAN UN VALOR QUE TENDRAN EN LAS DISTINTAS INTERRUPCIONES PORTB
SETEO DE PUERTOS,INICIALIZAR VARIABLES; TMR0=96 CONFIGURACIN DE LA INTERRUPCIN USANDO EL TMR0 COMO TEMPORIZADOR
LAZO WHILE
Cnt=400
PORTB<=PORTB+1
0=>Cnt
TOIF=1
INICIO DE INTERRUPCIN
Programa Principal 2
INICIO
SETEO DE PUERTOS,INICIALIZAR VARIABLES; TMR1H=0X80h,TMR1L=0X00h CONFIGURACIN DE LA INTERRUPCIN USANDO EL TMR1 COMO TEMPORIZADOR
LAZO WHILE
F
Cnt=76
PORTB<=COMP(PORTB)
0=>Cnt
TMR1IF=1
INICIO DE INTERRUPCIN
Programa Principal 3
INICIO
SETEO DE PUERTOS,INICIALIZAR VARIABLES; TMR2<=0X00H CONFIGURACIN DE LA INTERRUPCIN USANDO EL TMR2 COMO TEMPORIZADOR
LAZO WHILE
F
Cnt>30
PORTB<=COMP(PORTB)
0=>Cnt
PIR1,TMR2IF=1
INICIO DE INTERRUPCIN
Programa Principal 4
INICIO
SETEO DE PUERTOS,INICIALIZAR VARIABLES; TMR2<=0X00H CONFIGURACIN DE LA INTERRUPCIN USANDO EL TMR0 COMO TEMPORIZADOR DEL WDT
V
PORTB=0XF0h
bandera WDT=1
WDT<=0
Subrutina Parte 1
INICIO INTERRUPCION
Subrutina Parte 2
INICIO INTERRUPCION
Cnt<= cnt+1
Cnt<= cnt+1
TMR0<=96
TMR1H=0X80h TMR1L=0X00h
INTCON<= 0X20
TMR1IF<=0
Subrutina Parte 3
INICIO INTERRUPCION
Cnt<= cnt+1
TMR2<=0
PIR1,TMR2IF<=0
// 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
Programa 2
/* * 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 TMR1 se desborda ocurre una interrupcin. Dentro de cada Interrupcin aumenta el valor de cnt, el cual cuenta cada interrupcin Realizada en el programa. Realiza el complement del valor anterior del puerto B, cada vez que se produzca 76 interrupciones; Lo que reinicia el contador de las interrupciones cnt.
*/ /*Header******************************************************/ unsigned short cnt; // Define variable cnt void interrupt() { cnt++; PIR1.TMR1IF = 0; 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); } // Interrupt causes cnt to be incremented by 1 // Reset bit TMR1IF // 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
Programa 3
/* * 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 TMR2 se desborda ocurre una interrupcin. Dentro de cada Interrupcin aumenta el valor de cnt, el cual cuenta cada interrupcin Realizada en el programa. Presenta el complemento del valor anterior del puerto B cada vez que se produzca mas de 30interrupciones. Lo que reinicia el contador de las interrupciones cnt. */ /*Header******************************************************/ unsigned short cnt; void Replace() { PORTB = ~PORTB; } // Define variable cnt // Define new function Replace // Function inverts port state If bit TMR2IF = 1, Increment variable cnt by 1 Reset bit and reset register TMR2
void main() { cnt = 0; ANSEL = 0; ANSELH = 0; PORTB = 0b10101010; TRISB = 0; T2CON = 0xFF; TMR2 = 0; PIE1.TMR2IE = 1; INTCON = 0xC0; while (1) { if (cnt > 30) { Replace(); cnt = 0; } } }
// Reset variable cnt // All I/O pins are configured as digital // // // // // // // // // // Logic state on port B pins 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 Change PORTB after more than 30 interrupts Function Replace inverts the port B state Reset variable cnt
Programa 4
/* * 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: El cuarto programa utiliza el WDT como temporizador. Al ejecutarse el programa cada vez que se desborde el WDT, reinicia el programa principal; El cual contiene un retardo de 30 milisegundos entre la presentacin de los valores 0x0F h y 0xF0 h en el puerto B. Solo suceder la anterior ejecucin al borrar la sentencia de encerar el valor del WDT; Caso contrario nunca ocurrir el desborde del WDT y solo se presentar una vez la ejecucin. */ /*Header******************************************************/ void main() { OPTION_REG = 0x08; // Prescaler is assigned to timer WDT (1:64) WDTCON = 1; PORTB = 0x0F; TRISB = 0; Delay_ms(300); PORTB = 0xF0; while (1) { asm CLRWDT; } // Initial value of the PORTB register // All port B pins are configured as outputs // 30mS delay // Porta B value different from initial
6).- Copia impresa del circuito armado en PROTEUS para la simulacin en el momento de su ejecucin. PROGRAMA 1: EN EL PUERTO B SE ENCUENTRAN LOS VALORES QUE TOMAN LOS LED EN CADA INTERRUPCIN.
U1
15 16 17 18 23 24 25 26 19 20 21 22 27 28 29 30 8 9 10 RC0/T1OSO/T1CKI RE3/MCLR/VPP RC1/T1OSI/CCP2 RC2/P1A/CCP1 RA0/AN0/ULPWU/C12IN0RC3/SCK/SCL RA1/AN1/C12IN1RC4/SDI/SDA RA2/AN2/VREF-/CVREF/C2IN+ RC5/SDO RA3/AN3/VREF+/C1IN+ RC6/TX/CK RA4/T0CKI/C1OUT RC7/RX/DT RA5/AN4/SS/C2OUT RA6/OSC2/CLKOUT RD0 RA7/OSC1/CLKIN RD1 RD2 RB0/AN12/INT RD3 RB1/AN10/C12IN3RD4 RB2/AN8 RD5/P1B RB3/AN9/PGM/C12IN2RD6/P1C RB4/AN11 RD7/P1D RB5/AN13/T1G RB6/ICSPCLK RE0/AN5 RB7/ICSPDAT RE1/AN6 RE2/AN7 PIC16F887 RB7 1 2 3 4 5 6 7 14 13 33 34 35 36 37 38 39 40 RB0 RB1 RB2 RB3 RB4 RB5 RB6 RB7 RB0
MCLR
R1
10k
D1 D2
RB1 LED-RED
R9
330
R8
330
D3
RB2
LED-RED
R7
330
D4
RB3
LED-RED
R6
330
D5
RB4
LED-RED
R5
330
RB5
R4
330
RB6
R3
330
R2
330
MCLR
R1
10k
U1
MCLR
1 2 3 4 5 6 7 14 13 33 34 35 36 37 38 39 40 RB0 RB1 RB2 RB3 RB4 RB5 RB6 RB7 RB0
R1
10k
D1 D2
RB1 LED-RED
R9
330
R8
330
RB2
D3 LED-RED D4 LED-RED D5
LED-RED
15 16 17 18 23 24 25 26 19 20 21 22 27 28 29 30 8 9 10
R7
330
RB3
R6
330
RB4
R5
330
RB5
D6 LED-RED D7 LED-RED D8
LED-RED
R4
330
RB6
R3
330
RC0/T1OSO/T1CKI RE3/MCLR/VPP RC1/T1OSI/CCP2 RC2/P1A/CCP1 RA0/AN0/ULPWU/C12IN0RC3/SCK/SCL RA1/AN1/C12IN1RC4/SDI/SDA RA2/AN2/VREF-/CVREF/C2IN+ RC5/SDO RA3/AN3/VREF+/C1IN+ RC6/TX/CK RA4/T0CKI/C1OUT RC7/RX/DT RA5/AN4/SS/C2OUT RA6/OSC2/CLKOUT RD0 RA7/OSC1/CLKIN RD1 RD2 RB0/AN12/INT RD3 RB1/AN10/C12IN3RD4 RB2/AN8 RD5/P1B RB3/AN9/PGM/C12IN2RD6/P1C RB4/AN11 RD7/P1D RB5/AN13/T1G RB6/ICSPCLK RE0/AN5 RB7/ICSPDAT RE1/AN6 RE2/AN7 PIC16F887
D1 D2
RB1 LED-RED
R9
330
R8
330
RB2
D3 LED-RED D4 LED-RED D5
LED-RED
R7
330
RB3
R6
330
RB4
R5
330
RB5
D6 LED-RED D7 LED-RED D8
LED-RED
R4
330
RB6
R3
330
R2
330
RB7
R2
330
LED-RED
LED-RED
MCLR D1
RB0
R1
10k
U1
MCLR
1 2 3 4 5 6 7 14 13 33 34 35 36 37 38 39 40 RB0 RB1 RB2 RB3 RB4 RB5 RB6 RB7
R1
10k
R9
330 LED-RED
D2
RB1
R8
330
D3
RB2
15 16 17 18 23 24 25 26 19 20 21 22 27 28 29 30 8 9 10
LED-RED
R7
330
D4
RB3
LED-RED
R6
330
D5
RB4
LED-RED
R5
330
D6
RB5
LED-RED
R4
330
D7
RB6
LED-RED
R3
330
RC0/T1OSO/T1CKI RE3/MCLR/VPP RC1/T1OSI/CCP2 RC2/P1A/CCP1 RA0/AN0/ULPWU/C12IN0RC3/SCK/SCL RA1/AN1/C12IN1RC4/SDI/SDA RA2/AN2/VREF-/CVREF/C2IN+ RC5/SDO RA3/AN3/VREF+/C1IN+ RC6/TX/CK RA4/T0CKI/C1OUT RC7/RX/DT RA5/AN4/SS/C2OUT RA6/OSC2/CLKOUT RD0 RA7/OSC1/CLKIN RD1 RD2 RB0/AN12/INT RD3 RB1/AN10/C12IN3RD4 RB2/AN8 RD5/P1B RB3/AN9/PGM/C12IN2RD6/P1C RB4/AN11 RD7/P1D RB5/AN13/T1G RB6/ICSPCLK RE0/AN5 RB7/ICSPDAT RE1/AN6 RE2/AN7 PIC16F887
D1
RB0
R9
330 LED-RED
D2
RB1
R8
330
D3
RB2
LED-RED
R7
330
D4
RB3
LED-RED
R6
330
D5
RB4
LED-RED
R5
330
D6
RB5
LED-RED
R4
330
D7
RB6
LED-RED
R3
330
D8
RB7
LED-RED
R2
330
D8
RB7
LED-RED
R2
330
LED-RED
LED-RED
PROGRAMA 4: SE PUEDE ONSERVAR QUE EL PROGRAMA SOLO EJECUTA UNA VEZ EL CAMBIO DE 0XF0 A 0X0F EN EL PUERTO B.
U1
15 16 17 18 23 24 25 26 19 20 21 22 27 28 29 30 8 9 10 RC0/T1OSO/T1CKI RE3/MCLR/VPP RC1/T1OSI/CCP2 RC2/P1A/CCP1 RA0/AN0/ULPWU/C12IN0RC3/SCK/SCL RA1/AN1/C12IN1RC4/SDI/SDA RA2/AN2/VREF-/CVREF/C2IN+ RC5/SDO RA3/AN3/VREF+/C1IN+ RC6/TX/CK RA4/T0CKI/C1OUT RC7/RX/DT RA5/AN4/SS/C2OUT RA6/OSC2/CLKOUT RD0 RA7/OSC1/CLKIN RD1 RD2 RB0/AN12/INT RD3 RB1/AN10/C12IN3RD4 RB2/AN8 RD5/P1B RB3/AN9/PGM/C12IN2RD6/P1C RB4/AN11 RD7/P1D RB5/AN13/T1G RB6/ICSPCLK RE0/AN5 RB7/ICSPDAT RE1/AN6 RE2/AN7 PIC16F887 RB7 1 2 3 4 5 6 7 14 13 33 34 35 36 37 38 39 40 RB0 RB1 RB2 RB3 RB4 RB5 RB6 RB7 RB0
MCLR
R1
10k
U1
MCLR
1 2 3 4 5 6 7 14 13 33 34 35 36 37 38 39 40 RB0 RB1 RB2 RB3 RB4 RB5 RB6 RB7 RB0
R1
10k
D1 D2 LED-RED D3 LED-RED D4
RB3 LED-RED
R9
330
RB1
R8
330
15 16 17 18 23 24 25 26 19 20 21 22 27 28 29 30 8 9 10
RB2
R7
330
R6
330
RB4
D5 LED-RED D6 LED-RED D7
LED-RED
R5
330
RB5
R4
330
RB6
R3
330
RC0/T1OSO/T1CKI RE3/MCLR/VPP RC1/T1OSI/CCP2 RC2/P1A/CCP1 RA0/AN0/ULPWU/C12IN0RC3/SCK/SCL RA1/AN1/C12IN1RC4/SDI/SDA RA2/AN2/VREF-/CVREF/C2IN+ RC5/SDO RA3/AN3/VREF+/C1IN+ RC6/TX/CK RA4/T0CKI/C1OUT RC7/RX/DT RA5/AN4/SS/C2OUT RA6/OSC2/CLKOUT RD0 RA7/OSC1/CLKIN RD1 RD2 RB0/AN12/INT RD3 RB1/AN10/C12IN3RD4 RB2/AN8 RD5/P1B RB3/AN9/PGM/C12IN2RD6/P1C RB4/AN11 RD7/P1D RB5/AN13/T1G RB6/ICSPCLK RE0/AN5 RB7/ICSPDAT RE1/AN6 RE2/AN7 PIC16F887
D1 D2 LED-RED D3 LED-RED D4
RB3 LED-RED
R9
330
RB1
R8
330
RB2
R7
330
R6
330
RB4
D5 LED-RED D6 LED-RED D7
LED-RED
R5
330
RB5
R4
330
RB6
R3
330
D8 LED-RED
LED-RED
R2
330
RB7
D8 LED-RED
LED-RED
R2
330
7.- Conclusiones Al final de la prctica el objetivo fundamental fue, familiarizarse con la programacin del microcontrolador en leguaje C en el programa MIKROC; El cual en cierta medida es mucho ms amigable con el usuario, que el lenguaje ensamblador. Tambin hay que recordar que el lenguaje ensamblador es una base de los procesos que se realizaran en C; Siendo un lenguaje ms complejo y eficaz que el C. Se pudo analizar que el manejo de las interrupciones en el lenguaje C son mucho ms fcil de hacer; No es necesario demasiadas lneas de cdigo para realizar un proceso muy largo. Adems el lenguaje C de MIKROC incluye libreras personalizadas para trabajar con cualquier familia del microcontrolador MICROCHIP. El programa MIKROC tambin nos permite escribir comandos propios del lenguaje ensamblador en la estructura de nuestro programa; Siendo una ventaja libre y verstil al trabajar programando un microcontrolador. En esta prctica el diferente uso de las interrupciones por TIMER0, TIMER1, TIMER2 o el WDT, es similar que en el lenguaje ensamblador. Siempre se tendr que configurar los registros de control de cada temporizador y a su vez en cada interrupcin, encerar la bandera de cada timer. Se pudo observar que el WDT, cada vez que se produce su desborde; Reinicia el programa a la primera posicin de la pila de ejecucin. Se pudo observar que el TIMER2 trabaja de forma diferente a los otros dos temporizadores; Adems de tener un pre-escalador y un post-escalador; La
manera de trabajar es comparando su valor con el registro PR2. Que cuando sean iguales produzcan la interrupcin, caso contrario no. Se observ que el TIMER1 posee 16 bits para contar en cada ejecucin; Dividido en dos registros los cuales son: TIMER1H y TIMER1L.
8.- Recomendaciones
Al usar el programa MICROC se debe recordar que ahora, se guarda el archivo de nuestro programa con extensin .c ya que utilizaremos este lenguaje.
Al realizar el programa el lenguaje C, facilita modularizar nuestro programa; Creando funciones las cuales pueden servir dentro del miso programa ms de una vez.
Se debe recordar que siempre se debe configurar los registros del control de cada temporizador para poder usarlos con la funcin que uno desee.
No olvidar encerar el valor de las banderas del temporizador utilizado, en cada interrupcin; Ya que si no se lo realiza nunca saldr de la interrupcin.
Al momento de usar el WDT, se debe tener consideracin que dentro del programa se debe de reiniciar su valor, dentro de procesos que no lo utilice; Ya que puede reiniciar el proceso en una posicin del programa que no sea la debida.
ANEXO
RESPONDER Primer programa: 1) Luego de analizar el programa coloque en la cabecera la descripcin correspondiente. Cada vez que el TMR0 se desborda ocurre una interrupcin. Dentro de cada interrupcin aumenta el valor de cnt, el cual cuenta cada interrupcin Realizada en el programa. Aumenta el valor del puerto B, cada vez que se produzca 400 interrupciones; Lo que reinicia el contador de las interrupciones cnt. 2) Verifique el tiempo que demora en ocurrir una interrupcin
Segundo programa: 1) Luego de analizar el programa coloque en la cabecera la descripcin correspondiente. Cada vez que el TMR1 se desborda ocurre una interrupcin. Dentro de cada Interrupcin aumenta el valor de cnt, el cual cuenta cada interrupcin Realizada en el programa. Realiza el complemento del valor anterior del puerto B, cada vez que se produzca 76 interrupciones; Lo que reinicia el contador de las interrupciones cnt. 2) Cada qu tiempo se interrumpe con el Timer 1
Tercer Ejercicio 1) Luego de analizar el programa coloque en la cabecera la descripcin correspondiente. Cada vez que el TMR2 se desborda ocurre una interrupcin. Dentro de cada interrupcin aumenta el valor de cnt, el cual cuenta cada interrupcin realizada en el programa. Presenta el complemento del valor anterior del puerto B, cada vez que se produzca ms de 30 interrupciones; Lo que reinicia el contador de las interrupciones cnt.
Cuarto Ejercicio 1) Luego de analizar el programa coloque en la cabecera la descripcin correspondiente. El cuarto programa utiliza el WDT como temporizador. Al ejecutarse el programa cada vez que se desborde el WDT, reinicia el programa principal; El cual contiene un retardo de 30 milisegundos entre la presentacin de los valores 0x0F h y 0xF0 h en el puerto B. Solo suceder la anterior ejecucin al borrar la sentencia de encerar el valor del WDT; Caso contrario nunca ocurrir el desborde del WDT y solo se presentar una vez la ejecucin. 2) Quite la instruccin: asm CLRWDT y explique lo que ocurre. Al ejecutarse el programa cada vez que se desborde el WDT, reinicia el programa principal; El cual contiene un retardo de 30 milisegundos entre la presentacin de los valores 0x0F h y 0xF0 h en el puerto B. Esto ocurre ya que cada vez que se produce la iteracin en el lazo while, al estar no estar CLRWDT; Ya que este enceraba el valor de
WDT lo cual nunca iba a producir un desborde, con lo que al final nunca se producira un reset en el programa y no se presentara el cambio de valor en el puerto B.