Autor Tema: TMR0 + Interrupcion en PBP  (Leído 3611 veces)

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

Desconectado Bade12512

  • PIC10
  • *
  • Mensajes: 2
TMR0 + Interrupcion en PBP
« en: 07 de Octubre de 2004, 15:51:00 »
Hola,

Acabo de empezar a programar en PicBasicPro i para empezar no lo encuentro muy flexible para utilizar las interrupciones, o a lo mejor no se utilizarlo aun que es lo mas probable.

Aver, Querria hacer contar el TMR0 i ir a una rutina de interrupcion  cuande acabe de contar. Pero la instruccion go on interrupt no me vale porque tenge un problema de tiempo. Entonces tengo que programar la IT en asm... Aqui esta el problema :P
El TMR0 me cuenta pero no salto en IT!!!
Alguien tendria este trozo de programa o alguna sugerencia.

He buscado en el foro pero no encontre nada...

Todas la sugerencias son las bienvenidas. Gracias a todos.
I a cuidarse!

Desconectado RGL

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 634
RE: TMR0 + Interrupcion en PBP
« Respuesta #1 en: 08 de Octubre de 2004, 05:57:00 »
Lo mejor que puedes hacer es ir a www.melabs.com y ver los ejemplos que hay usando on interrupt y tambien usando asm.

Saludos
Ricky
Madrid-España

Desconectado lager

  • PIC18
  • ****
  • Mensajes: 258
RE: TMR0 + Interrupcion en PBP
« Respuesta #2 en: 08 de Octubre de 2004, 15:28:00 »
Totalmente de acuerdo con el buen RGL, no hay como empezar con melabs, hay un buen de ejemplos. Aunque en Proton+ hay un poco mas de opiones por ejemplo:hay dos palabras magicas para restaurar los valores en una interrupcion rapida ,tan rapida como en ASM:
CONTEXT SAVE (solo para dispositivos de 16 bits, en los demas no es necesario)
y CONTEXT RESTORE
basicamente es lo siguiente

ON_INTERRUPT goto interrupcion

interrupcion:
context save "salva STATUS, BSR, WREG,,FSR0L y FSR0H"

""""codigo de interrupcion""""
context Return"los restaura"

Ahora si a interrumpir comodamente con proton+
No se olviden de declarar si quieren guardar el fsr:
DECLARE FSR_CONTEXT_SAVE = ON or OFF, or TRUE or FALSE, or 1, 0
Pero como estas ganancias tienen sus pros:Este metodo No es seguro en determinados casos cuales? usando comandos que usen variables del sistema (proton) En que afecta?altera las vaiables  del sistema dentro de la interrupcion. Que variables del sistema? :PP0, PP0H, PP1, PP1H, PP2, PP2H, PP3, PP3H, PP4, PP4H, PP5, PP5H, PP6, PP6H, PP7, PP7H, GEN, GENH, GEN2, GEN2H, GEN3, GEN3H, GEN4, GEN4H, GPR, BPF<--- estas normalmente contenidas en comandos. Como nos podemos dar cuenta de esto y de que fallara nuestra interrupcion? revisando el codigo ensamblado por el compilador,revizando el codigo generado dentro del encabezado de la interrupcion( en el archivo pbp), si hay una varable usada por el sistema como las ya mensionadas seguro la alterara . Como prevenir esto? haciendo la interrupcion en ensamblador"solo lo que hara en caso de interrupcion"O dando de alta las variables del sistema usadas y guardandolas antes de hacer la interrupcion) Como puedes ver es lo mismo que guardar las variables en ensamblador y hasta mas facil en ensamblador ya que si el codigo que se ejecutara en la interrupcion es complejo es mas facil y practico escribirlo en basic que hacer todo el ensamblador.""""" ASI QUE POR ESO APOYO AL 100% hacerlo en Asm, pero es una buena opcion para codigos no tan complejos, y en  MELABS hay muchos ejemplos.Ahora que si no usas comandos que usen estas vairables pues te funcionara de primera este tipo de interrupcion.

Basicamente esta interrupcion fucniona igual que la usada en ensamblador es rapida, pero que requisitos conlleva?:
1:-Usar solamente comandos del compilador que no usen variables del sistema.
2.-No usar comandos  en linea

en caso de que se decida usar el ON_InTERRUPT (hardware)
1.-Revizar el pbp resultante de la compilacion de tu proyecto  para ver las variables del sistema y cualquier variable que este fuera de las definidas con DIM.
2.-Si no sabes que comandos usan estas variables, sencillo, solo pon el comando en un proyecto nuevo y compilalo, en el archivo pbp podras notar si tiene o no estas variables, y sabras que tienes que definirlas.
3.COMO DEFINIRLAS?  COMO "BYTE SYSTEM"

EJEMPLO:
dim PP0 as byte system
dim PP1 as byte system
dim PP0_save as byte system
dim PP1_save as byte system

.....
etc
ON_INTERRUPT goto Interrupcion

Interrupcion:

PP0_save = PP0 """""""guardamos variables""""
PP1_save = PP1""""""""guardamos variables""""


codigo""""""""""""""""""tu CODIGO""""""""""""""""""""
codigo

PP0 = PP0_save """""""restauramos variables""""""
PP1 = PP1_save"""""""restauramos variables´""""""

Context restore <--- restaura STATUS, BSR, WREG,,FSR0L y FSR0H

REPITO REVIZEN EL PBP, para ver que variables hay que guardar y reestablecer, por ejemplo el DELAYUS usa el PP0 y PP0H  si van a usar delayus hagan backup de estos y creen los system bytes. Asi pueden tener sus interrupcions INMEDIATAS, pero pagando ese precio, que a la larga no es tan dificil, solo revizar que variables hay que restaurar y guardar, pueden jugar con interrupciones en servos inmediatas,en timers, las que se les ocurra

Ahora si entendido esto el ejemplo del timer0 con interrupcion
y para no variar un buen reloj

DEVICE 16F628
        CONFIG HS_OSC, PWRTE_ON, CP_OFF, WDT_OFF, LVP_OFF, MCLRE_OFF, BODEN_ON
     ON_INTERRUPT INTERRUMPIR  <--- ubicado lo mas arriba posible
        ALL_DIGITAL ON
        DECLARE XTAL=20
        DECLARE LCD_LINES 2      
        DECLARE LCD_DTPIN PORTA.0
        DECLARE LCD_ENPIN PORTB.3
        DECLARE LCD_RSPIN PORTA.4
        DECLARE SDA_PIN PORTB.5
         DECLARE SCL_PIN PORTB.1
        PORTB_PULLUPS=ON  
      
      
        SYMBOL GIE  = INTCON.7
       
        SYMBOL T0IF   = INTCON.2
        SYMBOL T0IE   = INTCON.5
       
        SYMBOL PS0 = OPTION_REG.0
        SYMBOL PS1 = OPTION_REG.1
        SYMBOL PS2 = OPTION_REG.2
        SYMBOL PSA = OPTION_REG.3
        SYMBOL T0SE= OPTION_REG.4
        SYMBOL T0CS= OPTION_REG.5
       
        Dim CONTEO As WORD          
        Dim LIMITE As WORD  
                                                           
        Dim HORA As Byte
        Dim MINUTO As Byte
        Dim SEGUNDO As Byte
        Dim ERROR_HORA As Byte        
        Dim ERROR_DIA As Byte          

       

        GIE = 0

        GoTo INICIO                      " PARA BRINCAR LA INT * HARDWARE
" -----------------------------------------------------------------------------
" AQUI TU INTERRUPCION,!!!
" -----------------------------------------------------------------------------
INTERRUMPIR: INC CONTEO " INCREMENTAMOS VARIABLE DE INT PARA TIEMPO
             T0IF = 0                " LIMPIAMOS BANDERA DE INT.
             CONTEXT RESTORE <--- LA PALABRA MAGICA


INICIO: T0SE = 0                
        T0CS = 0                
        PSA = 0                
        PS0 = 1                
        PS1 = 1
        PS2 = 1                    
        LIMITE = 76             " INT(5000000/(256*256))
        CONTEO = 0              
        HORA = 0                            
        MINUTO = 0
        SEGUNDO = 0
        ERROR_HORA = 33            
        ERROR_DIA = 2              
        TMR0 = 0      
        T0IE = 1    
        GIE = 1                        
        Cls          
                       
MAIN:
      While 1 = 1                      " INICIO DE BUCLE
      If CONTEO > LIMITE Then                                                                                                              
      CONTEO = 0                                            
      SEGUNDO = SEGUNDO + 1                              
      If SEGUNDO > 59 Then                            
      MINUTO = MINUTO + 1                              
      SEGUNDO = 0                                              
      If MINUTO > 59 Then                  
      HORA = HORA + 1                      
      SEGUNDO = ERROR_HORA        
      MINUTO = 0                                    
      If HORA > 23 Then              
      HORA = 0                            
      SEGUNDO = ERROR_HORA + ERROR_DIA  
      End If
      End If
      End If
      Print AT 1, 1,"  "
      Print AT 1, 1,DEC2 HORA
      Print AT 1, 3,"  "
      Print AT 1, 4, DEC2 MINUTO
      Print AT 1, 7, "  "
      Print AT 1, 7, DEC2 SEGUNDO
      Print AT 1, 3, ":"
      Print AT 1, 6, ":"                    
      End If
      Wend        

End


Salu2 panas

Desconectado RGL

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 634
RE: TMR0 + Interrupcion en PBP
« Respuesta #3 en: 09 de Octubre de 2004, 11:04:00 »
Buena explicación Lager,

Saludos
Ricky
Madrid-España

Desconectado lager

  • PIC18
  • ****
  • Mensajes: 258
RE: TMR0 + Interrupcion en PBP
« Respuesta #4 en: 09 de Octubre de 2004, 12:40:00 »
Gracias pana RGL , pero la veo muy saturada no?, la voy a remover en un solo post o como ves? , por que la idea es que se aprenda pero lo ven tan extenseo que hasta flojera da de leer no?

Desconectado Bade12512

  • PIC10
  • *
  • Mensajes: 2
RE: TMR0 + Interrupcion en PBP
« Respuesta #5 en: 09 de Octubre de 2004, 14:19:00 »
muchas gracias chicos!!!

Es verdad que el link RGL! i gracias por tu respuesta larger!!! es verdad que es larga i que podria dar pereza pero el que realmente tiene ganas de aprender le va de fabula una explicacion tan completa!
La tendre que volver a leer mas tranquilo el lunes i ya te dire si un principiante como yo la puede entender (si quieres claro).

Asi que buen fin de semana, i gracias por vuestra ayuda.
i como siempre digo, a cuidarse!!!!
ciao.

Desconectado lager

  • PIC18
  • ****
  • Mensajes: 258
RE: TMR0 + Interrupcion en PBP
« Respuesta #6 en: 09 de Octubre de 2004, 18:16:00 »
De nada pana, para eso estamos, ademas es poco de lo mucho que tengo que agradecer de muchas personas de este foro que me han enseñado y de las que seguire aprendiendo.
Salu2 pana

Desconectado lager

  • PIC18
  • ****
  • Mensajes: 258
RE: TMR0 + Interrupcion en PBP
« Respuesta #7 en: 09 de Octubre de 2004, 19:51:00 »
Haber parece que no a quedado muy claro como corregir el incoveniente con las interrupciones Rapidas con ON_INTERRUPT

1°Hacer el Codigo completo, si necesitas usar comandos complejos en tu interrupcion usalos, ya terminado el programa, compilarlo como siempre
2°Una ves compilado exitosamente revisar(ya no vean el archivo pbp, por que seguro ven de dos  o mas variables) den F2 en el editor y veran el ensamblador que genero su proyecto.
3°Busquen su encabezado de interrupcion y vean las variables que usan DENTRO de la interrupcion, solo las que estan dentro del proceso de interrupcion.
LISTA DE VARIABLES D SYSTEMA P+:
PP0, PP0H, PP1, PP1H, PP2, PP2H, PP3, PP3H, PP4, PP4H, PP5, PP5H, PP6, PP6H, PP7, PP7H, PP8, PP9H,GEN, GENH, GEN2, GEN2H, GEN3, GEN3H, GEN4, GEN4H, GPR, BPF, BPFH

4° SI HAY, entonces Agregenlas :

aQUI LES DEJO EL ARCHIVO SOLO PARA QUE COPIEN Y PEGUEN LAS QUE APARESCAN EN ASM (SOLO LAS QUE USEN DENTRO DE LA INTERRUPCION)
Ejemplo:

device 16f628
on_interrupt x
goto inicio

x:
delayms 400
context restore

inicio:goto inicio

"""""""""""""""""""revizando el ASM con F2"""""""""""""""""""""""""""""

   NOLIST

   #include "C:DOCUME~1LagerESCRIT~1pruebaprueba.PBP"

   LIST
F1_SOF equ $ ; PRUEBA.BAS
F1_000003 equ $ ; in [prueba.bas] goto inicio
   Goto INICIO
X                              "<----- AQUI ESTA LA INT!!!!!!!!!!!!!!!!!!!!
F1_000006 equ $ ; in [prueba.bas] delayms 400
   Movlw 1
   Movwf PP1H <------ AQUI HAY UNA V. S.
   Movlw 144
   Call dly@w
F1_000007 equ $ ; in [prueba.bas] context restore
   Movfw FSRSAVE
   Movwf FSR
   Movfw SSAVE
   Movwf STATUS
   Swapf WSAVE,F
   Swapf WSAVE,W
   Retfie
INICIO
F1_000009 equ $ ; in [prueba.bas] inicio:goto inicio
   Goto INICIO
   END

"""""""PROGRAMA CORREGIDO"""""""""""""""""""""""""""""""""""""""""""

device 16f628
on_interrupt x
DIM PP1H AS BYTE SYSTEM
DIM PP1H_TEMP AS BYTE SYSTEM
goto inicio

x:
PP1H_TEMP =PP1H
delayms 400
PP1H=PP1H_TEMP
context restore

inicio:goto inicio

""""""""""""""""""""""""""""COMPROBACION(NO NECESARIA)""""""""""""""""

   NOLIST

   #include "C:DOCUME~1LagerESCRIT~1pruebaprueba.PBP"

   LIST
F1_SOF equ $ ; PRUEBA.BAS
F1_000005 equ $ ; in [prueba.bas] goto inicio
   Goto INICIO
X
F1_000008 equ $ ; in [prueba.bas] PP1H_TEMP =PP1H
   Movfw PP1H  <---------------- AHORA SI!!!!!!!!!!!
   Movwf PP1H_TEMP
F1_000009 equ $ ; in [prueba.bas] delayms 400
   Movlw 1
   Movwf PP1H
   Movlw 144
   Call dly@w
F1_000010 equ $ ; in [prueba.bas] PP1H=PP1H_TEMP
   Movfw PP1H_TEMP
   Movwf PP1H
F1_000011 equ $ ; in [prueba.bas] context restore
   Movfw FSRSAVE
   Movwf FSR
   Movfw SSAVE
   Movwf STATUS
   Swapf WSAVE,F
   Swapf WSAVE,W
   Retfie
INICIO
F1_000013 equ $ ; in [prueba.bas] inicio:goto inicio
   Goto INICIO
   END

NO CREO QUE HAYA MAS DUDAS AL RESPECTO

Salu2 panas


PD.- SI ME DAN ESPACIO AQUI LES SUBO EL FICHEROPARA QUE CPIEN Y PEGUEN LAS V.S. POR QUE NO ME DEJA  HACERLO EN ESTE MOMENTO

Desconectado RGL

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 634
RE: TMR0 + Interrupcion en PBP
« Respuesta #8 en: 11 de Octubre de 2004, 02:36:00 »
Hola pana (¿qué quiere decir esa expresión?,

  Te has explicado como un verdadero maestro. Queda claro. Voy a copiar esta explicación para cuando tenga que usar el PLUS recurrir a tu explicación.

Muy bien Lager.

Saludos
Ricky
Madrid-España

Desconectado lager

  • PIC18
  • ****
  • Mensajes: 258
RE: TMR0 + Interrupcion en PBP
« Respuesta #9 en: 11 de Octubre de 2004, 15:09:00 »
Me halaga viniendo de uno de los grandes en Microcontrol, cuando yo todavia jugando con leds, ustedes ya estaban haciendo robots, asi que GRACIAS ,solo trato de aclarar cosas que a veces las dejamos sobre entendidas y nos dan un friega despues!!!...
Muchas Gracias pana, ya saben que si puedo contribuir, en lo que sea, lo hare, por que no cabe duda que como aprendo con ustedes.Pana es hermano,un buen amigo no creas que es algo malo pues!
Un abrazo pana

Desconectado RGL

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 634
RE: TMR0 + Interrupcion en PBP
« Respuesta #10 en: 12 de Octubre de 2004, 10:23:00 »
No, yo no pensaba que era algo malo, pero no sabía el significado exacto. De ahí mi pregunta.

Un abrazo pana.
Ricky
Madrid-España

Desconectado lager

  • PIC18
  • ****
  • Mensajes: 258
RE: TMR0 + Interrupcion en PBP
« Respuesta #11 en: 12 de Octubre de 2004, 11:54:00 »
Claro pana RGL !, , y Gracias por el apoyo.
Un abrazo pana


 

anything