Autor Tema: "#int_ext" e " int_Rb"  (Leído 3780 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado modelo75

  • PIC10
  • *
  • Mensajes: 28
"#int_ext" e " int_Rb"
« en: 06 de Abril de 2005, 10:10:00 »
Hola gente,
alguien me puede decir que diferencia existe entre estas dos interrupciones (#int_ext/ #int_Rb), es lo mismo??
quiero medir frecuencia por un pin cualquiera (en un pic que no tenga CCP). He logrado hacerlo, pero solo por el Pin Rb0/int, pero en el pic que quiero usar(12f675), no tiene este pin, solo tiene "interrupt-on-change". Para utilizar esta interrupcion la instruccion es:
#int_ext
void cap_frec(){
}
main{
ext_int_edge(2,H_TO_L); // flanco alto a bajo en rb2
enable_interrupts(INT_EXT); // habilita int-on-change en Rb2??
enable_interrupts(GLOBAL);
}
voy bien??
saludos

Desconectado gfp

  • PIC18
  • ****
  • Mensajes: 274
RE: "#int_ext" e " int_Rb"
« Respuesta #1 en: 06 de Abril de 2005, 13:03:00 »
La "INT_EXT" se refiere a interrupcion por puerto RB0 y la "INT_EXT" hace referencia a interrupcion por los pines RB4, RB5, RB6 y RB7. Te recomiendo leas detalladamente el capitulo de interrupciones del PIC en mencion, asi sabes si puedes elegir esa alternativa.

gfp Sonrisa

Desconectado modelo75

  • PIC10
  • *
  • Mensajes: 28
RE: "#int_ext" e " int_Rb"
« Respuesta #2 en: 06 de Abril de 2005, 14:14:00 »
el pic12f675 tiene 7 fuentes de interrupciones: **ext interrup GP2/int, TMR0,** GPIO change interrup, comparator interrup, A/D, TMR1 y EEPROM.
De estas quiero usar o la GP2/int, o GPIO change interrup.
Mi duda es
- si quiero usar la int GP2/INT debo configurar:
   enable_interrupts(INT_RB);
   enable_interrupts(global);
- si uso GPIO change:
   ext_int_edge(1,L_TO_H);  
   enable_interrupts(INT_EXT);
   enable_interrupts(global);
 he probado amabas pero no funciona, puede ser que este mal calibrado, ya que estoy usando el oscilador interno?? Alguien sabe como calibrar este pic??
gracias
saludos

Desconectado gfp

  • PIC18
  • ****
  • Mensajes: 274
RE: "#int_ext" e " int_Rb"
« Respuesta #3 en: 06 de Abril de 2005, 18:37:00 »
Pon el codigo y le damos un vistazo.

gfp Sonrisa

Desconectado modelo75

  • PIC10
  • *
  • Mensajes: 28
RE: "#int_ext" e " int_Rb"
« Respuesta #4 en: 07 de Abril de 2005, 07:10:00 »
seria algo asi:
#include <12F675.h>
#fuses INTRC,WDT
#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_A1,rcv=PIN_A0,bits=9)
#byte intcon=0x0b /*Regisro de interrupcion*/
#bit RBIE=intcon.3 /*Para limpiar flag de interrupcion!!!*/

#int_EXT
EXT_isr() {
   putc ("x");
   RBIE=0;
}
void main() {
float frecuencia;
restart_wdt();
           
   set_tris_a(0b000101);
   setup_timer_1(T1_INTERNAL);
   enable_interrupts(INT_EXT);
   //ext_int_edge(2,L_TO_H);
  //enable_interrupts(INT_RB);   //esta interrup seria en un pin cualquiera?
    enable_interrupts(global);
    RBIE=0;
while(TRUE)
   {
                      RBIE=0;
     delay_ms(500);
                  //calculo de frec
     printf("
tpo=%f  ", frecuencial);
       restart_wdt();
   }
}
con esto intento probar que al producirce un cambio en GP2/INT produzca una interrupcion e imprima una X, pero no me funciona, como mencione anteriormente, lo unico que se me ocurre es la calibracion del oscilador (cdo se utiliza osc. interno se debe calibrar). He probado lo mismo en otro pic(f876) que tambien tiene pin interrup externa (rb/int) y funciona pero en el 12f675 no way.Alguna idea??
Saludos

Desconectado gfp

  • PIC18
  • ****
  • Mensajes: 274
RE: "#int_ext" e " int_Rb"
« Respuesta #5 en: 07 de Abril de 2005, 09:22:00 »
Tu programa quedó asi:

#include <12F675.h>
#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_A1,rcv=PIN_A0,bits=8)
#fuses INTRC_IO,NOWDT,NOCPD,NOPROTECT,NOMCLR,PUT,NOBROWNOUT
#byte   STATUS=0x03
#byte   WPU=0x95
   float frecuencia;

#int_EXT
void EXT_isr()
{
   printf("
tpo=%f ", frecuencia);
   putc ("x");
   printf("%C", 0x0D);            //Envia "Enter"
}
void main()
{
   set_tris_a(0b000101);
#asm
   bsf      STATUS,5         //Banco 1
   movlw   0x5               //Activa la resistencia de PULL-UP
   movwf   WPU               //en los pines GPIO_0 y GPIO_2
#endasm
   ext_int_edge(L_TO_H);      //Define flanco de subida (Para la acyivacion de la interrupcion)
   enable_interrupts(INT_EXT);
   enable_interrupts(global);
   while(TRUE)
   {}
}


Te recomiendo no manipules las banderas de interrupcion ya que el compilador lo hace por ti. Además el habilitar el WDT en este programa tan sencillo no es conveniente ya que no veo algun factor que lo pueda hacer perder del curso del programa a no ser que sea por la fuente de alimentacion.
Si tienes alguna otra duda puedes apoyarte en el manual del uC y en las caracteristicas del dispositivo MENU_INICIO->carpeta PICC->Suported Devices y eliges 12F675.h y doble click.

gfp :-)

Desconectado modelo75

  • PIC10
  • *
  • Mensajes: 28
RE: "#int_ext" e " int_Rb"
« Respuesta #6 en: 07 de Abril de 2005, 10:05:00 »
Gracias Gfp,
tengo un problema con el programador, cuando pueda programar, lo pruebo y te comento.
Acerca de la calibracion de este pic, tenes algun metodo para hacerlo.
Gracias de nuevo.
Saludos

Desconectado gfp

  • PIC18
  • ****
  • Mensajes: 274
RE: "#int_ext" e " int_Rb"
« Respuesta #7 en: 07 de Abril de 2005, 19:57:00 »
Calibracion? Si te refieres al Cristal interno no necesitas hacer nada, solo elegir INRC y listo. Además éste te da un error de  ±1%

gfp Sonrisa