TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: Fer_TACA en 06 de Octubre de 2008, 03:47:39
-
Hola amigos:
Quiero empezar a utilizar las interrupciones en proton, para lo cual me he ido a la ayuda y el ejemplo de configuracion me lo he copiado y trarto de simularlo paso a paso y cual es mi sorpresa que no me va bien.
He implementado y habilitado la interrupcion por cambio de estado en los pnes RB4 a RB7. El caso es que si entra en la rutina de interupcion pero al salir cuando le borras el flag con: INTCON.0=0 ; obsevo en proteus que no lo borra y lo mantiene siemore a 1 pero si sigues ejecutando el programa al cabo de 10-12-15 veces o ls que quiere es cuando lo borra.
Esto le passa a alguien mas o mi solo
Fermin
-
Hola Fermin
Personalmente he probado las interrupciones proton + proteus pero no me funcionan bien, por ejemplo las del TMR me hace cualquier cosa menos lo que está programado :D la solución es probarlo en un circuito real, si alguien las hizo andar que pase el secreto talvez cometo algún error de conf. pero he probado varias veces y modificando y no es confiable .-
saludos y bienvenido al BASIC
Hernán
-
Que tal amigos!
Miren yo he utilizado las interrupciones con el proton y proteus y todas me han funcionado muy bien :mrgreen:
Las he realizado con el porb.0, con los timer y usart y todas siempre me han funcionado :shock: :mrgreen:
Podrian ustedes postear los codigos que les dan problemas para ver lo que sucede?
Y yo apenas tenga un tiempito se los pruebo :mrgreen:
Ojo la ultima version del proton tiene mejoras sustanciales en cuanto al manejo de las interrupciones por hardware, que lo hace superior a la version 3.2.5.5, que creo, es la antepenultima version de ese compilador :shock:
SAludos
-
Hola amigos:
Siiiiiiiiiiiiiiiiiiii, yo te los voy a postear amigo RALF. Aunque mi programa (es el ejemplo del help del proton) lo unico que hace es activar la interrupcion cuando se produce un cambio en el pin RB4.
Ahora estoy en el curro y cuando llegue a casa adjuntaré, tanto el programa como el esquema del proteus.
Fermin
-
Ok amigo no te preocupes postealo y yo lo revizo y te doy los resultados :mrgreen:
Saludos
-
Hola amigos,
adjunto los ficheros den cuestion.
El programa trata de supervisar el estado de 3 entradas, en si el programa funciona excepto que cuando se va a salir de la interrupcion en proteus no se borra el flag, con lo cual se repiten las interrupcines. El cambio de estado se efectua chequeando RB4.
Espero que perdonen la escritura del programa soy NOVATO y seguro que se puede hacer mejor.
Fermin
-
Que tal amigo!
Mira el lazo while wend le falta colocar un retardo de por ejemplo 1ms.
si : while compresor = 0 : delayms 1 : wend
Sino lo haces asi y entras en ese lazo, es posible que la interrupcion no se ejecute :shock: en el manual lo explican :mrgreen:
pero con otra instruccion similar :mrgreen:
veo dos disable tambien elimina uno :mrgreen:
Prueba y avisame!
SAludos
-
Gracias por las repuesta amigo RALF. Te cuento:
Como hice varias pruebas al final se quedo duplicado la linea de disable 2 veces. Tambien tenia puesto el retrdo. Pero lo más curioso es que ni con el ejemplo de la ayuda que viene en proton me funciona.
Adjunto el programa real tal cual estoy probando, habilitando el registro INTON solo con la interrupcion general y el cambio de estado en RB4 a RB7. Al salir de la interrupcion nunca borra la bandera del RBIF(INTCON bit 0).
La version de Proteus que utilizo es la V7.1SP4 y de Proton 3.2.5.5
Un saludo
Fermin
-
Ok fer taca dejame esta semana que me desocupe un poco y te lo dejo funcionando!
Nota: El retardo de 1000ms es mucho deberia ser de solo 1ms :mrgreen:
SAludos
-
OK. amigo Ralf, pero de antemano te digo que he probado con varios valores de Delay y el resultado siempre es el mismo.
F.
-
Que tal Fer Taca!
Bueno alli lo tienes :mrgreen:
Funcionando al pelo :D
Pruebalo y me avisas!
Saludos
-
Gracias Ralf,
probaré y reportaré
F.
-
Ok, estare a la espera de tus comentarios! :mrgreen:
Saludos
-
Bueno aquí van mis comentarios y después de extrujarme los sexos:
1º Efectivamente el programa con su esquema funciona perfectamente.
2º Copio tu programa en mi esquema cambiando, la salida del puerto A(pin0) por el puerto B(pin0), apar dejarlo como el tuyo t sigue funcionando perfectamente. De esto entiendo que el esquema está bien.
3º Ahora vuelvo a colocar la salida en el pin 0 del puerto A. Para ello modifico el programa que me mandaste eliminando la instruccion LOW led (creo que segun indica en el manual programa el puerto como salida pero solo funciona con el puerto B) y la cambio por asignar a la variable "led" el valor =0.
Antes en la cabecera del programa y le indico que voy a utilizar el puerto A como salida y declaro los pines como todos digitales y sorpresa :x
YA NO FUNCIONA.
Se repiten las interrupciones y al salir de la rutina de interrupcion ya no se borra el RBIF
De todo esto deduzco que al realizar esa configuracion hay algo que está mal realizada o más bien que falta algo, pero ya no se me ocurre que.
Por otra parte entiendo que la zona de programa de retardo de 1ms es el "main" y que ahí puede ir cualquier otra cosa
Este es el programa que me pasaste:
Device 16F877
XTAL = 4
Symbol LED = PORTB.0
Symbol RBIF = INTCON.0
INTCON = %10001000
Low LED
DelayMS 400
On Interrupt GoTo ISR
While 1 = 1
DelayMS 1
Wend
Disable
ISR:
Toggle LED
RBIF = 0
Resume
Enable
End
Y esta zona de aquí es la que realizo yo:
Device 16F877
XTAL = 4
Symbol LED = PORTA.0
Symbol RBIF = INTCON.0
INTCON = %10001000
ALL_DIGITAL = True 'Todos los pines son digitales
TRISA = %00000000
LED=0
DelayMS 400 'He probado con delay y sin delay
On Interrupt GoTo ISR
Main:
While 1 = 1
DelayMS 1
Wend
goto Main
Disable
ISR:
Toggle LED
RBIF = 0
Resume
Enable
End
Como ves sólo está el cambio del puerto A por B el resto es lo mismo, pero aquí se producen multiples interrupciones y la verdad ya no se que pensar, pero seguro que hay algo mal.
Saludos
F.
-
Que tal fer taca!
Efectivamente si colocas la salida en elk porta.0 el circuito no responde bien en proteus :shock: :8}
Ahora bien para descartar que el problema sea en el compilador o en el proteus, porque no montas el circuito en fisico y pruebas a ver cual es el que esta fallando?
Yo de momento no tengo ese pic, si puedes prueba y me comentas, ya que si no funciona pedire ayuda a en el proton forum :mrgreen:!
Saludos
-
En cuanto tenga un poquitin de tiempo lo probaré en el nmundo real.
Tambien voy a probar con otro pic.
Fermin
-
Problema resuelto!
Cuando uno coloca el led en el portb al momento de entrar a la interrupcion uno lo manda a cambiar de estado (de 0 a 1 o viceversa), para hacer esto el proton debe leer el puerto completo para modificar solo el bit que necesita cambiar, al hacer eso este borra el rbif :shock: pero cuando el led es colocado en el porta este no lee el puerto B sino el A por lo que no se borra el rbif eso lo puedes constatar viendo el programa paso por paso en el proteus :mrgreen:
Entonces para resolver el problema creamos una variable temporal, de forma tal que al momento de entrar a la interrupcion lea el portb y asi resetee el RBIF :mrgreen: y colorin colorado este cuento se a acabado :D
Saludos
-
Lo probaré.
De todas formas no parece una forma muy elegante, al menos bajo mi punto de vista.
Pero en fin es una solucion y ademas no ocupa mucho.
Lo que me da por pensar que esta solucion o pequeño truco no lo debe saber mucha gente, al menos que sean pricipiantes como yo y desde luego puienso que es un datro muy a tener en cuenta para proyectos posteriores.
Una vez mas muchas gracias amigo RALF.
Fermin
-
Que tal fermin!
Mira revisa el data sheet en la parte que trata de las salidas del pic (I/O ports), donde hablan del portb explican el procedimiento a seguir.
Recuerda solo te di un ejemplo de la forma como puedes actualizar el portb y asi poder borrar el RBIF, no obstante lo puedes modificar a tu gusto para que se vea mejor de acuerdo a tus gustos y necesidades :D
Saludos