Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

12/04/2010 #1


interrupcion con PIC16F628A
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
12/04/2010 #2

Avatar de Apollo

Respuesta: interrupcion con PIC16F628A
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
Device 16F628A        ' (Declarar el tipo de procesador)
 
TRISB = %00000001  ' (Dar de alta el pin de entrada y las demás salidas)
 
 
 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
       cuenta = 0           ' (Resetear la cuenta a cero cada que llega a 2)
          low ledverde         ' (apagar el led para poder ver la cuenta a 2)
         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!!!
12/04/2010 #3


Respuesta: interrupcion con PIC16F628A
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
13/04/2010 #4


Medicion de tiempo entre 2 pulsos
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!!!
13/04/2010 #5

Avatar de cosmefulanito04

Respuesta: Medicion de tiempo entre 2 pulsos
Aca tenes el procedimiento para señales de culaquier rango:

Obtener periodo/frecuencia

Lo que te recomiendo, es que si tu señal es tan lenta como 5Hz -> 200mSeg, al menos te tomes 3 o 4 periodos para poder obtener varios decimales a la hora de hacer el promedio, osea que entre muestra y muestra tardes 600 u 800 mseg.
14/04/2010 #6

Avatar de Apollo

Respuesta: interrupcion con PIC16F628A
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
14/04/2010 #7


Respuesta: interrupcion con PIC16F628A
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!!!!
Archivos Adjuntos
Tipo de Archivo: zip Interrupcion LCD.zip (16,8 KB (Kilobytes), 241 visitas)
14/04/2010 #8


Contador de pulsos con LCD y pic16F628A
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
Archivos Adjuntos
Tipo de Archivo: zip Intpb0.zip (16,8 KB (Kilobytes), 94 visitas)
14/04/2010 #9

Avatar de 1jabato1

Respuesta: Contador de pulsos con LCD y pic16F628A
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.
14/04/2010 #10


Respuesta: Contador de pulsos con LCD y pic16F628A
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
14/04/2010 #11

Avatar de 1jabato1

Respuesta: Contador de pulsos con LCD y pic16F628A
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.
10/05/2010 #12


uso de Pulsin y RCtime
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.
10/05/2010 #13

Avatar de tecnogirl

Respuesta: uso de Pulsin y RCtime
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.
10/05/2010 #14
Moderador general

Avatar de Cacho

Respuesta: uso de Pulsin y RCtime
tecnogirl dijo: Ver Mensaje
...por que no posteas esta solucion en el hilo donde planteaste la consulta inicialmente...
Hecho

Saludos
10/05/2010 #15


Respuesta: interrupcion con PIC16F628A
Perdon pero no encontraba el tema que habia abierto anteriormente
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.