#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use fast_IO(B)
#use fast_IO(D)
#use fast_IO(A)         // Declaraciones generales
#INT_RTCC               // Directiva de inclusión de interrupción por desborde del TMR0
 void RTCC_isr(){       // Función o subrutina que se ejecutará por desborde del TMR0
        output_toggle(PIN_B7);
        set_timer0(198);}
#INT_TIMER1             // Directiva de inclusión de interrupción por desborde del TMR1
void TIMER1_isr(){      // Función o subrutina que se ejecutará por desborde del TMR1
        output_toggle(PIN_B1);
        set_timer1(0xFC1C);}
#INT_EXT                // Directiva de inclusión de interrupción por cambio de nivel en RB0
void ext_interm(){      // Función o subrutina que se ejecutará por cambio de nivel en RB0
                while (TRUE){
                        if (input(PIN_A0)==0)
                        {break;}//return;}//goto A;}
                        delay_ms(250);
                        output_toggle(PIN_D0);
                        output_toggle(PIN_D1);
                }
}
void main(){            // Programa principal
        set_tris_b(0x01);
        set_tris_d(0);
        set_tris_a(0x01);
        output_d(0);
        port_b_pullups(true);
        output_low(PIN_B7);
        output_low(PIN_B1);
        setup_timer_0(RTCC_DIV_8);
        setup_timer_1(T1_INTERNAL|T1_DIV_BY_2);
        ext_int_edge(H_to_L);
        set_timer0(198);
        set_timer1(64540);
        enable_interrupts(INT_RTCC);
        enable_interrupts(INT_TIMER1);
        enable_interrupts(int_ext);
        enable_interrupts(global);
        while(TRUE){
                output_high(PIN_D0);
                output_high(PIN_D1);}
}
Imagen de la simulación sin presionar RB0:




                                             Led’s no alternan su estado y se
                                             producen las interrupciones por
                                             desborde del TMR0 y TMR1.




Imagen de la simulación al presionar RB0:


                                               Led’s alternan su estado cada
                                               250 ms y no se producen las
                                               interrupciones por desborde del
                                               TMR0 y TMR1, al encontrarse
                                               deshabilitadas por atender la
                                               interrupción de RB0/INT.

EJERCICIO ADICIONAL 1ER EXAMEN

  • 1.
    #include <16f877a.h> #fuses XT,NOWDT,NOPROTECT,NOLVP #usedelay(clock=4000000) #use fast_IO(B) #use fast_IO(D) #use fast_IO(A) // Declaraciones generales #INT_RTCC // Directiva de inclusión de interrupción por desborde del TMR0 void RTCC_isr(){ // Función o subrutina que se ejecutará por desborde del TMR0 output_toggle(PIN_B7); set_timer0(198);} #INT_TIMER1 // Directiva de inclusión de interrupción por desborde del TMR1 void TIMER1_isr(){ // Función o subrutina que se ejecutará por desborde del TMR1 output_toggle(PIN_B1); set_timer1(0xFC1C);} #INT_EXT // Directiva de inclusión de interrupción por cambio de nivel en RB0 void ext_interm(){ // Función o subrutina que se ejecutará por cambio de nivel en RB0 while (TRUE){ if (input(PIN_A0)==0) {break;}//return;}//goto A;} delay_ms(250); output_toggle(PIN_D0); output_toggle(PIN_D1); } } void main(){ // Programa principal set_tris_b(0x01); set_tris_d(0); set_tris_a(0x01); output_d(0); port_b_pullups(true); output_low(PIN_B7); output_low(PIN_B1); setup_timer_0(RTCC_DIV_8); setup_timer_1(T1_INTERNAL|T1_DIV_BY_2); ext_int_edge(H_to_L); set_timer0(198); set_timer1(64540); enable_interrupts(INT_RTCC); enable_interrupts(INT_TIMER1); enable_interrupts(int_ext); enable_interrupts(global); while(TRUE){ output_high(PIN_D0); output_high(PIN_D1);} }
  • 2.
    Imagen de lasimulación sin presionar RB0: Led’s no alternan su estado y se producen las interrupciones por desborde del TMR0 y TMR1. Imagen de la simulación al presionar RB0: Led’s alternan su estado cada 250 ms y no se producen las interrupciones por desborde del TMR0 y TMR1, al encontrarse deshabilitadas por atender la interrupción de RB0/INT.