PDA

View Full Version : PIC18F2550 Problem - GoSub or GoTo fails if the jump is too far



milestag
- 15th April 2014, 00:28
I am using PBP3 (3.0.7.4) and Microcode Studio Plus (5.0.0.5). This code runs fine on a PIC18F2525, but on the 18F2550, I cannot get any GOTO or GOSUB instructions to work if the code I am jumping too is too far away. See the code attached which is very simplified but demonstrates the problem. The GOSUB works fine until I insert enough "filler code" to separate the call and the destination. The filler code is never executed, it just pushes the subroutine farther into the code space.

I am using the Trace Systems Bootloader, but the same problem still appears if I burn hex directly to a clean PIC. Interestingly, in the case of the Trace Bootloader, when the GOSUB fails, the PIC falls through to the bootloader (the bootloader is located at 0x6200). I have it down to commenting or uncommenting a single line of code to cause the problem.

To me it seems like the PIC gets lost if I try to jump to an address that is too far from the call. But this should not be the case on a PIC18F. I should be able to jump to any address on the PIC. I commented the code to show where it fails. If I uncomment that one line, it will never execute the subroutine when the "trigger" is pressed.

Has anyone else seen something similar to this? This is KILLING my real program. Thanks for any guidance.

--Jim


'Program Memory Bytes Used: 16372 of 32767
'Revision Date: 14 April 2014
'Written for PICBASIC PRO Compiler version 3.0.7
'Processor=PIC18F2550 20MHz Oscillator


DEFINE LCD_EREG PORTA
DEFINE LCD_EBIT 4
DEFINE LCD_RSREG PORTA
DEFINE LCD_RSBIT 5
DEFINE LCD_DATAUS 100

DEFINE NO_CLRWDT 1

DEFINE OSC 20 '

INCLUDE "con_vars.inc" 'constant and variable definitions

'************************************************* ************
'************************************************* ************
'******************** PIN ASSIGNMENTS ************************
'************************************************* ************
'************************************************* ************
'------------------ PORT B PIN ASSIGNMENTS -------------------
Symbol ir_in = PORTB.0 'IR receiver data input
Symbol sclk = PORTB.1 'isd_spi_clock
Symbol mosi = PORTB.2 'isd_spi_out
Symbol backlight = PORTB.3 'backlight
Symbol modesel = PORTB.4 'mode button
Symbol reload = PORTB.5 'reload button
Symbol hitled = PORTB.6 'sensor LED
Symbol trigger = PORTB.7 'trigger button
'------------------ PORT C PIN ASSIGNMENTS -------------------
Symbol ir_power = PORTC.0 'ir_power
Symbol muzzle2 = PORTC.1 'muzzle 2
Symbol mod_out = PORTC.2 'mod_out
'Symbol not_used = PORTC.3 'USB Vreg Capacitor
'Symbol not_used = PORTC.4 'USB D-
'Symbol not_used = PORTC.5 'USB D+
Symbol muzzle = PORTC.6 'muzzle 1
Symbol ss = PORTC.7 'isd_spi_slave_select
'------------------ PORT E PIN ASSIGNMENTS -------------------
Symbol sw4 = PORTE.3 'Input Only

'************************************************* ************
'************************************************* ************
'******************** INITIALIZATION *************************
'************************************************* ************
'************************************************* ************
initialize:
CLEAR 'initialize RAM

ADCON0 = 1 'AD on, CH0
ADCON1 = 15 'all pins are digital
ADCON2 = %00111111 'left justified result, max times
CMCON = 7 'turn off comparators
Poke $81,$FF 'turn off PORT B weak pull ups
RCSTA = 0 'disable serial port

'------------------------- TIMER 0 --------------------------
'Timer 0 is used for Input Pulse Measurement
TMR0L = 0 'clear Timer 0 low byte

T0CON = %11000101 'prescale = /64
INTCON.5 = 0 'disable TMR0 interrupt

'------------------------- TIMER 1 --------------------------
'Timer 1 is for Elapsed Time
TMR1H = 0 'clear Timer 1 high byte
TMR1L = 0 'clear Timer 1 low byte
T1CON = 49 'turn Timer 1 on ; prescale = 1:8
PIE1.0 = 0 'enable Timer 1 interrupt flag
PIR1.0 = 0 'clear overflow flag

'------------------------- TIMER 2 --------------------------
'Timer 2 is used for PWM module(s)
T2CON = 4 'Timer2 = ON; Prescale = 1:1
CCP1CON = 0 'PWM module off

'------------------------------------------------------------
TRISA = %00000000 'set PortA directions (0=Output, 1=Input)
TRISB = %10110001 'set PortB directions
TRISC = %00000000 'set PortC directions

PORTB = %00000010
PORTC = %10000000


pause 200

'************************************************* ***************
'************************************************* ***************
bootload_access: 'Trace Systems PIC18F Bootloader
IF trigger = 0 then 'bootloader access key, only on power up
LCDOut $FE, 1 'clear LCD
LCDOut $FE,$80," BOOT "
LCDOut $FE,$C0," LOADER "

pause 1000
@ goto 0x6200 'bootloader start address
EndIf

'************************************************* ***************
'************************************************* ***************
startup_screen:
LCDOut $FE, 1 'clear LCD
LCDOut $FE,$80,"JumpFail"
LCDOut $FE,$C0,"TestCode"

PAUSE 1000

'************************************************* ***************
'************************************************* ***************
start:
LCDOut $FE, 1 'clear LCD
LCDOut $FE,$80,"Waiting"
LCDOut $FE,$C0,"Trigger"

test_loop:
pause 100
if trigger = 0 then
gosub test_sub
endif
pause 100
goto test_loop

'************************************************* ***************
'************************************************* ***************
filler_code:
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ" 'works to here
LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ" 'FAILED HERE IF LINE UNCOMMENTED
' LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
' LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
' LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"




'************************************************* ***************
'************************************************* ***************
test_sub:
LCDOut $FE, 1 'clear LCD
LCDOut $FE,$80,"Got Here"
LCDOut $FE,$C0,"Test Sub"
pause 200

high hitled
pause 500
low hitled
return
'************************************************* ***************
'************************************************* ***************
End

milestag
- 15th April 2014, 21:54
I talked to Darrel at ME Labs. Looks like it may be an issue with MPLAB generating bad code (I have an older version). I am going to install the latest version of MPLAB tonight. I'll post the results here.

Acetronics2
- 18th April 2014, 20:42
Hi, Milestag

tried your code in 8.92 MPLAB ( the last release ) ... with MPSIM.

jumps fine to location 6200h ...

BTW you can download MPLAB 8.92 @
http://ww1.microchip.com/downloads/en/DeviceDoc/MPLAB_IDE_8_92.zip

Alain

milestag
- 24th April 2014, 17:36
Thanks Alain. That's what Darrel recommended as well. So I did upgrade to 8.92. And that seems to partly fix the problem. If the firmware is burned DIRECTLY to the PIC it runs okay. But... if the Trace Bootloader is installed it still has problems with GOSUB.

Dr. Bob at Trace has also been looking into this and sent me a new version of the 18F2550 bootloader to test. Hopefully that will correct the problems. I didn't get a chance to test it last night.

milestag
- 25th April 2014, 00:33
SUCCESS!!!! Everything appears to be fixed with the updated version of Trace Systems Bootloader.

So there were 2 problems: Outdated version of MPLAB, and outdated version of the Trace Bootloader. Thanks to Darrel at ME Labs and thanks to Dr. Bob at Trace Systems for getting me back on track!

Jim

ecoli-557
- 22nd May 2014, 22:54
Thanks MilesTag-
I was having a similar problem with an 18F46K80 with it resetting on me - didn't know what to do. Kept cutting subroutines until nothing left but labels and returns.
I just updated my MPLAB and it seems to give me back my program!

This place is Awesome for knowledge.
Regards,
Steve