Errores en Simulacion - Codewarrior 6.3

De Wikitronica
Revisión del 22:12 24 mar 2013 de Nsroger (Discusión | contribuciones) (Solución)

Saltar a: navegación, buscar

En el desarrollo de un programa, al momento de una depuración de un proyecto nos puede salir los siguientes mensajes de error:

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 [[Vectores de Interrupción para el [MC9S08QE128]]].), ya que los mismo permiten al momento de realizar el Debugger establecer todos los parametros del micro se posicionen en la memoria.

Cabe destacar que si complilamos 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 Boton reset.png en el True-Time Simulator & Real-Timer Debugger el programa no va entrar a dicha a rutina. Ahora si realizamos la depuracion en la opción P&E Multilink/ Cyclone Pro aparecera en la siguiente pantalla en blanco:


Solución

Para eliminar la pantalla en blanco solo hace falta difinir correctamente los vectores de interrupción adecuado. Entre los vectores de interrumpcion 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

Contributors

CeMoron, Nsroger, Racuna