Errores en Simulacion - Codewarrior 6.3
En el desarrollo de un programa, al momento de una depuración de un proyecto nos puede salir los siguientes mensajes de error:
Contenido
Error Fuera de Rango
Si el Programa Principal es muy largo y se emplea el manejo de subrutinas a través del comando BRS (Branch Subrutine) y las mismas son colocadas al final del código del programa principal, se puede presentar el siguiente mensaje de error:
Error: Axxx: Value out of range -128...127
Esto es debido a que el comando BSR maneja un relativo, el cual permite realizar los saltos a una rutina deseada con un desplazamiento ubicado en el rango de 80 - 7F (-128 … 127), ya que el mismo puede realizar el Branch para arriba o abajo (Dependiendo el caso).
Soluciones
Se pueden establecer tres tipos de soluciones para este caso:
A. Si el código principal es muy largo, se debe definir las subrutinas justo después de las llamadas con BSR, una vez realizada cada una de estas realizamos un BRA al código principal
;***************************************************************************************************
; Codigo de Ejemplo *
;***************************************************************************************************
; Include derivative-specific definitions
INCLUDE 'derivative.inc'
;
; export symbols
ABSENTRY Configurar_SP_COP
;
; definicion de variables
ORG Z_RAMStart
Contador: DS.B 1
Num1: DS.B 1
Num2: DS.B 1
; code section
ORG ROMStart
Configurar_SP_COP:
LDHX #RAMEnd+1
TXS ; SP / $17FF
LDA #$42
STA SOPT1 ; Se guarda en SOPT1
; COPE = 0, COPT = 1, STOPE= 0
; 0, 0, RSTOPE= 0
; BKGDPE= 1 --- Habilita el backroung debug mode
; RSTPE = 0 --- Deshabilita el RESET
Configuracion_Previa:
BSR Configurar_GPIO
BSR Configurar_RTC
BRA main
; -------------------------------------------------------------------
Configurar_GPIO:
;Se configura los 6 bits inferiores de PTC y los 2 bits superiores de PTE como salida
;Corresponden a los leds de la tarjeta
LDA #$3F
STA PTCDD
LDA #$C0
STA PTEDD
LDA #$3F
STA PTCD
LDA #$C0
STA PTED
RTS
; ---------------------------------------------------------------------------
Configurar_RTC:
LDA #$04
STA SCGC2 ; Habilitamos el Clock Gate para el RTC
LDA #00
STA RTCMOD ; Definimos el valor del registro modulo del RTC
LDA #%00011000 ; Configuramos el RTCSC / Reloj configurado a 1ms. Fuente reloj interna 1khz.
; Interrupciones habilitadas (bit 4)
; RTIF=0, RTCLKS6=0 RTCLKS5=0
; RTIE=1, RTCPS3=1, RTCPS2=0
; RTCPS1=0, RTCPS0=0
STA RTCSC
RTS
main:
MOV #10, Contador
MOV #1, Num1
MOV #2, Num2
...
...
...
CLI
...
...
...
BRA *
;**************************************************************
;* RUTINAS DE INTERRUPCION *
;**************************************************************
;Limpiamos las banderas de interrupcion. Se escribe un 1 en la bandera RTIF
LDA RTCSC
ORA #%10000000
STA RTCSC
...
...
...
RTI
;**************************************************************
;* INTERRUPT VECTORS *
;**************************************************************
ORG $FFFE
DC.W Configurar_SP_COP ; Reset
ORG $FFCE
DC.W Interrupcion_RTC
B. Por cuestiones de estética del código muchos programadores no podrían elegir la primera solución, como alternativa de ello se puede establecer la siguiente configuración, el cual consiste en sustituir los BSR por etiquetas
Configurar_SP_COP:
LDHX #RAMEnd+1
TXS ; SP / $17FF
LDA #$42
STA SOPT1 ; Se guarda en SOPT1
; COPE = 0, COPT = 1, STOPE= 0
; 0, 0, RSTOPE= 0
; BKGDPE= 1 --- Habilita el backroung debug mode
; RSTPE = 0 --- Deshabilita el RESET
; -------------------------------------------------------------------
Configurar_GPIO:
;Se configura los 6 bits inferiores de PTC y los 2 bits superiores de PTE como salida
;Corresponden a los leds de la tarjeta
LDA #$3F
STA PTCDD
LDA #$C0
STA PTEDD
LDA #$3F
STA PTCD
LDA #$C0
STA PTED
; ---------------------------------------------------------------------------
Configurar_RTC:
LDA #$04
STA SCGC2 ; Habilitamos el Clock Gate para el RTC
LDA #00
STA RTCMOD ; Definimos el valor del registro modulo del RTC
LDA #%00011000 ; Configuramos el RTCSC / Reloj configurado a 1ms. Fuente reloj interna 1khz.
; Interrupciones habilitadas (bit 4)
; RTIF=0, RTCLKS6=0 RTCLKS5=0
; RTIE=1, RTCPS3=1, RTCPS2=0
; RTCPS1=0, RTCPS0=0
STA RTCSC
main:
MOV #10, Contador
MOV #1, Num1
MOV #2, Num2
...
...
...
CLI
...
...
...
BRA *
C. En vez de aplicar BRS, se puede manejar el comando JSR (Jump Subrutine)eliminado por completo este error:
Configurar_SP_COP:
LDHX #RAMEnd+1
TXS ; SP / $17FF
LDA #$42
STA SOPT1 ; Se guarda en SOPT1
; COPE = 0, COPT = 1, STOPE= 0
; 0, 0, RSTOPE= 0
; BKGDPE= 1 --- Habilita el backroung debug mode
; RSTPE = 0 --- Deshabilita el RESET
Configuracion_Previa:
JSR Configurar_GPIO
JSR Configurar_RTC
main:
MOV #10, Contador
MOV #1, Num1
MOV #2, Num2
...
...
...
CLI
...
...
...
BRA *
; -------------------------------------------------------------------
Configurar_GPIO:
;Se configura los 6 bits inferiores de PTC y los 2 bits superiores de PTE como salida
;Corresponden a los leds de la tarjeta
LDA #$3F
STA PTCDD
LDA #$C0
STA PTEDD
LDA #$3F
STA PTCD
LDA #$C0
STA PTED
RTS
; ---------------------------------------------------------------------------
Configurar_RTC:
LDA #$04
STA SCGC2 ; Habilitamos el Clock Gate para el RTC
LDA #00
STA RTCMOD ; Definimos el valor del registro modulo del RTC
LDA #%00011000 ; Configuramos el RTCSC / Reloj configurado a 1ms. Fuente reloj interna 1khz.
; Interrupciones habilitadas (bit 4)
; RTIF=0, RTCLKS6=0 RTCLKS5=0
; RTIE=1, RTCPS3=1, RTCPS2=0
; RTCPS1=0, RTCPS0=0
STA RTCSC
RTS
Pantalla en blanco en el True-Time Simulator & Real-Timer Debugger
AL momento de realizar cualquier programa debemos tomar en cuenta el manejo de los vectores de interrupción (Ver Interrupciones.), ya que los mismo permiten al momento de realizar el Debugger establecer todos los parámetros del micro se posicionen en la memoria.
Cabe destacar que si compilamos el programa en la opción Full Chip Simulation el mismo realizará la compilación, pero si por ejemplo no se ha definido el vector de interrupción para el reset (Vrest), al momento de realizar un Reset Target en el True-Time Simulator & Real-Timer Debugger el programa no va entrar a dicha a rutina. Ahora si realizamos la depuración en la opción P&E Multilink/ Cyclone Pro aparecerá la siguiente pantalla en blanco:
Solución
Para eliminar la pantalla en blanco solo hace falta definir correctamente los vectores de interrupción adecuado. Entre los vectores de interrupción mas usados tenemos
;**************************************************************
;* Interrupt Vectors *
;**************************************************************
ORG $FFCE
DC.W Vrtc ; Interrupcion del RTC
ORG $FFFA
DC.W Virq ; Interrupcion del IRQ
ORG $FFCE
DC.W Vreset ; Reset del programa