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