TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: eloysn en 10 de Diciembre de 2011, 14:17:51
-
hola y saludos al foro ,necesito un poco de ayuda ,tengo el siguiente codigo
program interrup
sub procedure interrupt
porta=%00000000
delay_ms(1500)
INTCON=%10010000
end sub
main:
inicio:
INTCON=%10010000 ' habilita interrupciones rb0
trisb = %11111111
trisa =%00000000
porta=0
portb=0
if portb.7=1 then
goto rutina
end if
goto inicio
rutina:
porta.0=1
delay_ms(500)
porta.0=0
delay_ms(500)
goto rutina
end.
Lo que trato es que al presionar un pulsador empieze a parpadear un led,y que cuando presione el pulsador conectado a rb0 ,comience la interrupcion que basicamente lo que hace es apagar el led que parpadea,el problema es que la interrupcion si se produce cuando activo rb0 pero luego me devuelve al zona del programa donde parpadea el led y lo que quiero es que se apague y esperar a que se pulse de nuevo el pulsador para comenzar con la rutina de parpadeo.gracias
-
Hola
Me parece que tenés un problema de la estructura del programa, cuando salís de la int, vuelve a donde quedó, por lo que seguirá en el bucle infinito rutina:
Podés probar p.ejemplo un while con una condición, p.ej: una variable noapaga = 1, luego tu rutina de prende, espero 500ms, apaga, etc y al final wend. Mientras se cumpla la condición de la var noapaga sigue en el loop.
Bastará que la int, ponga esa variable a 0 y se termina el loop.
(Hay miles de otras formas.....)
Suerte
-
ya lo dejaste hay trabado pero me imajino que seria a drede para despues poder salir de ese trabon pulsando b.0
creo que para esos dos compiladores las instruciones son iguales
program interrup
sub procedure interrupt
porta=%00000000
delay_ms(1500)
ON INTERRUPT GOTO salto ' el salto de linea que aria la interruccion
INTCON=%10010000 ' habilita interrupciones rb0
end sub
main:
inicio:
trisb = %11111111
trisa =%00000000
porta=0
portb=0
if portb.7=1 then
goto rutina
end if
goto inicio
rutina:
while intcon.1=0 sales del bucle cuando intcon deja de ser 0 (lo cual que a entrado en la interrucion de b.0)
porta.0=1
delay_ms(500)
porta.0=0
delay_ms(500)
wend
intcon.1=0 ' en el bit 1 del intcon se pone a uno cuando a sucedido la interruccion la pones a cero para aprovecharla como memoria
goto inicio
DISABLE ' para indicar al pbp que es la parte de la interruccion
salto:
' metes alguna otra cosa si quieres, esta seria la parte de programa de las interruciones
' aprovechas las marcas de por que inteccion a entrado y saltas dentro para ir directamenteaprovechando
' el bit de memoria que te indica por que interruccion entro
' en este caso simplemente la usamos para salir del bucle del parpadeo
RESUME
ENABLE
realmente las interrucciones son para entrar en una parte del programa especial por funciones de datos u otra fuente que tenga que leer insofactamente este donde este el programa pincipan funcionando y regresa al mismo sitio donde estaba por eso no es bueno salir de ella con un goto dado que almacena en un rejistro donde tendria que volver si regresa de un gosub si te buelves con un goto esto queda almacenado y despues puede darte saltos inesperados de linea.
vamos ON INTERRUPT GOTO es mas como un gosub. almacena la ninea donde estaba y salta automaticamente a esa parte de programa cuando termina se vuelve ala linea donde estaba antes del salto.. bueno realmente no se si dara fallos y simplemente cuando exista otro gosub almacenara el nuevo dato de regreso.. es tambien muy bien emplear buen los saltos de linea y los gosub para poder ahorar programa
hay partes que puede interesar mas entrar con un gosub aunque ocupe 2 procesos pero puedes ir y volver de ese punto en distintas partes del programa pero para otras es mejor usar un simple salto de linea que es un proceso nada mas y no almacenas ningun dato para el regreso.. (y mira eso no se en que apartado de memoria lo almacena el pic "el regreso del salto gosub")
a vaya y para que el compilador adacte bien el tiempo del pause en tu caso delay_ms(500) tienes que definirle la velocidad del oscilador que usas 4, 8 12mhz lo que sea el despues crea una especie de subrrutina en la que ajusta el tiempo al compilarlo
bueno y otra cosa que me dejo pillado son estras instruciones que tienes puestas al principio "program interrup" "sub procedure interrupt". que son los comandos que usa ese compilador para reconocer la parte de programa dentro de la interruccion???
un saludo y espero que te sirva para tu compilador y sino seguro que son muy parecidos los comandos