TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: alarren en 07 de Enero de 2010, 06:08:43
-
Muy buenas.
La cuestion, es que estoy detectando pulsos de corta duracion por cambio de flanco en rb7 y rb6. Trabajo con pic 16f876 y pic 16f84.
La cosa es que detecta bien los pulsos y provoca la interrupcion. Pero necesitaria saber cual de las dos entradas ha probocado la interrupcion.
Como son pulsos, la patilla vuelve a su valor original, y por lo tanto no puedo comprobarlo.
Me gustaria saber si existe la posibilidad de que los valores de la puerta b no se actualizen una vez entrada la interrupcion.
Muchas gracias
-
hacerlo mu rapido :D
-
??
-
Creo que sería tan sencillo como cuando apenas entres a la interrución entonces preguntes con un BTFSS/BTFSC en que estado está cada pin. Uno de ellos tendrá que estar en estado cambiado y entonces actuas en consecuencia.
-
es justo como te dice Pibe, al entrar en la rutina de interrupcion localizas que int ha saltado y de seguido testeas los pines, hay muchas rutinas por el foro. mira a ver si encuentras algo que te sirva, o pon un poco mas de info para que te podamos ayudar.
btfss portb,4
goto ande_quieras
btfss portb,5
goto ande_quieras
btfss portb,6
goto ande_quieras
btfss portb,7
goto ande_quieras
para pusadores normalmente se utiliza una pequeña rutina de demora, unos 10-20ms y vuelta a testear. para evitar rebotes
un saludo
-
Gracias por contestar, pero no me resulta valido.
Para poder mirar que puerta a recibido el cambio de estado, esta tiene q durar mas de un ciclo de reloj.
Mis pulsos duran un ciclo o dos de reloj como mucho, entonces, o consigo mantener sin actualizar los valores de la puerta b, o no sere capaz de saber kual es el que a disparado.
Imagino que la solucion vendra al final, con algo de logica digital externa, unos monoestables o biestables que cambien el estado con la interrupcion y luego resetearlos con el pic.
-
¿Es necesario que lo hagas por interrupción?
Porque podrías hacerlo dejando una lectura constante del puerto B en W. Cuando W sea diferente a cero, entonces revisas qué bit de W ha cambiado.
-
.
¿y un oscilador más grande? :?
-
y cuanto han de durar los pulsos,me parece una solucion rapida la q plantea migsantiago y si le subes al cristal mejor, si no usas la interrupcion te ahorras el proceso "push” ” pop" al entrar y salir de la interrupcion respectivamente
-
Otra opción mas rebuscada :mrgreen: es usar interrupción externa para un pulso y Timer0 en modo contador 1:1 y timer pre-cargado a 254. Con eso, si el estado en 0, es largo puedes determinar cual generó el pulso.
Saludos!
-
pa mi que como no especifiques un poco mas... vamos a estar tirando ideas que a lo mejor tienen una solucion simple. postea el codigo que tienes y lo que quieres hacer de una forma mas especifica para poderte ayudar mejor. que tipo de comunicacion, u que es lo que quieres conectar ...
un saludo
-
Creo que la opcion de Suki es la ideal, ya que son flags distintos los que se quedan seteados, la puede mirar si quiere media hora despues, ya que los flags los va a borrar el programador y no el hard del PIC.
Muy buena Suki :-/
saludos
-
Pero estoy mal en un detalle, se debe pre-cargarse a 255, así al llegar el pulso incrementa la cuenta, el overflow genera la interrupción y se detecta.
Saludos!
-
Creo que ni en eso te equivocas porque avanza dos numeros por cada pulso no?. Pero para ir a lo seguro mejor poner 255
-
Creo que ni en eso te equivocas porque avanza dos numeros por cada pulso no?. Pero para ir a lo seguro mejor poner 255
mmm... No, podemos dejar el timer 1:1 asignando el prescaler al watchdog pero sin encenderlo, y como cuenta con flancos ascendentes capturaríamos el pulso.
Saludos!
-
mmm... No, podemos dejar el timer 1:1 asignando el prescaler al watchdog pero sin encenderlo, y como cuenta con flancos ascendentes capturaríamos el pulso.
Pues si señor, porque con el preescaler asignado al TIMER0 para este caso concreto no valdria, ya que se tienen que producir 2 flancos para desbordar, cargado con 255.
No sabia que se pudiera hacer esto. Asignarle el prescaler al watchdog para que el TIMER vaya mas rapido, sorprendente.
saludos