me olvidaba de tí amigo MGLSOFT :
Con respecto a tu primera pregunta te diré que no se espera a que termine ni Pause o Serin , cuando se produce..... a correr todos , a diferencia del metodo On Interrupt.
Normalmente las rutinas de interrupción son para realizar tareas muy escuetas aunque de gran importancia cuando el hardware lo solicita , ejemplo incrementar algún contador , guardar el valor del teclado etc. y no hay que abusar del código . Imagina que estas guardando los impulsos que entran por rb0 y tu rutina de interrupción tarda más tiempo en ejecutarse que en recibir el siguiente impulso. En este caso habría que inhibir las interrupciones para que la rutina no se llame a sí misma al producirse , pero el contage no seria correcto .
Lo ideal seria diseñar el código puramente en ensamblador ya que tienes todo el control , pero si nos empeñamos en usar comandos pbp dentro de ella pues a currarlo y a conocer pbp a fondo.
Ejemplo:
Codigo:
Define INTHAND _Interrupcion
wsave var byte bank0 system
ssave var byte bank0 system
psave var byte bank0 system
Main:
Pause 1000
Goto Main
Interrupcion: ‘código de interrupción , pbp salva PCLATH,STATUS y W
INTCON=0 ‘ inhibir interrupcion
PAUSE 10
INTCON = $90 ‘restaurar interrupcion
asm
movf psave ; restauramos los registros guardados
movwf PCLATH
swapf ssave,w
movwf STATUS
swapf wsave,f
swapf wsave,w
retfie
endasm
Esto no funcionaria correctamente ya que PAUSE utiliza 3 variables temporales del tipo word R0,R1,R2 y como también utilizamos PAUSE en la interrupción el código al entrar en ella tiene que guardar estos 6 registros byte R0,R0+1,R1,R1+1,R2,R2+1 y restaurarlos a la salida ya que al salir y continuar con la PAUSE de Main contendrían los valores usados en pause de la interrupción y fallaría .
También si usamos otro comando pbp distinto en el código de interrupción que utilice estas 3 variables para que al regresar , pause del Main continue funcionando correctamente .
Espero que esto no te desanime a usar el método , pero en mi opinión es la mejor manera para que nuestro programa se ejecute con soltura y este a la altura de cualquier asm . El basic es para que nos ayude con el código, pero lo mejor es no casarse del todo con él e intentar conocerlo internamente un poco .
Para cualquier programador creo que es imprescindible que se tengan unas mínimas nociones de asm antes de usar los lenguajes de alto nivel .
Échale un vistazo a los .LST que genera si compilas con el parámetro –l
En el proyecto que puse del control de un Nokia con pic esta escrito en un 90% en pbp y se comunica con el celular a 115.200 bps sin problemas .
Sin este 10% de asm el proyecto integramente con pbp seria mision imposible .
y cambiando de tema.
Abago no entiendo por que pides disculpas , entiendo mejor a los bytes que a las personas , pero no creo que nadie se haya ofendido por lo menos no veo el motivo por ninguna parte .
retfie
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 .
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
no puedo provarlo pero yo estoy en que no tienes que salvar ningun registro al entrar en la interrupcion.
PBP ya lo hace y al hacerlo otra vez vete a saver lo que pasa.
Codigo:
si tu codigo es mayor de 2k que seguramente lo es , declara estas variables como estan
wsave var BYTE $020 SYSTEM
wsave1 var BYTE $0a0 SYSTEM
wsave2 var BYTE $120 SYSTEM
wsave3 var BYTE $1a0 SYSTEM
ssave var BYTE BANK0 SYSTEM
psave var BYTE BANK0 SYSTEM
y restaura de esta manera al salir
movf psave,w
movwf PCLATH
swapf ssave,w
movwf STATUS
swapf wsave,f
swapf wsave,w
retfie
asegurate que el codigo de la interrupción se encuentre en pagina 0 y todas las variables que uses en ella esten en el banco 0 , o de lo contrario tendras que saver en que banco se encuentran , cambiarlo para trabajar con ellos y seleccionar el 0 antes de restaurar y salir .
Haver si lo consigues .
un saludo
sisco.
Fijate lo que hace al producirse una interrupcion.
Este codigo se genera solo .
Codigo:
* 1141 0004- 00A0 movwf wsave ; Save the W register
* 1142 0005- 0E03 swapf STATUS, W
* 1143 0006- 0183 clrf STATUS ; Point to bank 0
* 1144 0007- 00C1 movwf ssave ; Save the STATUS register
* 1145 0008- 080A movf PCLATH, W ; Save PCLATH
* 1146 0009- 00BB movwf psave
* 1147 000A- 3004 movlw ((INTHAND) >> 8) ; Set PCLATH for jump
* 1148 000B- 008A movwf PCLATH
* 1149 000C- 2CAE goto INTHAND ; Goto user interrupt handler
Si usamos otros registros no se que puede pasar .