Autor Tema: Manejo de interrupciones!!!! Help  (Leído 13165 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Sispic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1685
    • winpic800
RE: Manejo de interrupciones!!!! Help
« Respuesta #30 en: 30 de Noviembre de 2003, 03:04:00 »
Heyyyy Marcos ande te has ido ..... asi que privaditos con luis heeee ???? . Haver si comparte con nosotros su secreto .

Espabila que tienes tajo :
Codigo:

Define  INTHAND  _Interrupcion


wsave        var byte bank0 system  " estos registros en banco 0 obligatorio
ssave        var byte bank0 system
psave        var byte bank0 system
ticks        var byte bank0 system
Convert      var byte bank0 system
segundos     var byte bank0 system
minutos      var byte bank0 system

Interrupcion: "********* Asegurate que este en pagina 0 *************
asm
   bcf INTCON , GIE ; apaga interrupciones generales

   ; interrupcion por Timer0
 
   decfsz ticks,f
   goto SalInt
   movlw 122     ; Paso un segundo - actualiza tiempo
   movwf ticks
   movlw 6
   movwf tmr0
   clrf Convert         ; Convert = 0
   incf   segundos,f
   movf   segundos,w
   sublw 60
   btfss STATUS,Z   ; 60 segundos ?
   goto  SalInt   ; no
   clrf   segundos   ; si
   incf   minutos,f
   
SalInt
    bcf   INTCON , T0IF  ; Resetea bandera de interrupcion por Timer0   
    bsf INTCON , GIE   ; Activa interrupciones generales
    movf  psave,w      ; restaura
    movwf PCLATH
    swapf ssave,w
    movwf STATUS
    swapf wsave,f
    swapf wsave,w
    retfie
EndAsm

ActivaInterr:  "***********************************************

ticks=122     " OSC 4 Mhz.  ok ???
segundos=0
minutos=0
TMR0=6
OPTION_REG=%00000100   " prescaler 1:32
INTCON.5=1 "T0IE  - TMR0 Overflow Interrupt Enable
INTCON.7=1 "GIE   - interrupciones generales
Return


Haber si puedes adaptar esto a tu programa , olvídate de momento del RS422 y en vez de usar una word para los segundos , utiliza dos bytes segundos y minutos .

ya contaras .

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
RE: Manejo de interrupciones!!!! Help
« Respuesta #31 en: 01 de Diciembre de 2003, 05:18:00 »
OK, Sisco, lo pruebo y te aviso.
Tal como lo leo me parece logico, ademas descular de a tramos es tambien logico.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
RE: Manejo de interrupciones!!!! Help
« Respuesta #32 en: 01 de Diciembre de 2003, 05:56:00 »
Una mas Cisco y me voy...


Interrupcion: "********* Asegurate que este en pagina 0 *************
asm
   bcf INTCON , GIE ; apaga interrupciones generales



Como me aseguro que la rutina esta en pagina 0 ???
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Sispic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1685
    • winpic800
RE: Manejo de interrupciones!!!! Help
« Respuesta #33 en: 01 de Diciembre de 2003, 09:21:00 »
Si , ponlo al principio del programa para ir a lo seguro .
por  ejemplo despues de la definicion de las variables .

a var byte
b var byte
etc .

goto Main  " saltas el handle de interrupcion

Interrupcion:
bla
bla
bla
retfie


Main " inicio del programa


Desconectado Abago

  • PIC24F
  • *****
  • Mensajes: 792
RE: Manejo de interrupciones!!!! Help
« Respuesta #34 en: 19 de Diciembre de 2003, 22:25:00 »
Hola a Todos, Tras unos dias de intentar dar con la solución,
me decido a preguntar de nuevo....
mis conocimientos de asm, son minimos, y mi cerebro ha quedado colapsado....
supongo que la solución, no será demasiado compleja, pero para mi, lo es...
.
explico mis intenciones

tengo un programilla en PBP, en el que me he creado 4 variables
flag, para controlar los estados de lectura de 4 pines

FL_var1, FL_var2, FL_var3, FL_var4
estas 4 varialbes, en el modulo principal en PBP, se setean a unos valores, por ejemplo 16,4,32,1 (estos van a ser los valores de inactividad en minutos)

ahora viene la duda...
En los post anteriores, sispic, dejo una parte de código, que me ha sido muy util, pero lo que necesito, es adaptarla, para que en vez de que cada 60 segundos, incremente un minuto,  decremente las variables FL_var1 - FL_var4, siempre y cuando estas no esten a 0.

para que esta idea????
Pues, la necesito, para controlar que no se lea el valor de cada uno de los pines, por determinado tiempo en minutos.

Alguna sugerencia???

Muchas gracias de antemano

--
Atentamente
Abago

Desconectado Sispic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1685
    • winpic800
RE: Manejo de interrupciones!!!! Help
« Respuesta #35 en: 20 de Diciembre de 2003, 00:23:00 »
Que te parece  .......
puedes usar basic sin problemas para decrementar variables en la interrupcion , aunque  será in pelin mas lenta.

pruebalo así  y si acaso se diseña directamente en asm si te da problemas aunque no hay mucha diferencia .


Codigo:

FL_var1  var byte bank0 system
FL_var2  var byte bank0 system
FL_var3  var byte bank0 system
FL_var4  var byte bank0 system

Interrupcion: "********* Asegurate que este en pagina 0 *************
asm
   bcf INTCON , GIE ; apaga interrupciones generales

   ; interrupcion por Timer0
 
   decfsz ticks,f
   goto SalInt
   movlw 122     ; Paso un segundo - actualiza tiempo
   movwf ticks
   movlw 6
   movwf tmr0
   clrf Convert         ; Convert = 0
   incf   segundos,f
   movf   segundos,w
   sublw 60
   btfss STATUS,Z   ; 60 segundos ?
   goto  SalInt      ; no
   clrf   segundos   ; si
   endasm
   if FL_var1 <> 0 then FL_var1=FL_var1-1
   if FL_var2 <> 0 then FL_var2=FL_var2-1
   if FL_var3 <> 0 then FL_var3=FL_var3-1
   if FL_var4 <> 0 then FL_var4=FL_var4-1
   asm
   
SalInt



salud2

Desconectado Abago

  • PIC24F
  • *****
  • Mensajes: 792
RE: Manejo de interrupciones!!!! Help
« Respuesta #36 en: 20 de Diciembre de 2003, 12:44:00 »
Muchas Gracias Sispic, pedí una soluciñon, y ya la tengo.
La idea, es perfecta, en principio, empecé haciendo el modulo de interrupciones en PBP, al ver que comentabas, que no era recomendable, empecé a leer, y a preguntar, y ya tengo el handler en ASM, pero se me puso por medio, el problema que comento en el post anterior.
Me habia atascado.... Pero mi atasco se ha producido por pensar unicamente en asm...

Tu solución es perfecta... Muchas gracias....

Es muy complicado hacerlo en ASM???? Es que ya me lo he tomado como un reto personal...




Desconectado Abago

  • PIC24F
  • *****
  • Mensajes: 792
RE: Manejo de interrupciones!!!! Help
« Respuesta #37 en: 20 de Diciembre de 2003, 23:05:00 »
----------- Esta es parte de la pregunta....
..
..
...

PORQUE NO DECREMENTA????
En teoria, cada vez que pase un minuto, tendría que descontar las variables flag... Pero no es asi... Veis algo raro????

Tnks...


----------- He editado el post, y este codigo, ya funciona Perfectamente...

Define  INTHAND  _myint

TMR0=6
OPTION_REG=%00000100   " prescaler 1:32
INTCON.5=1 "T0IE  - TMR0 Overflow Interrupt Enable
INTCON.7=1 "GIE   - interrupciones generales


SALVAW       var byte bank0 system
SALVASTATUS  var byte bank0 system
SALVAPCL     var byte bank0 system
ticks        var byte bank0 system
Convert      var byte bank0 system
segundos     var byte bank0 system
minutos      var byte bank0 system

flvar1 var byte
flvar2 var byte
flvar3   var byte

cont var byte

ticks=122     " OSC 4 Mhz.  ok ???
minutos = 0
segundos = 0
flvar1 = 10
flvar2 = 2
flvar3 = 20

goto inicio

myint: "********* Asegurate que este en pagina 0 *************
asm
intt
      bcf     INTCON,GIE           ;Asegura la
      btfsc   INTCON,GIE           ;deshabilitacion
      goto    Intt                 ;global de las interrupciones
;
      bcf     INTCON,T0IF          ;Pone a cero para poder salir de la ISR
      ;bcf     INTCON,T0IE          ;Sacar si se quiere seguir capturando interrupciones en RB0
      decfsz ticks,f
      goto RestaurarRegistros
      movlw 122     ; Paso un segundo - actualiza tiempo
      movwf ticks
      movlw 6
      movwf tmr0
      clrf Convert         ; Convert = 0
      ;btfsc segundos
      incf   segundos,f
      movf   segundos,w
      sublw 60
      btfss STATUS,Z   ; 60 segundos ?
      goto  RestaurarRegistros   ; no
      clrf   segundos   ; si
      incf  minutos,f
      endasm
            if flvar1 > 0 then flvar1 = flvar1 - 1
            if flvar2 > 0 then flvar2 = flvar2 - 1
            if flvar3 > 0 then flvar3 = flvar3 - 1
      asm
;
RestaurarRegistros
      ; Retorna habilitando todas las interrupciones
      bcf   INTCON , T0IF  ; Resetea bandera de interrupcion por Timer0
      bsf     INTCON , GIE             ; Activa interrupciones generales
      movf    SALVAPCL,w                  ; Restore PCLATH, STATUS and W registers
      movwf   PCLATH
      swapf   SALVASTATUS,W        ;Invierte STATUS --> W
      movwf   STATUS               ;Restaura STATUS
      swapf   SALVAW,F             ;Invierte --> F
      swapf   SALVAW,W             ;Restaura W
    retfie
EndAsm



inicio:  "***********************************************
inr:    
            pause 300
            serout2 portb.7,188,[dec(segundos), " - " , dec(minutos) , " - " , dec(flvar1), " - " ,dec(flvar2), " - " , dec(flvar3), 13,10]
goto inr

Desconectado Abago

  • PIC24F
  • *****
  • Mensajes: 792
RE: Manejo de interrupciones!!!! Help
« Respuesta #38 en: 21 de Diciembre de 2003, 01:14:00 »
Gracias Sispic...

He editado el anterio post, con las modificaciones pertinentes...
Ya funciona...
No queria cargar el foro con errores...

Muchas gracias por tu ayuda...

de momento, me quedo con que ya funciona... Pero seguro que le seguiré dando vueltas...
A ver si lo saco en ASM...

Reitero en darte las gracias...


Desconectado Sispic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1685
    • winpic800
RE: Manejo de interrupciones!!!! Help
« Respuesta #39 en: 21 de Diciembre de 2003, 01:39:00 »
que compilador utilizas ?

si usas pbp 24x tendrias que usar esos nombres obligatoriamente para restaurar los registros ya que sin que tu se lo digas los salva antes de entrar en la interrupción.

wsave      
ssave
psave      

con el plus lo miro


Desconectado Abago

  • PIC24F
  • *****
  • Mensajes: 792
RE: Manejo de interrupciones!!!! Help
« Respuesta #40 en: 21 de Diciembre de 2003, 04:18:00 »
Hola Sispic...
Utilizo la version 2.43 de PBP
El programa, me funciona de los dos modos....
Pero tengo un problema...
Se me cuelga...

te dejo el programa completo, a ver si ves algo que pueda estar mal...


DEFINE OSC 4
Define  INTHAND  _myint

symbol Led_RF = porta.3

wsave       var byte bank0 system
ssave       var byte bank0 system
psave       var byte bank0 system
ticks        var byte bank0 system
Convert      var byte bank0 system
segundos     var byte bank0 system
minutos      var byte bank0 system

Flag_RF      var bit bank0 system
Flag_RB47        var byte bank0 system

flvar1      var byte
flvar2     var byte
flvar3       var byte

cont         var byte

SerialCNF con 188 " configuración del puerto serie con max232 4800 8N1 sin control de flujo




goto inicio

myint:
asm
intt
      bcf     INTCON,GIE           ;Asegura la
      btfsc   INTCON,GIE           ;deshabilitacion
      goto    Intt                 ;global de las interrupciones
;
      movwf   wsave                ;Salva W
      swapf   STATUS,W             ;Invierte STATUS --> W
      movwf   ssave                ;Salva STATUS
;
      btfsc   INTCON,INTF          ;? Hubo interrupcion en RB0 ?
      goto    In                   ;Si
      btfsc   INTCON,T0IF          ;? Hubo sobrefujo en TMR0 ?
      goto    T0                   ;Si
      btfss   INTCON,RBIF          ;? Hubo algun cambio de RB4-RB7 ?
      goto    RestaurarRegistros   ;No
;
Rb47  bcf     INTCON,RBIE  
      bsf     Flag_RB47            
      goto    RestaurarRegistros
;
T0    bcf     INTCON,T0IF
      decfsz ticks,f
      goto RestaurarRegistros
      movlw 122     ; Paso un segundo - actualiza tiempo
      movwf ticks
      movlw 6
      movwf tmr0
      clrf Convert         ; Convert = 0
      incf   segundos,f
      movf   segundos,w
      sublw 60
      btfss STATUS,Z   ; 60 segundos ?
      goto  RestaurarRegistros   ; no
      clrf   segundos   ; si
      incf  minutos,f
      endasm
            if flvar1 > 0 then flvar1 = flvar1 - 1
            if flvar2 > 0 then flvar2 = flvar2 - 1
            if flvar3 > 0 then flvar3 = flvar3 - 1
      asm    
;
      goto    RestaurarRegistros
;
In    bcf     INTCON,INTF        
      btfss   Flag_RF
      goto    in1
      bcf     Flag_RF
      goto    RestaurarRegistros
in1   bsf     Flag_RF
      goto    RestaurarRegistros
;
RestaurarRegistros
      ; Retorna habilitando todas las interrupciones
      bcf   INTCON , T0IF  ; Resetea bandera de interrupcion por Timer0
      bsf     INTCON , GIE             ; Activa interrupciones generales
      movf    psave,w                  ; Restore PCLATH, STATUS and W registers
      movwf   PCLATH
      swapf   ssave,W        ;Invierte STATUS --> W
      movwf   STATUS               ;Restaura STATUS
      swapf   wsave,F             ;Invierte --> F
      swapf   wsave,W             ;Restaura W
    retfie
EndAsm

ActivaInterr:

ticks=122     " OSC 4 Mhz.  ok ???
segundos=0
minutos=0
TMR0=6
OPTION_REG=%00000100   " prescaler 1:32

INTCON = %11110000    " Enable interrupt on general,PORTB.0, timer0

" -----------------------

Return


inicio:  "***********************************************
flvar1 = 10
flvar2 = 2
flvar3 = 20
Flag_rf = 0

call activainterr

inr:    
          while flag_rf > 0
          high led_Rf  
            serout2 portb.7,188,[dec(segundos), " - " , dec(minutos) , " - " , dec(flvar1), " - " ,dec(flvar2), " - " , dec(flvar3), 13,10]
          wend
          low led_rf        
goto inr


estoy testeando las interrupciones, para conocerlas mas a fondo... Pero me estoy dando una cantidad de golpes con ellas... que creo que van a acabar conmigo.,....

con este programa, lo que hago es leer la interrupción por rb0, y entrar en un bucle, que saca datos por puerto serie
en estos datos, leo los minutos, y los segundos testeados por la interrupción por timer0, y los datos de las variables flvarX, que van decrementando prograsivamente....
Supongo que esta explicación no seria necesaria... PEro la pongo por si acaso...

Bueno, pues me da un problema.. Y no se cual es....
Doy un pulso al portb.0, se me activa el flag_rf = 1...
y entro en el bucle que saca datos por puerto serie...
Hasta hay todo bien...
Los datos salen por el puerto serie a la perfección... Pero deberian salir... Constantemente hasta que entrase otro pulso por el portb.0... y se pusiese la varable Flag_rf  = 0... Pero cual es mi sorpresa....????
el bucle while, se termina por si solo.... Sin yo actuar sobre el portb.0

??????

A ver si veis algo.. que se me escape a mi....

Gracias.

Desconectado Abago

  • PIC24F
  • *****
  • Mensajes: 792
RE: Manejo de interrupciones!!!! Help
« Respuesta #41 en: 21 de Diciembre de 2003, 04:27:00 »
Se me olvidaba....
Parece que el codigo, va un poco lento....
Es posible????

Hay alguna forma de calcular el tiempo que ha sido pulsado el RB0???
Necesito que mi programa, dependiendo del tiempo que tengo pulsado el RB0, haga una u otra cosa....

Tnks.

Perdonad, si no dejo de hacer preguntas....
Pero esto le pasa a uno por querer aprender demasiado rápido....

llevo dos dias sin dormir por culpa de estos maravillosos cacharritos.... (PIC)


Desconectado Sispic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1685
    • winpic800
RE: Manejo de interrupciones!!!! Help
« Respuesta #42 en: 21 de Diciembre de 2003, 07:14:00 »
Te daré mi opinion , aunque tu puedes hacerlo como quieras .

******************************
intt
bcf INTCON,GIE ;Asegura la
btfsc INTCON,GIE ;deshabilitacion
goto Intt ;global de las interrupciones

Si pones a cero el bit GIE es absurdo  comprovar si esta a cero
**********************************
In bcf INTCON,INTF
btfss Flag_RF
goto in1
bcf Flag_RF
goto RestaurarRegistros
in1 bsf Flag_RF
goto RestaurarRegistros ......-> Esto te lo puedes ahorrar
;
RestaurarRegistros
**********************************
while flag_rf > 0
high led_Rf
serout2 portb.7,188,[dec(segundos), " - " , dec(minutos) , " - " , dec(flvar1), " - " ,dec(flvar2), " - " , dec(flvar3), 13,10]
wend

Esto te saturará rapidamente el buffer de recepcion del pc si no le pones un pause
************************************
while flag_rf > 0

yo lo haria así
while flag_rf = 1
************************************
se supone que tendras rb0 con una resistencia pushpull o como se llame , ademas tendrias que ponerle un pequeño retardo por software para los rebotes del pulsador.

Una forma seria esta aprobechando el serout::

if flag_rf = 1 then
high led_Rf
pause 50
INTCON.INTE=1 ***"permiso para otro impulso rb0 , no lo hagas en la interrupcion , ademas ponlo a cero al entrar en ella
INTCON.INTF=0  
while flag_rf = 1
serout2 portb.7,188,[dec(segundos), " - " , dec(minutos) , " - " , dec(flvar1), " - " ,dec(flvar2), " - " , dec(flvar3), 13,10]
pause 500
wend
endif

por lo demas parece correcto .

nos cuentas haver como te marcha .

Desconectado Abago

  • PIC24F
  • *****
  • Mensajes: 792
RE: Manejo de interrupciones!!!! Help
« Respuesta #43 en: 22 de Diciembre de 2003, 15:21:00 »
casi todo funciona perfectamente...
PERO!!!!

en el modulo principal....
Tengo un problema

como me digiste sispic, puse lo siguiente...

if flag_rf = 1 then
high led_Rf
pause 50
INTCON.INTE=1 ***"permiso para otro impulso rb0 , no lo hagas en la INTCON.INTF=0
while flag_rf = 1
 serout2 portb.7,188,[dec(segundos), " - " , dec(minutos) , " - " ,     dec(flvar1), " - " ,dec(flvar2), " - " , dec(flvar3), 13,10]
 pause 500
 wend
else
 serout2 portb.7,188,[dec(segundos)]
 low led
endif
 
Ok... Casi funciona.... Pero....
Hago el testeo del programa por medio del hyèrterminal....
Y......
En la primera parte del if, cuando el flagrf esta a 1, funciona durante un tiempo.... Pero no se por que causa....
De vez en cuando, el pic, se resetea....

en la segunda parte del if, cuando el flagrf esta a 0
comienza la cuenta de los segundos... y cuando llega al 16....
se resetea...


Alguna idea????

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
RE: Manejo de interrupciones!!!! Help
« Respuesta #44 en: 22 de Diciembre de 2003, 16:02:00 »
Agrega la instruccion CLRWDG en las partes que consumen tempo de tu programa, es posible que resetee por el Watchdog, que varias instrucciones del PBP lo configuran automaticamente.
La otra es que con el DEFINE lo deshabilites...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.