TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: Bade12512 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!
-
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
-
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
-
Buena explicación Lager,
Saludos
Ricky
Madrid-España
-
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?
-
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.
-
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
-
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
-
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
-
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
-
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
-
Claro pana RGL !,
, y Gracias por el apoyo.
Un abrazo pana