TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: iNoXSteeL en 03 de Enero de 2010, 12:08:12

Título: #int_ext funciona al revés..
Publicado por: iNoXSteeL en 03 de Enero de 2010, 12:08:12
Hola a todos,

resulta que probando en la protoboard, el pin b0 con un pulsador a Vcc y la correspondiente resistencia pull-down, según proteus funciona bien, y según como está configurado pues debería de funcionar así, recibiendo un pulso de Vcc entraría la interrupción... pero no, el pulsador hay que conectarlo a GND para que se produzca la interrupción, como es posible ??

Un saludo.

Código: C
  1. #include <16f876.h>
  2. #use delay(clock=4M)
  3. #use fast_io(b)
  4.  
  5. #fuses XT,NOPUT,NOPROTECT,NOWDT,NOLVP
  6.  
  7. #int_ext
  8. void intext()
  9.    {
  10.    a ++;
  11.    if (a==3) a=0;
  12.    }
  13.  
  14. void main()
  15.    {
  16.    set_tris_b(0b00000001);
  17.    output_b(0x00);
  18.    
  19.     enable_interrupts(INT_EXT);
  20.     ext_int_edge(L_TO_H);
  21.     enable_interrupts(GLOBAL);
  22.  ......
  23.  ......
  24.  
  25. }
Título: Re: #int_ext funciona al revés..
Publicado por: migsantiago en 03 de Enero de 2010, 12:10:46
Podría haber algo raro en el diagrama, por favor ponlo para que lo veamos.
Título: Re: #int_ext funciona al revés..
Publicado por: MLO__ en 03 de Enero de 2010, 13:32:23
Si el pulsador lo estas conectando a Vcc ... pues debe pasar el estado a GND para luego volver a Vcc y ahi entra a la interrupcion ....   :?, con el esquema quedariamos mas claros

Saludos
Título: Re: #int_ext funciona al revés..
Publicado por: iNoXSteeL en 03 de Enero de 2010, 13:33:49
Pues es sencillo, ya que es para probar unos códigos antes de montar

Probé añadiendo port_b_pullups(FALSE); , pero igual.. en cambio en proteus así no va.

(http://www.todopic.com.ar/foros/imgtiny/bgpldj.jpg)
Título: Re: #int_ext funciona al revés..
Publicado por: Nocturno en 03 de Enero de 2010, 13:50:06
Seguro que estás lanzando la interrupción en el flanco correcto, o sea, el ascendente. Lo que pasa es que los pulsadores tienen rebotes, y antes de establecer un 0 o un 1 estable pasan por un montón de ellos alternativos. Por eso, aunque creas que al pulsarlo estás provocando un flanco, en realidad hay varios de ellos.
Dices que en proteus no va, ¿pero no va tampoco al soltar el pulsador?
Título: Re: #int_ext funciona al revés..
Publicado por: iNoXSteeL en 03 de Enero de 2010, 13:58:35
Pues he puesto un delay de 60 ms antirrebotes en la interrupción, pero ni con esas, tengo que conectar Vcc a gnd y quitar la resistencia pulldown para que funcione.

En proteus funciona sin port_b_pullups(FALSE);, veo como incremento la variable al pulsar, pero al revés no. sin embargo físicamente no funciona de ninguna de las dos maneras.

así es como funciona físicamente...

(http://www.todopic.com.ar/foros/imgtiny/2wcgsg8.jpg)
Título: Re: #int_ext funciona al revés..
Publicado por: jfh900 en 03 de Enero de 2010, 14:18:23
La interrupción del puerto B0 se activa al ponerla a nivel bajo. Tienes que activar las resistencias internas o poner una resistencia externa de 10K y el pulsador conectarle a masa.

Un saludo
Título: Re: #int_ext funciona al revés..
Publicado por: BrunoF en 03 de Enero de 2010, 14:23:26
En proteus funciona sin port_b_pullups(FALSE);, veo como incremento la variable al pulsar, pero al revés no. sin embargo físicamente no funciona de ninguna de las dos maneras.

No tendria nada que ver las pull ups del puerto B en este modelo de PIC, porque sólo afectan a los pines [RB4-RB7]. RB0 no tiene pull up interna configurable.

así es como funciona físicamente...

(http://www.todopic.com.ar/foros/imgtiny/2wcgsg8.jpg)

Pues te falta una resistencia de pull up paralela a RB0 para que ese circuito sea correcto. Puede que funcione así pero lo seguro es que lo hagas como te digo.

La interrupción del puerto B0 se activa al ponerla a nivel bajo. Tienes que activar las resistencias internas o poner una resistencia externa de 10K y el pulsador conectarle a masa.

Un saludo

No necesariamente. La interrupción por cambio de flanco en RB0 es CONFIGURABLE. Puede configurarse para que ocurra tanto en un cambio de flanco ascendente o bien descendente.

Saludos.
Título: Re: #int_ext funciona al revés..
Publicado por: PalitroqueZ en 03 de Enero de 2010, 14:31:48
iNoXSteeL deberías ponerle un retardo al pulsador del proteus y observar el estado de la bandera de interrupción en ese lapso.

También sirve sustituir el pulsador por un switche.


por cierto, ¿no hay que limpiar la bandera?

Título: Re: #int_ext funciona al revés..
Publicado por: jfh900 en 03 de Enero de 2010, 14:54:35
Para este micro por lo menos, si tiene pull-up y creo, lo estoy diciendo de memoria, que el flanco es solamente configurable para los pines 4-7.

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=28956.0;attach=10863)

Un saludo.
Título: Re: #int_ext funciona al revés..
Publicado por: iNoXSteeL en 03 de Enero de 2010, 15:07:36
Gracias a todos por vuestas aclaraciones, al final así es como funciona

jfh900 creo que tiene razón, ya que da igual como ponga ext_int_edge(L_TO_H) o ext_int_edge(H_TO_L) ya que funciona en el momento de apretar el pulsador, que es cuando pasa a nivel bajo.

Código: C
  1. #int_ext
  2. void intext()
  3.    {
  4.    delay_ms(60);
  5.    a ++;
  6.    if (a==3) a=0;
  7.    clear_interrupt(INT_EXT);
  8.    }

físicamente y en proteus así

(http://www.todopic.com.ar/foros/imgtiny/ddzubp.jpg)

gracias nuevamente, Salud!
Título: Re: #int_ext funciona al revés..
Publicado por: BrunoF en 03 de Enero de 2010, 15:58:32
Para este micro por lo menos, si tiene pull-up y creo, lo estoy diciendo de memoria, que el flanco es solamente configurable para los pines 4-7.

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=28956.0;attach=10863)

Un saludo.

Ja ja!

No...todo al reves estas diciendo según "mi memoria". RB0 tiene flanco configurable. RB4-RB7 no tiene flanco configurable. Ya que he trabajado infinidad de veces con este uC, especialmente, y creo que se el datasheet de memoria. Como no quiero hablar de palabra, en 5 minutos miro el datasheet y te expongo si estoy en lo correcto o equivocado.
Título: Re: #int_ext funciona al revés..
Publicado por: BrunoF en 03 de Enero de 2010, 16:02:49
Ok. Confirmado. Todos los pines del PORTB tienen pull up interna. Mi error.

(http://img85.imageshack.us/img85/884/portb.png)

Veo lo otro...
Título: Re: #int_ext funciona al revés..
Publicado por: BrunoF en 03 de Enero de 2010, 16:08:52
El pin RB0 posee flanco configurable:

(http://img15.imageshack.us/img15/578/inth.png)

mientras que los pines [RB4-RB7] no:

(http://img46.imageshack.us/img46/2936/portbintcon.png)
Título: Re: #int_ext funciona al revés..
Publicado por: jeremylf en 05 de Enero de 2010, 13:15:51
Es mejor que configures cuando debe de ocurrir la interrupcion y evita poner delays en estas.

Salu2.