Diferencia entre revisiones de «Errores en Simulacion - Codewarrior 6.3»
Línea 5: | Línea 5: | ||
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: | 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''' | |
− | + | [[Archivo:Error Fuera de Rango.png|thumb|left|400px|Error Fuera de Rango]] | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
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). | 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). | ||
Línea 21: | Línea 13: | ||
Se pueden establecer tres tipos de soluciones para este caso: | Se pueden establecer tres tipos de soluciones para este caso: | ||
− | A. Si el | + | 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 |
<syntaxhighlight lang="c"> | <syntaxhighlight lang="c"> | ||
Línea 110: | Línea 102: | ||
CLI | CLI | ||
+ | |||
+ | ... | ||
+ | ... | ||
+ | ... | ||
+ | BRA * | ||
;************************************************************** | ;************************************************************** | ||
Línea 134: | Línea 131: | ||
ORG $FFCE | ORG $FFCE | ||
DC.W Interrupcion_RTC | DC.W Interrupcion_RTC | ||
− | </syntaxhighlight> | + | </syntaxhighlight> |
+ | 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 | ||
+ | <syntaxhighlight lang="c"> | ||
+ | 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 * | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | C. En vez de aplicar BRS, se puede manejar el comando JSR (Jump Subrutine)eliminado por completo este error: <syntaxhighlight lang="c"> | ||
+ | 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 | ||
+ | </syntaxhighlight> | ||
==Pantalla en blanco en el True-Time Simulator & Real-Timer Debugger== | ==Pantalla en blanco en el True-Time Simulator & Real-Timer Debugger== | ||
==Modos de direccionamiento== | ==Modos de direccionamiento== |
Revisión del 20:50 24 mar 2013
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 ... Solucion A. *
;***************************************************************************************************
; 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 *
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