interrupcion RB0 por flanco descendente con 18f4520

No consigo que me funcione una simple interrupción RB0 con flanco descendente utilizando proton IDE en un 18f4520.
Se trata de un contador de vueltas de rueda que debe incrementar su valor cada vez de la puerta RB0 se cambia de 1 a 0 mediante un sensor inductivo.
el código (solo parte de interrupción) es el siguiente:

Código:
Device = 18F4520
XTAL = 20
Cls
REMINDERS = 1
ALL_DIGITAL=true
Symbol INTF   = INTCON.1         ' RB0 External Interrupt Flag
Symbol INTE   = INTCON.4         ' RB0 External Interrupt Enable
Symbol GIE    = INTCON.7         ' Global Interrupt Enable
Symbol INTEDG = INTCON2.4        ' Flag = 0 int. por flanco bajada. Flag = 1 int. por flanco subida.
GIE    = 1                       ' Activa interrupciones generales.
INTE   = 1                       ' Activa la interrupción externa RB0/INT.
INTEDG = 0                      ' Hace que inicialmente la interrupción se habilite por flanco de bajada
...

On_INTERRUPT GoTo Interrupcion 'IR A INTERRUPCION 
....
 inicio:
.....
goto inicio
.....
Interrupcion:                 '-------- Decodificador de Encoder --------------
Context SAVE              
          vueltas = vueltas+1
          vueltas2 = vueltas2 + 1 
INTF = 0                 .
Context Restore


El caso es que por cada paso del sensor me debería computar una sola vuelta. Sin embargo computa dos 2 vueltas ignorando la instrucción de flanco de bajada.


Me podría alguien orientar sobre cual puede ser el problema?
Muchas gracias de antemano.
 
Última edición por un moderador:
No consigo que me funcione una simple interrupción RB0 con flanco descendente utilizando proton IDE en un 18f4520.

Me podría alguien orientar sobre cual puede ser el problema?
Muchas gracias de antemano.
Saludos juaki09
Adjunto un programa de ejemplo con interrupción en RB0 por flanco descendente a alta prioridad.

En la subrutina de interrupción podrás colocar tu programa.

Espero te sea de ayuda.

Suerte.
 

Adjuntos

  • Interrupción por RB0.rar
    9.4 KB · Visitas: 52
En la pregunta anterior olvidé decir que el diseño funciona perfectamente cuando hago la simulación en proteus. ¿Podrá tratarse de un problema en la configuración del winpic800 que utilizo para grabar el pic..? En este caso, ¿que puedo estar haciendo mal?

Gracias de nuevo.



Muchas gracias D@rkbytes. Voy a probar con los fuses de tu programa de ejemplo.
Ya te diré como me fué. Saludos.
 
Última edición:
En la pregunta anterior olvidé decir que el diseño funciona perfectamente cuando hago la simulación en proteus. ¿Podrá tratarse de un problema en la configuración del winpic800 que utilizo para grabar el pic..? En este caso, ¿que puedo estar haciendo mal?

Gracias de nuevo.



Muchas gracias D@rkbytes. Voy a probar con los fuses de tu programa de ejemplo.
Ya te diré como me fué. Saludos.

Exactamente. Prueba con los fuses que programe y nos cuentas. :apreton:
 
Este es el esquemita.
EN proteus la interrupción por RB0 la hago con un simple pulsador y funciona correctamente en flanco de bajada. En la placa, sin embargo, en lugar del interruptor dispongo de un sensor inductivo tal como lo he dibujado en rojo.

Este tipo de sensor, conectado de esta forma, los he venido utilizando con PIC 16f84a y 16F677 y me han funcionado correctamente.

Muchas Gracias de nuevo.
 

Adjuntos

  • esquema.pdf
    312.9 KB · Visitas: 33
OK.
Veamos ahora. Omite el All_Digital = On
Porque puede que no esté haciendo bien su trabajo en este PIC.
Así que en vez de esta instrucción, utiliza...
ADCON1 = 7
En la configuración de fuses, se inicializo al PIC con los conversores AD en OFF al resetearlo. (PBADEN_OFF)
Pero solo lo hará al momento de inicializar o resetear el PIC.

Prueba ahora haciendo ese cambio.

Suerte.
 
Última edición:
Hola!
no creo que sea buena idea programar la entrada como analogica ya que tu quieres que sea digital. En basic no lo se, pero en C existe una instruccion para decidir si la interrupcion es en flanco de bajada o subida.

Por otro lado, no entiendo la resistencia de 330ohm a gnd. si tu detector entrega un nivel alto con relacion a gnd al activarse...quita esta resistencia y pon la de 47k a gnd.

suerte!!!!
 
Hola!
no creo que sea buena idea programar la entrada como analogica ya que tu quieres que sea digital. En basic no lo se, pero en C existe una instruccion para decidir si la interrupcion es en flanco de bajada o subida.

Por otro lado, no entiendo la resistencia de 330ohm a gnd. si tu detector entrega un nivel alto con relacion a gnd al activarse...quita esta resistencia y pon la de 47k a gnd.

suerte!!!!
De eso se trata precisamente luisgorris. De tener el puerto B como digital.
ADCON1 = 7 hace el puerto B digital I/O
La configuración de interrupción por flanco de bajada se realizo directamente sobre el registro INTCON2
Y lo de la resistencia de 330Ω tampoco me agrado. :eek:
 
Última edición:
Gracias Luisgorris por tu participacion. El sensor inductivo está ya montado en placa y funciona bien con la resistencia de 330 ohmios. Lo que realmente sobra y no he puesto es el pullup de 4k7. Cuando el sensor se activa la tensión en RB0 pasa de 4,6 V a 0,2V. por lo que pienso que éste (el sensor) no debe ser el problema.

En cuanto a tus indicaciones, D@rkbytes, he hecho los cambios que me dijiste y la interrupcion sigue sin funcionar por flanco de bajada.

Hay algo que quiero apuntar por si pudiese dar luz a la solución del problema: Para que la simulación en proteus funcione bien con el programa ejemplo que me dejaste, he tenido que introducir la instrucción "Context Restore" justo antes de "Resume". Sin ella justo al producirse la interrupción el sistema se cuelga.

Gracias a ambos.
 
Hay algo que quiero apuntar por si pudiese dar luz a la solución del problema: Para que la simulación en proteus funcione bien con el programa ejemplo que me dejaste, he tenido que introducir la instrucción "Context Restore" justo antes de "Resume". Sin ella justo al producirse la interrupción el sistema se cuelga.
OK. Veamos ahora.
Adjunto el mismo ejemplo, pero agregando algunas instrucciones más, para el control de la interrupción.
La verdad que ya no se me ocurre que pueda estar pasando. :confused:

Suerte.
 

Adjuntos

  • Interrupción por RB0(2).rar
    26.5 KB · Visitas: 74
Última edición:
Saludos,

Veo que abrieron este tema con respecto a las interrupciones, me gustaría saber si pueden ayudarme con la interrupción por el puerto b (b4-b7) del pic16f877A en basic, hasta ahora no la he podido hacer funcionar y sé que debe ser un detalle menor, me he basado en varios ejemplos pero no lo he logra, estaré muy agradecido si una mano amiga me da un empujón con este problema, utilizo el basic pro y el proton. Gracias a mil!!!
 

Adjuntos

  • INTERRUPCION POR B4-B7.rar
    52.9 KB · Visitas: 19
Atrás
Arriba