TODOPIC

Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: eduard001 en 20 de Mayo de 2014, 02:31:40

Título: Ayuda con interrupciones externas
Publicado por: eduard001 en 20 de Mayo de 2014, 02:31:40
Hola que tal?, soy nuevo programando pic y e tratado de controlar mi timer por medio de interrupciones externas pero no lo e conseguido. Lo que quiero lograr es:
Al tener una int_ext, inicie mi timer1 desbordándose una y otra ves. Contar las veces que se a desbordado y que al existir una nueva interrupción externa se detenga el conteo de desbordamientos e imprima el total de veces que se desbordo el timer entre una interrupción y otra.
Espero que alguien pueda ayudarme con algún ejemplo se lo agradeceria, saludos y gracias.
 
Título: Re: Ayuda con interrupciones esternas
Publicado por: stk500 en 20 de Mayo de 2014, 03:38:56
Hola Eduardo001,
porque nos dice en que lenguaje usa? y el micro tambien. sabiendo eso, usa nuestros buscador en el foro de acuerdo a tus dudas, porque usar interrupciones externas se ha hablados muchos aqui en todos los lenguajes y seguro que encuentra ejemplos , es solo cuestion de usar el buscador.
Saludos
Título: Re: Ayuda con interrupciones esternas
Publicado por: ppyote en 20 de Mayo de 2014, 07:58:40
Totalmente de acuerdo con stk500, tenemos que saber algunas cosas como que compilador usas, que pic, frecuencia de trabajo etc, antes de ponerse en el tema, también es bueno poner un pequeño esquema del circuito para evitar posibles fallos en el hardware
Título: Re
Publicado por: eduard001 en 20 de Mayo de 2014, 12:01:10
Aaaa lo siento mucho claro que si.
Estoy utilizando un PIC16F877, y de momento lo uso a 4Mhz. Uso CCS Compiler para programarlo, el circuito es realmente simple solo comprende dos swich o push button para efectuar la interrupción externa con sus resistencias de pull up.
 Y con mis muy escasos conocimientos e hecho este codigo.

#include <16F877.h>
#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_B4,rcv=PIN_B5,bits=8)
#include <stdlib.h>

int16 conteo=0;
int escape=0;

#INT_EXT
IntRB0(){
   escape++;                             /**incrementa el valor para usarlo como
                                            condicion**/
   while(escape==1) {
   set_timer1 (131);                     //recarga del TMR1
   conteo++;                             /**Se incrementa cada ves que se desborda
                                          timer1**/
   printf("El conteo es: %Lu\r",conteo);
   }
  
 }

#INT_RB
IntRB1(){
printf("El conteo2 es: %Lu\r",conteo);
}

void main() {

    ext_int_edge(L_TO_H);
    clear_interrupt(INT_EXT);
    enable_interrupts(int_ext);            
            
    ext_int_edge(L_TO_H);
    clear_interrupt(INT_RB);
    enable_interrupts(int_rb);    
    
    enable_interrupts(global);
      
while(TRUE);
    
 }

Título: Re: Ayuda con interrupciones externas
Publicado por: jhozate en 20 de Mayo de 2014, 12:24:19
lo mejor que puedes hacer es activar una bandera al ingresar a la interrupción externa y hacer todo en el main, no uses la función printf dentro de la interrupción.
te recomiendo que busques en el foro acerca de las interrupciones, hay muchos hilos
como bien lo indicas, la interrupción externa activa y desactiva el timer, y en el código estas usando la Int_rb  que es otro tipo de interrupcion.
 
 
Título: Re: Ayuda con interrupciones externas
Publicado por: rivale en 20 de Mayo de 2014, 13:59:49
Hola, si lo que quieres es contar cuantas veces se desborda la interrupción del timer, deberías de activar esta misma, ya que de esta forma puedes saber cuantas veces se ha desbordado.

en este caso con la interrupción externa solo activarías o desactivarías el timer, pero el incremento sería cada que se desborde el timer


como bien te recomienda jhozate, puedes buscar mas información sobre interrupciones en el foro.

Saludos
Título: Re: Ayuda con interrupciones externas
Publicado por: gera en 20 de Mayo de 2014, 14:10:14
Código: [Seleccionar]
while(escape==1) {
   set_timer1 (131);                     //recarga del TMR1
   conteo++;                             /**Se incrementa cada ves que se desborda
                                          timer1**/
   printf("El conteo es: %Lu\r",conteo);
   }

Ahí creo que tenés un error. Una vez que escape llegue a 1, el programa va a entrar en un bucle infinito. Tal vez quisiste usar un if en lugar de un while.

Saludos!
Título: Re: Ayuda con interrupciones externas
Publicado por: eduard001 en 20 de Mayo de 2014, 17:16:48
Gracias gera, es una gran observacion pero en realidad deje el:

Citar
while(escape==1) {
   set_timer1 (131);                     //recarga del TMR1
   conteo++;                             /**Se incrementa cada ves que se desborda
                                          timer1**/
   printf("El conteo es: %Lu\r",conteo);
   }
Para ocasionar un bucle infinito hasta que ocurra la interrupción  :oops: aunque no se refleja en la programación, de momento intentare hacerlo por flancos como menciona jhozate. De todos modos cualquier consejo o sugerencia es mas que bien venido.
Título: Re: Ayuda con interrupciones externas
Publicado por: jhozate en 20 de Mayo de 2014, 19:41:01
podrias intentar algo de la siguiente forma usando solo la int_ext y la int_rtcc,  podría servir
Código: [Seleccionar]
#int_ext
void intExt_isr()
{
//Aqui condicionas el stop/inicio timer
// Des-activacion de flag
}

#int_rtcc
void intRtcc_isr()
{
//contador de desbordamiento
}

void main()
{
while(true)
  {
    if(flag==1)
       {
        printf("El conteo es: %u\r",conteo);
        }
  }
}