TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: JulioCarrillo en 27 de Mayo de 2013, 21:02:12

Título: Ayuda con Interrupcion por Rb0
Publicado por: JulioCarrillo en 27 de Mayo de 2013, 21:02:12
Hola amigos tengo este codigo que requiero que interrumpa por rb0, pero no logro hacerla que suceda cuando cambie de estado, si no que efectua toda la rutina luego la hace. En caso de que ponga las condiciones en la ext_isr, no logro salir de ella. Alguien me ayuda, o le ha sucedido. Gracias

Dejo el codigo

#include <18F4550.h>
#use delay(internal=8M)

#fuses PLL1,INTEC_IO,NOIESO,NOPUT,NOBROWNOUT,NOWDT,NOMCLR
#define verde1 31768
#define ambar1 31769
#define rojo1  31770
#define verde2 31755
#define ambar2 31756
#define rojo2  31757
#define peaton1  31771
#define peaton2  31772
#define led    31773


#use fast_io(B)
int cont,countimer,flag,cambio,cambio1;



#int_ext
void ext_isr(){
flag=1;
     }
     
#int_timer0
void interrup_timer0(void){
SET_TIMER0(131);
countimer++;
   if(countimer==125){ // 16 equivale a un segundo**
      output_toggle(led);
      countimer=0;
      }
}
void tiempo(){ //Conteo de 10 segundos

   for(cont=0;cont<150;cont++){
      delay_ms(100);
         if(cont == 150){
            cont=0;}
            }
}

void tiempo1(){ //Conteo de 5 segundos

   for(cont=0;cont<50;cont++){
      delay_ms(100);
         if(cont == 50){
            cont=0;}
            }
}

void norte_sur(){
cambio=1;
   output_high(verde1);
   output_high(rojo2);
   output_low(ambar2);
   tiempo();
   output_low(verde1);
   output_high(ambar1);
   tiempo1();
   output_low(ambar1);
   delay_ms(500);
   output_high(ambar1);
   delay_ms(500);
   output_low(ambar1);
   delay_ms(500);
   output_high(ambar1);
   delay_ms(500);
   output_low(ambar1);
   output_low(rojo2);
}

void este_oeste(){
cambio1=1;
   output_high(verde2);
   output_high(rojo1);
   tiempo();
   output_low(verde2);
   output_high(ambar2);
   tiempo1();
   output_low(ambar2);
   delay_ms(500);
   output_high(ambar2);
   delay_ms(500);
   output_low(ambar2);
   delay_ms(500);
   output_high(ambar2);
   delay_ms(500);
   output_low(ambar2);
   output_low(rojo1);
}
void main(){
setup_oscillator(OSC_8MHZ|OSC_INTRC|OSC_PLL_OFF);
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_128|RTCC_8_BIT );
ENABLE_INTERRUPTS(INT_EXT);
ENABLE_INTERRUPTS(INT_TIMER0);
EXT_INT_EDGE(L_TO_H);
ENABLE_INTERRUPTS(GLOBAL);
SET_TIMER0(131);


set_tris_B(0x01);


while(true){

   norte_sur();
   este_oeste();
      if(flag==1 && cambio== 1){
         output_high(peaton1);
         output_high(peaton2);
         tiempo1();
         output_low(peaton1);
         output_low(peaton2);
         flag,cambio,cambio1=0;
            }
         }
     }
Título: Re: Ayuda con Interrupcion por Rb0
Publicado por: gab163 en 28 de Mayo de 2013, 14:36:29
Aquí lo resuelven
http://www.todopic.com.ar/foros/index.php?topic=32067.0
espero te sirva
Título: Re: Ayuda con Interrupcion por Rb0
Publicado por: JulioCarrillo en 28 de Mayo de 2013, 22:18:39
Hola y gracias por la referencia. En este programa esta bien configurado me funciona, me falta trabajar en efectuarlas en distintos tiempos. Alguien que me pueda aportar mas se lo agradeceria
Título: Re: Ayuda con Interrupcion por Rb0
Publicado por: gab163 en 29 de Mayo de 2013, 13:00:41
¿como en distintos tiempos?
Título: Re: Ayuda con Interrupcion por Rb0
Publicado por: JulioCarrillo en 30 de Mayo de 2013, 23:34:13
Si lo que pasa es que es un semaforo, realizara el ciclo de funcionamiento normal, al presionar un boton (int_ext) pasara a la accion del peaton pasando por preventiva, y luego al peaton, luego de ello regresa en donde al ciclo, al presionar otro boton (int_ext1) pasa los 2 en rojo para que un policia ponga multas, sigo en ello, de hecho me hace las interrupciones pero aun no me las respeta correctamente
Título: Re: Ayuda con Interrupcion por Rb0
Publicado por: gab163 en 31 de Mayo de 2013, 01:23:26
No entiendo muy bien a lo que te refieres con tiempos distintos, las interrupciones como su nombre lo indica interrmpen las acciones del micro y te llevan a realizar alguna funcion y despues de eso regresa donde estaba, lo unico que tienes que hacer es colocar el codigo correspondiente a cada accion que quieres en las funciones de interrupcion y listo. Un ejemplo aqui:
Título: Re: Ayuda con Interrupcion por Rb0
Publicado por: JulioCarrillo en 02 de Junio de 2013, 21:47:36
Gracias amigo, ya esta solucionado jejeje
Título: Re: Ayuda con Interrupcion por Rb0
Publicado por: gab163 en 03 de Junio de 2013, 00:58:34
Muy bien! :mrgreen: