Autor Tema: problema con "Tren de pulsos" RB0 y TM1  (Leído 2102 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado jftrujilloa

  • PIC10
  • *
  • Mensajes: 17
problema con "Tren de pulsos" RB0 y TM1
« en: 12 de Enero de 2011, 16:46:53 »
Muy wenas, les agradesco a todos los que aportan sus ideas y resuelven dudas. Me encuentro con una serie de problemas con respecto a la interrupcion RB0 y el Timer1 que son los que estoy empleando. Perdonar si llego a tener algun error muy obvio, soy un novato en el mundo del pic y la programacion.

Estoy trabajando con CCCompiler y como simulador el proteus y trabajando con el pic16f877. Al pin RB0 le estoy generando una señal, inicializo el timer1 a =0  y simplemente cuento el tiempo que esta en el flanco de subida y el flanco de bajada, y al final la resta de esas dos seria el tiempo que ha durado el pulso no?..Bueno les muestro lo que llevo hecho de programa. Simulando en el proteus, no me entra en la interrupcion, porque en el programa principal he puesto un simple mensaje de "hola" para que al entrar a la interrupcion me borre el LCD.
Nota:La libreria LCD_flexible.c es una customizada que me he bajado de internet y me ha funcionado en mis proyectos anteriores, de todos modos adjunto tambien el diseño en proteus.

Código: C++
  1. #include <16f877.h>
  2. #use delay(clock=4000000)
  3. #fuses NOWDT,XT
  4. #include <LCD_flexible.c>
  5. #byte portb=06
  6. #use fast_io(c)
  7.  
  8. #int_rb //declaramos la interrupcion
  9. void interrupcion(void)
  10. {
  11.    float t,t2,tiempo;
  12.    lcd_putc("\f");
  13.    if(input(pin_b0)==0){
  14.    t=get_timer1();}
  15.    if(input(pin_b0)==0){
  16.    t2=get_timer1();}
  17.    tiempo=t-t2;
  18.    printf(lcd_putc,"tiempo=%3.2f msegundos",tiempo);
  19.    delay_ms(800);
  20. }
  21.  
  22. void main()
  23. {
  24.    lcd_init();
  25.    lcd_putc("Hola");
  26.    delay_ms(300);
  27.    while(true);
  28.    {
  29.    set_tris_b(11110001);
  30.    ENABLE_INTERRUPTS(INT_RB);
  31.    ext_int_edge(L_TO_H);
  32.    set_timer1(0);
  33.    }
  34. }

Espero me puedan ayudar..
Un saludo. :)

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: problema con "Tren de pulsos" RB0 y TM1
« Respuesta #1 en: 12 de Enero de 2011, 17:15:55 »
te voy a indicar fallos que cometes.... para que lo modifiques...

#include <16f877.h>                    //bien
#use delay(clock=4000000)          //bien
#fuses NOWDT,XT                        //bien
#include <LCD_flexible.c>            //bien
#byte portb=06                            //bien
#use fast_io(c)                             //esta linea no hace falta

#int_rb //declaramos la interrupcion //mal, es #int_ext para captura por el pin b0
void interrupcion(void){                   //bien
  float t,t2,tiempo;                           //mal, el timer 1 es de 16bits con valores long suficiente y ademas yo las crearia globales
  lcd_putc("\f");                               //mal, imprimir en un lcd tiene mucho retraso de tiempo,antes de borrar la pantalla hay que tomar el valor del timer1
  if(input(pin_b0)==0){                    //mal, la interrupcion int_ext lo que hace es detectar un cambio de flanco, con un flag podras saber si es uno de subida o bajada
  t=get_timer1();}                            //mal con el falg a 0x00 t1=get_timer1()
  if(input(pin_b0)==0){                     //mal, mejor un flag
  t2=get_timer1();}                          //con el falg a 0xFF t2=get_timer1()
  tiempo=t-t2;                                  //ni bien ni mal todo depende del programa restante...
  printf(lcd_putc,"tiempo=%3.2f msegundos",tiempo);           //mal, en una interrupcion mejor nosacar valores por el lcd, mejor desdpues del retorno del flag
  delay_ms(800);                              //mal, retardos en interrupciones mejor no hacerlos

}

void main(){

  lcd_init();                               //lo de abajo del delay arriba...
  lcd_putc("Hola");                     //     ""      ""     ""
  delay_ms(300);                      //      ""      ""      ""

  while(true);{                            //aun no lo pongas, configura todo y despues ponlo
  set_tris_b(11110001);               //esto arriba
  ENABLE_INTERRUPTS(INT_RB); //mal,esto arriba, es int_ext, despues debes de habilitar las interrupciones globales(activas todas las interrupciones habilitadas) esto se hace con enable_interrupts(global);
  ext_int_edge(L_TO_H);             //esto arriba
  set_timer1(0);                          //esto arriba  primero debes de confirurar el timer1 con setup_timer_1(...como quieras configurar....)

  }
                                   //aqui pondria yo el bucle infinito while(true){}
}

de momento esto....
« Última modificación: 12 de Enero de 2011, 17:20:03 por ppyote »
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado jftrujilloa

  • PIC10
  • *
  • Mensajes: 17
Re: problema con "Tren de pulsos" RB0 y TM1
« Respuesta #2 en: 12 de Enero de 2011, 17:34:20 »
Muchisimas gracias Ppyote, de momento voy a corregir los errores y continuar con el programa.. :c)

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: problema con "Tren de pulsos" RB0 y TM1
« Respuesta #3 en: 12 de Enero de 2011, 19:53:38 »
Muchisimas gracias Ppyote, de momento voy a corregir los errores y continuar con el programa.. :c)
de nada, ante la mas minima duda o fallo, pregunta en el foro aqui hay gente que sabe una bestialidad
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado Francirius

  • PIC10
  • *
  • Mensajes: 32
Re: problema con "Tren de pulsos" RB0 y TM1
« Respuesta #4 en: 16 de Enero de 2011, 18:35:35 »
Tambien te falta cambiar el flanco una vez que detecta el primero, para qeu pueda medir el tiempo del pulso

Desconectado Francirius

  • PIC10
  • *
  • Mensajes: 32
Re: problema con "Tren de pulsos" RB0 y TM1
« Respuesta #5 en: 16 de Enero de 2011, 22:33:50 »
Yo tambien he estado tratando de medir ancho de pulso y lo que hago es lo siguiente (me ha funcionado):
Configuro el canto de bajada o subida segun el pulso.
La interrupcion lo detecta e inicializa el timer que quieras usar, luego pongo un flag a 1 para indicar que ya se inicializo el timer.
Configuro el canto del pulso, el contrario del que comence.
Todo esto encerrado en una sentencia IF, de esta forma:
Código: [Seleccionar]
void ext_isr(){
 if(cambio){
 set_timer0(0);
 tiempo=0;
 EXT_INT_EDGE(L_TO_H);
 cambio=1;
 }else{
 tiempo=get_timer0();
 EXT_INT_EDGE(H_TO_L);       
 cambio=0;
 }
Funciona a la perfeccion. ;-)