Autor Tema: interrupciones mikrobasic  (Leído 3482 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado eloysn

  • PIC10
  • *
  • Mensajes: 16
interrupciones mikrobasic
« 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
« Última modificación: 11 de Diciembre de 2011, 09:22:53 por eloysn »

Desconectado PICTW

  • PIC10
  • *
  • Mensajes: 21
Re: interrupciones mikrobasic
« Respuesta #1 en: 17 de Enero de 2012, 16:58:00 »
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


Desconectado rina

  • PIC10
  • *
  • Mensajes: 45
Re: interrupciones mikrobasic
« Respuesta #2 en: 18 de Enero de 2012, 02:54:33 »
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
« Última modificación: 18 de Enero de 2012, 03:13:03 por rina »


 

anything