PIC18F2550 Problem - GoSub or GoTo fails if the jump is too far


Closed Thread
Results 1 to 6 of 6
  1. #1
    Join Date
    Sep 2005
    Location
    Dayton, Ohio
    Posts
    72

    Default PIC18F2550 Problem - GoSub or GoTo fails if the jump is too far

    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

    Code:
    '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
    Jim Robertson
    "MilesTag" DIY Lasertag
    www.lasertagparts.com/mtdesign.htm
    Dayton, Ohio

  2. #2
    Join Date
    Sep 2005
    Location
    Dayton, Ohio
    Posts
    72


    Did you find this post helpful? Yes | No

    Default Re: PIC18F2550 Problem - GoSub or GoTo fails if the jump is too far

    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.
    Jim Robertson
    "MilesTag" DIY Lasertag
    www.lasertagparts.com/mtdesign.htm
    Dayton, Ohio

  3. #3
    Join Date
    May 2004
    Location
    NW France
    Posts
    3,614


    Did you find this post helpful? Yes | No

    Default Re: PIC18F2550 Problem - GoSub or GoTo fails if the jump is too far

    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/e...B_IDE_8_92.zip

    Alain
    ************************************************** ***********************
    Why insist on using 32 Bits when you're not even able to deal with the first 8 ones ??? ehhhhhh ...
    ************************************************** ***********************
    IF there is the word "Problem" in your question ...
    certainly the answer is " RTFM " or " RTFDataSheet " !!!
    *****************************************

  4. #4
    Join Date
    Sep 2005
    Location
    Dayton, Ohio
    Posts
    72


    Did you find this post helpful? Yes | No

    Default Re: PIC18F2550 Problem - GoSub or GoTo fails if the jump is too far

    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.
    Jim Robertson
    "MilesTag" DIY Lasertag
    www.lasertagparts.com/mtdesign.htm
    Dayton, Ohio

  5. #5
    Join Date
    Sep 2005
    Location
    Dayton, Ohio
    Posts
    72


    Did you find this post helpful? Yes | No

    Default Re: PIC18F2550 Problem - GoSub or GoTo fails if the jump is too far

    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
    Jim Robertson
    "MilesTag" DIY Lasertag
    www.lasertagparts.com/mtdesign.htm
    Dayton, Ohio

  6. #6
    Join Date
    Sep 2007
    Location
    Waco, Texas
    Posts
    151


    Did you find this post helpful? Yes | No

    Default Re: PIC18F2550 Problem - GoSub or GoTo fails if the jump is too far

    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
    "If we knew what we were doing, it wouldn't be called research"
    - Albert Einstein

Similar Threads

  1. Is a 'GOTO' Or a 'GoSub'?
    By FromTheCockpit in forum mel PIC BASIC Pro
    Replies: 1
    Last Post: - 1st August 2013, 23:27
  2. Problem with GOSUB/GOTO and Newhaven OLED question
    By Christopher4187 in forum mel PIC BASIC Pro
    Replies: 4
    Last Post: - 12th April 2013, 10:24
  3. Programming style - GOTO or GOSUB ?
    By AndrewC in forum mel PIC BASIC Pro
    Replies: 7
    Last Post: - 8th December 2010, 18:08
  4. timeout of Hserin, goto, gosub or both?
    By flipper_md in forum mel PIC BASIC Pro
    Replies: 6
    Last Post: - 28th October 2009, 18:43
  5. If ... Then Gosub <> If ... Then Goto?
    By oldtoddler in forum General
    Replies: 6
    Last Post: - 27th February 2006, 11:52

Members who have read this thread : 1

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts