Autor Tema: Error con codigo PIC18f2550  (Leído 3001 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Error con codigo PIC18f2550
« en: 24 de Septiembre de 2015, 17:02:58 »
Hola, alguien podria decirme el porque de este error, entiendo que es algo referente a los goto pero no se el que.
Código: ASM
  1. Start:
  2. ; *** Configuracion de perifericos ***
  3.                 CLRF    PORTB   ; Initialize PORTB by clearing output data latches
  4.                 MOVLW   0x00    ; Set PORTB as output
  5.                 MOVWF   TRISB   ; Value used to initialize data direction      
  6.                
  7. Main:           BSF     PORTB,2
  8.                 RCALL   DelayHigh
  9.                 BCF     PORTB,2
  10.                 RCALL   DelayLow
  11.                 BRA     Main
  12.  
  13. DelayHigh:
  14.                 MOVLW   0xB2
  15.                 MOVWF   d1
  16.                 MOVLW   0x01
  17.                 MOVWF   d2
  18. Delay_0         DECFSZ  d1, f
  19.                 GOTO    $+2
  20.                 DECFSZ  d2, f
  21.                 GOTO    Delay_0
  22.                 GOTO    $+1
  23.                 NOP
  24.                 RETURN
  25.                
  26. DelayLow:
  27.                 MOVLW   0xEA
  28.                 MOVWF   d3
  29.                 MOVLW   0x0F
  30.                 MOVWF   d4
  31. Delay_1
  32.                 DECFSZ  d3, f
  33.                 GOTO    $+2
  34.                 DECFSZ  d4, f
  35.                 GOTO    Delay_1
  36.                 GOTO    $+1
  37.                 NOP
  38.                 RETURN
  39.                
  40.                 END                 ; Fin de programa
Este es el error:

CLEAN SUCCESSFUL (total time: 55ms)
make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory '/home/miquel/MPLABXProjects/Robot Apodo/TestServo.X'
make  -f nbproject/Makefile-default.mk dist/default/production/TestServo.X.production.hex
make[2]: Entering directory '/home/miquel/MPLABXProjects/Robot Apodo/TestServo.X'
"/opt/microchip/mplabx/v3.10/mpasmx/mpasmx" -q -p18f2550 -u -l\"build/default/production/Test.lst\" -e\"build/default/production/Test.err\" -o\"build/default/production/Test.o\" \"Test.asm\"
"/opt/microchip/mplabx/v3.10/mpasmx/mplink"    -p18f2550  -w  -m"dist/default/production/TestServo.X.production.map"   -z__MPLAB_BUILD=1  -odist/default/production/TestServo.X.production.cof  build/default/production/Test.o     
make[2]: *** [dist/default/production/TestServo.X.production.hex] Error 1
MPLINK 5.08, LINKER
make[1]: *** [.build-conf] Error 2
Device Database Version 1.26
make: *** [.build-impl] Error 2
Copyright (c) 1998-2011 Microchip Technology Inc.
Error - file 'build/default/production/Test.o', section '.org_2', Symbol '_.org_2_0058' is not word-aligned.
It can not be used as the target of a call or goto instruction.
Errors    : 1

nbproject/Makefile-default.mk:112: recipe for target 'dist/default/production/TestServo.X.production.hex' failed
make[2]: Leaving directory '/home/miquel/MPLABXProjects/Robot Apodo/TestServo.X'
nbproject/Makefile-default.mk:78: recipe for target '.build-conf' failed
make[1]: Leaving directory '/home/miquel/MPLABXProjects/Robot Apodo/TestServo.X'
nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed

BUILD FAILED (exit value 2, total time: 214ms)
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Error con codigo PIC18f2550
« Respuesta #1 en: 24 de Septiembre de 2015, 17:31:08 »
Citar
Error - file 'build/default/production/Test.o', section '.org_2', Symbol '_.org_2_0058' is not word-aligned.

El PIC18F tiene instrucciones de 16bits, y el contador de programa se encuentra limitado a que el ultimo bit, el bit 0 deba ser 0 para mantener la alineacion.

0x00.FFF0
0x00.FFF2
0x00.FFF4

Los GOTO/CALL ademas ocupan 2 posiciones de memoria, es decir 32bits, ejemplo un GOTO a 0x0FF00, ubicado en la posicion de memoria 0x10.0000 (24 bits PC) y little-endian.

El GOTO 0x0FF00 tiene por opcode 0xEF00 0xF0FF, solo para ejemplo xD

0x10.0000 = 0x00
0x10.0001 = 0xEF
0x10.0002 = 0xFF
0x10.0003 = 0xF0

Asi que debo suponer que los errores que estas teniendo son:

Código: [Seleccionar]
GOTO $+2
GOTO $+1

El primer GOTO en realidad lo unico que estarias haciendo es apuntar a la 2da palabra del GOTO (2do byte del opcode) que es basicamente un NOP (Fijate los OP-CODE en el set de instrucciones), y que el equivalente para el PIC18 de los PIC16 debido a esto es:

Supongamos que esto esta en 0x00.1000

0x00.1000 = GOTO $+4       ; 4 bytes = 32 bits
0x00.1004 = ADDLW 0x10    ; 2 bytes = 16 bits
0x00.1006 = ANDLW 0x11

0x00.1000 = $ = Posicion de memoria de la primer palabra de  GOTO
0x00.1002 = +2 posicion de memoria de la 2da palabra de GOTO (funciona como un NOP, por el opcode) ,
0x00.1004 = +4 posicion de memoria de la proxima instruccion (ADDLW)
0x00.1006 = +6 posicion de memoria de la siguiente instruccion (ANDLW)

Es el mismo caso que el
Código: [Seleccionar]
GOTO $+1
Eso seria imposible de realizar

Si suponemos el mismo comienzo, y que GOTO este en 0x00.1000 entonces

+1 = 0x00.1001

Seria una violacion al alineamiento del PC.

Todo esto para decirte que reemplazes los:

Código: [Seleccionar]
GOTO  $+2
GOTO  $+1

por

Código: [Seleccionar]
GOTO  $+6    ; 4 del GOTO + 2 de la proxima instruccion, es decir salta 1 instruccion
GOTO  $+4    ; 4 del GOTO, no salta ninguna instruccion

La alineacion en los micros de mas alta gama es todo un tema, alineacion tanto en memoria de datos como de instrucciones.
« Última modificación: 24 de Septiembre de 2015, 18:23:02 por KILLERJC »

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Error con codigo PIC18f2550
« Respuesta #2 en: 25 de Septiembre de 2015, 02:47:40 »
Gracias KILLERJC por la explicacion, una cosa mas ¿Todo esto que explicas esta en el datasheet?
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Error con codigo PIC18f2550
« Respuesta #3 en: 25 de Septiembre de 2015, 12:00:19 »
Exactamente. Aunque todo lo dije de memoria y por ejemplo me equivoque en algunas cosas xD

Del datasheet del PIC18F:

Citar
PIC18 microcontrollers implement a 21-bit program counter
Y dije que era de 24

Citar
To prevent the PC from becoming misaligned with word instructions, the Least Significant bit of PCL is fixed to a value of ‘0’. The PC increments by 2 to address sequential instructions in the program memory.
Lo que dije de la alineacion

Lo que ocupa en memoria las instrucciones lo ves en los opcode en el set de instrucciones

Del PDF de MPASM:

Citar
$  = Current/Return program counter


Ademas de eso para no dar informacion erronea, ya que estaba seguro que era eso, pero por las dudas hice un programita para probarlo:

Citar
ORIGEN
    NOP
    GOTO $+2
    NOP
    NOP
    GOTO $+4
    NOP
    NOP
    NOP
    GOTO $+6
    NOP
    NOP
    NOP
    NOP
    NOP
   GOTO ORIGEN

Lo cual uno a pesar de tenerlo en la teoria puede ver que se aplica. Como te decia si vos tenias un GOTO $+2 ibas a saltar al NOP del GOTO. Lo cual:

GOTO $+4 - Tarda 2 ciclos de reloj , y sigue su curso secuencial
GOTO $+2 - Tarda 3 ciclos de reloj, GOTO (2) + NOP del GOTO(1)


Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Error con codigo PIC18f2550
« Respuesta #4 en: 25 de Septiembre de 2015, 18:05:34 »
Hola KILLERJC, si te tengo que ser sincero después de tus explicaciones no sabia si seguir o abandonar,  estas a otro nivel muy por encima de mi pero muy encima, y francamente no entendía nada de lo explicado, pero como lo mas fácil hubiera sido abandonar he pensado que si otros pueden yo también, y después de leer no se la cantidad de veces y hacer un pequeño programa para ver como se comportaba el goto al final entendí tu explicación.

GRACIAS KILLERJC.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Error con codigo PIC18f2550
« Respuesta #5 en: 25 de Septiembre de 2015, 18:58:03 »
No Miguel, que eso no te haga dejar, en mi caso solo me interese mas en la parte de ASM que muchos, tenia compañeros que habian salido a C y yo no sabia ni como encender un led en C. Y me dedique todo a ASM, lo cual te exige conocer la arquitectura, luego van ocurriendo ciertas dudas, el cual buscas el por que. Son cosas que uno no le presta atencion hasta que se necesita o ocurren problemas.  o por ahi te encontras con un PDF y te abre un poco la cabeza.

El caso que mejor recuerdo es el de cuando me puse con ASM del dsPIC. Ahi las cosas cambiaron y son mas como el GNU (.text .data. bss ? que es eso? .align?), alineaciones de memoria, etc. Sinceramente busque por todos lados una explicacion sobre la directiva .align, NUNCA encontre nada, hace poco lo hice en un PDF de TI con la explicacion sobre su compilador C. Creo que era ahi.

Otra que me paso hace poco, uno cuando estudia programacion le enseñan que esta el compilador, luego el linker, que estan los archivos objeto, el archivo del linker, pero en ese momento no agarras NI UNA. Encima con la filosofia de Microchip de "esconder" eso para que las cosas sean mas faciles para el usuario fue peor para mi. Cuando compre la placa ed TI con un ARM no entendia nada. ahi aparecio un archivo del linker!, linea de comandos ? nooo eso es muy extremo. Pero si compilas un ejemplo de Microchip en MPLAB en ASM, vas a notar que llama al compilador mpams y luego al linker que no recuerdo el nombre. TODO eso recien me quedo claro cuando lei un PDF de TI ( www.ti.com/lit/pdf/spnu118 es para ARM y de TI) pero me aclaro bastante algunas cosas.

Y luego de leer mi explicacion veo por que tuviste que releerla muchas veces, paso que por agregar informacion y hacerlo mas claro con ejemplos a lo que ya tenia escrito termine oscureciendolo mas  :D. Asi que te pido perdon  :oops:

PD: Quien en su sano juicio se pone a ver los OP-Code de las instrucciones ?   ;-)
PD: Mi primer Post en el foro (2011) preguntando y respondiendome solo con respecto al dsPIC  :? :
http://www.todopic.com.ar/foros/index.php?topic=35392.msg294820#msg294820
« Última modificación: 25 de Septiembre de 2015, 19:36:48 por KILLERJC »


 

anything