Ensamblador, PIC 18F2550 y goto+1

Buenos días a todos,

Hace unos días me puse a programar un PIC 18F2550 en ensamblador. Hice un programa que encendiera y apagara un LED conectado a cualquier pin del puerto A.

Para el retardo use una rutina generada mediante esta página: http://www.golovchenko.org/cgi-bin/delay

Supongo que la han usado o han usado alguna similar y como sabrán para ese tipo de rutinas es muy frecuente utilizar instrucciones goto $+1. Pues bien al momento de compilar el código en MPLAB el linker (mplink) daba un error y no compilaba. El error era algo relacionado con el goto pero no era nada claro.

Empezé a hacer pruebas y cambié cada goto para que apuntara hacia una etiqueta en lugar de $+1 y así si funcionó.

Lo que me queda de esta experiencia es que los PIC 18F no permiten el uso del operador $+x. Ustedes qué creen? Les ha pasado esto que expongo aqui con anterioridad?
 
Lo que me queda de esta experiencia es que los PIC 18F no permiten el uso del operador $+x. Ustedes qué creen? Les ha pasado esto que expongo aqui con anterioridad?

a mi tambien me paso lo mismo con un 18F2550. lo unico que hice para corregirlo fue poner etiquetas.
 
Lo que sucede es que la arquitectura PIC18X utiliza dos bytes para cada instrucción (por ello la necesidad de que el contador de programa siempre finalice en 0). En vez de poner "goto $+.1" pongan "goto $+.2" y verán que funciona. Saludos
 
También usen [ BRA ] para eso.
BRA $ + 2
BRA $ - 2

Ojo que son de a 2 por cada instrucción ya que las instruciones son de 16bits en un PIC de 8 bits.
 
Gracias Daniel Meza y ByAxel por la aclaración. Probé el programa usando goto $+2 y funcionó correctamente.

Después de leer sus explicaciones revisé la hoja de datos del PIC y en la sección 5.2.3 claramente dice que el contador de programa siempre avanza de 2 en 2. Al final mi problema era falta de documentación :D

Aunque ahora que se como funciona casi prefiero seguir usando etiquetas porque si no terminan siendo más confusos los programas.
 
Última edición:
Atrás
Arriba