interrupcion con PIC16F628A

#1
Hola a todos nuevamente!!
Como dije en alguun post anterior esty dando mis primeros pasos en el mundo de los PIC y estoy probando una pequeña rutina que enciende un led conectado a RB7. Al pusar el interruptor se genera una interrupcion y apaga el led por 5 segundos. Hasta ahi todo bien.
Ahora quise modificar la rutina para que cuando me detecte la segunda pulsacion del interruptor (es decir la segunda interrupcion) se encienda un led conectado al pin RB4.
Al parecer algo no funciona bien ya que luego de la primer interrupcion nunca enciende el segundo led ni tampoco el primero.
Adjunto el esquema en proteus y la rutina en PicBasic Pro.

Alguno podria ayudarme un poco con esto?

Muchas gracias
 

Adjuntos

#2
Hola xvladx:

No se si pueda funcionar el código así ya que no tiene definido ni el tipo de micro-controlador ni los puertos.

Probé el código en Proton, y funciona haciendo unos pequeños cambios.

Checa que necesitas hacer para acoplarlo al PicBasic, creo que Pic Basic no soporta (DelayMS 500, hay que cambiarlo a Pause 500), y el header para el tipo de procesador.

Código:
' Inicio del PIC
[COLOR=red]Device 16F628A        ' (Declarar el tipo de procesador)[/COLOR]
 
[COLOR=#ff0000]TRISB = %00000001  ' (Dar de alta el pin de entrada y las demás salidas)[/COLOR]
 
 
 led     var     PORTB.7
 cuenta var byte
 ledverde    var     PORTB.4
       On Interrupt Goto myint   ' Define interrupt handler
       INTCON = $90              ' Enable INTE interrupt
 cuenta = 0
 low ledverde
 
mainloop: High led              ' Turn LED on
         If cuenta = 2 then 
          high ledverde : DelayMS 500
[COLOR=red]       cuenta = 0           ' (Resetear la cuenta a cero cada que llega a 2)[/COLOR]
          [COLOR=red]low ledverde         ' (apagar el led para poder ver la cuenta a 2)[/COLOR]
         endif
Goto mainloop               ' Do it forever
 
' Interrupt handler
 Disable                   ' No interrupts past this point
myint: 
 Low led                    ' If we get here, turn LED off
 DelayMS 500                 ' Wait .5 seconds
 cuenta = cuenta + 1 
 INTCON.1 = 0               ' Clear interrupt flag
 resume                     ' Return to main program
 Enable
 
END
Espero y te sea útil esta información :)
Saludos al foro!!!
 
#3
Apollo, muchas gracias por tu respuesta. Tu programa funciono perfecto!!!
Dado que soy muy novato no puedo encontrar el por que fue que funciono tu rutina y la mia no. Con PicBasic pro no hace falta definir el PIC ya que lo hace el Microcode.
En mi rutina es como que no se incrementa la variable cuenta.

Aprovecho una mas para preguntarte lo siguiente:
Quiero poder medir el periodo entre un pulso y otro de una señal cuadrada que puede ir entre 3 y 10Hz (muy baja frecuencia). Mi idea es que a traves de de la interrupcion (como la anterior) me detecte el flanco de subida del primer pulso, se dispare el TMR1 y con la llegada del segundo flanco de subida correspondiente al segundo pulso, el TMR1 se detenga. Leo el valor del TMR1 y asi obtengo el periodo entre pulsos.
Es correcta la forma de hacerlo? Se puede implementar de esta manera o hay otras formas mas exactas?

Nuevamente muchas gracias
 
Última edición:
#4
Hola amigos! Continuo tratando de medir con el PIC16F628A el tiempo que transcurre entre la llegada de un pulso y otro. Aproximadamente los pulsos llegan con una frecuencia de 5 a 7Hz.
El procedimiento que elabore es el siguiente:
En la entrada de interrupcion RB0/INT le conecto el generador de pulsos.
Con la llegada del primer pulso se provoca una interrupcion y se da comienzo a la cuenta mediante TMR1. Con la llegada del segundo pulso, vuelvo a interrumpir y para la cuenta del TMR1.
El valor leido en TMR1 debe ser el tiempo entre pulso y pulso que es lo que quiero saber.
Podrian decirme si esta correcto lo que estoy haciendo???
Le estare muy agradecido por sus respuestas.
Saludos!!!
 
#6
Hola xvladx :)

Que bueno que ya te funciona el código. Un detalle.

Lo unico que no dejaba funcionar bien tu código es (aparte de lo que ya explicaste del código para el micro), es que para encender el led verde usabas:

If cuenta = 2...... haz esto...

Esto funcionaba bien la primera vez ya que cuenta era = 0, y cada pulsación iba incrementando, al llegar al primer 2, encendías el led y listo, pero tu cuenta seguía de largo por el 3, 4, 5, etc... Por lo que tu sentencia IF jamás va a volver a ser cierta. El problema no es que la cuenta no se incrementara, sino que seguía incrementándose sin parar. Con resetear al final de la rutina del IF, aseguras que la cuenta pueda llegar de nuevo a 2.

Y para el contador de tiempo entre disparos, la idea que tienes en mente parece ser una buena solución, estaba repasando entre los comandos de PBP y encontré PULSIN, pero ese comando sólo mide el tiempo que se mantiene en un estado el pin, y COUNT, este sirve para contar el número de pulsos en un pin sobre una base de tiempo predeterminada, posiblemente este último podría servirte.

Te dejo una tabla de comandos para PBP, la cuál me fué de mucha utilidad al comenzar con este compilador.

Espero y te sea útil esta información.
Saludos al foro :)
 
Última edición:
#7
Apollo nuevamente te estoy muy agradecido. te comento que avance bastante con lo que quiero hacer. Simplemente es un medidor de periodo entre un pulso y el que le sigue aplicados en la pata RB0/INT del pic 16F628A.
Con tu ayuda y la de otro forista llegue a lo que hice hasta ahora, pero...lo que me muestra el LCD no es el tiempo entre pulsos que es lo que yo quiero.
Por si tenes ganas de mirar el circuito hecho en Proteus y el codigo, te lo adjunto.
Un saludo y muchas gracias nuevamente!!!!
 

Adjuntos

#8
Estimdos colegas. Se que tal vez mi inquietud es probablemente algo muy conocido para ustedes, pero para mi que recien comienzo me esta dando grandes dolores de cabeza.

Estoy haciendo un circuito con un PIC16F628A con el que deseo contar el tiempo transcurrido entre la llegada de un pulso y el siguiente y luego mostrar el dato del tiempo (período) en un LCD.
EL problema que tengo es que lo que me muestra en el LCD no es para nada parecido al tiempo que deberia indicarme.
Por favoooorrrrrrr, alguno podria ayudarme?
El esquema esta en Proteus y variando el potenciometro se varia la freciencia del tren de pulsos aplicado al pin RB0/INT del PIC.
Desde ya muchas gracias por prestarme atencion y dedicarme un poco de su tiempo.

Flavio
 

Adjuntos

#9
Hola.Creo que es mi primer post y soy bastante nuevo en esto,a mi me sirvió lo siguiente.
Utilizando la lectura de un timer,puedes hacer esto,dentro de la interrupción:

t2=lectura del timer.
t=t2-t1.
t1=t2.

Dependiendo del cristal y del prescaler del timer,en t tendrás el tiempo del pulso,por ejemplo si el timer se incrementa cada micro segundo ,el periodo sera t micro segundos.
 
#10
Bienvenido al foro Jabato y gracias por tu apreciacion que es muy buena por cierto.

Me surgen 2 inquietudes despues de leer tu posteo. La primera es que como estoy trabajando con TMR1 que es un timer de 16 bit, el timer carga los 8 bits mas bajos en una variable y los 8 bit mas altos en otra variable. Como manejo la resta (t2-t1) ?
La segunda inquietud es saber si estaba errado en lo que habia escrito yo en el programa, ya que el timer arrancaba en 0 y luego de hacer el conteo hasta la llegada del segundo pulso, volvia a ponerse en 0. Es decir, no es lo mismo que estas proponiendo?

Un saludo y muchas gracias
 
#11
No se si el basic que usas admite esto.
t2.HB=TMR1H
t2.LB=TMR1L

Tendrías en una variable word el valor de tmr1,t1 y t también tienen que ser de tipo word

Por lo demás,el valor que tenga tmr1 es indiferente,aunque la resta sea negativa se va a producir un desbordamiento,es lo mismo 5-1 que 2-E en hexadecimal,el resultado va a ser siempre 4 si no tenemos en cuenta el acarreo.

Un saludo y gracias por la bienvenida.(y)
 
#12
SImplemente queria dar una devolucion al foro ya que en algunos posteos anteriores estuve preguntando como hacer para medir el período de un tren de pulsos.
Una forma muy precisa de lograrlo es medianto las sentencias Pulsin y RCtime de PicBasic pro.
Les adjunto parte del codigo y algunos comentarios, espero que a alguno le sirva.

Código:
@ DEVICE XT_OSC
define OSC 4
pulsHi var word
pulsLo var word
Time var  word

MeasLoop:
Pulsin PortB.0,1,PulsHi
RCTime PortB.0,0,Pulslo

Time = PulsHi+PulsLo
lcdout $FE,1, dec time
Goto measLoop
El resultado queda en la variable Time y debe ser multiplicado por 10us

Pulsin toma en cuenta el tiempo en alto del pulso y RCtime el tiempo en bajo. El tiempo maximo a medir que admiten estos comandos es de 65536us para eñl tiempo en alto (Pulsin) y de 65535us para el tiempo en bajo (RCtime), por lo que el maximo periodo a medir sera de 131.070us o sea 1,310 seg.
 
Última edición:
#13
Que bien, pero por que no posteas esta solucion en el hilo donde planteaste la consulta inicialmente... asi todo queda mas facil de entender y no creas temas nuevos sin necesidad ?

Saludos.
 
Arriba