Main Menu
PBP Code Menu
Login
Username:

Password:


Lost Password?

Register now!
Other: STRINGS  
Author: Darrel Taylor
Published: 4/29/2004
Read 4358 times
Size 6.55 KB
Printer Friendly Page Tell a Friend
 
STRINGS

Updated to work with 16-bit devices  June 12, 2005  (See end of article for 16-bit changes)
New and Improved!   Nov 06, 2003
STRINGS  - How to store and retrieve strings in Code Space (for Picbasic Pro) by Darrel Taylor

MPASM has a directive called "DA" that generates a packed 14-bit number representing two 7-bit ASCII characters. This allows you to put large strings in half the code space used by "DB" in PM or 1/8 the code space used when embedding strings in an Hserout statement.  In a large program this can easily save several hundred words of code space.

I won't go into to much detail here because I think the program is pretty Self-Explanatory.  

Using this routine requires MPASM  as the compiler.  It will NOT work with PM.  

There are 2 versions shown here. The first example is for a 14-bit PIC such as a 16F877 or 12F675.  The second example will work on 16-bit devices like the 18Fxxxx.

Many thanks to John Barrat for solving my biggest problem of Forward Declarations in a Macro. With the new GetAddress macro, strings can now be located anywhere in the program.

 

'****************************************************************
'*  Name    : STRINGS.PBP                                       *
'*  Author  : Darrel Taylor / John Barrat                       *
'*  Date    : 5/30/2003                                         *
'*  Note:  Strings must be NULL Terminated                      *
'****************************************************************
DEFINE LOADER_USED 1       ' If using bootloader
DEFINE OSC 4
DEFINE HSER_TXSTA  24h     ' Use this for Higher Baud Rates
DEFINE HSER_SPBRG  25      ' 9600 Baud at 4mhz

Addr        var word
TwoChars    var word
Char        var byte

Clear

goto StartLoop ' Required

String1:
@ da "This is a string",0

AnotherString:
@ da "Here is another string",0

'------------GetAddress Macro - Location insensitive -------------------------
ASM
GetAddress macro Label, Wout       ; Returns the Address of a Label as a Word
    CHK?RP Wout
    movlw low Label
    movwf Wout
    movlw High Label
    movwf Wout + 1
    endm
ENDASM


StartLoop  ' This loop repeats continuously just as a test.
   @ GetAddress _String1, _Addr        ' Get address of String
   gosub StringOut                     ' Send the String
   hserout [13,10]                     ' New Line

   @ GetAddress _AnotherString, _Addr  ' Get address of String
   gosub StringOut                     ' Send the String
   hserout [13,10]                     ' New Line
   pause 500
goto StartLoop                         ' Repeat


StringOut:  ' Send the string out via Hserout
    Readcode Addr, TwoChars       ' Get the 14 bit packed characters
    Char = TwoChars >> 7          ' Separate first char
    if Char  = 0 then StringDone  ' Look for Null char, Stop if found
    hserout [Char]                ' Send first char
    Char = TwoChars & $7F         ' Separate second char
    if Char = 0 then StringDone   ' Look for Null char, Stop if found
    hserout [Char]                ' Send the second char
    Addr = Addr + 1               ' Point to next two characters
    goto StringOut		  ' Continue with rest of the string
  StringDone:
return

end

For use with 16-bit PIC's

The 16-bit PIC's work with things as bytes instead of words, so it actually becomes easier to extract the strings.  Instead of reading 2 characters at a time, you only have to get 1.  Here is a modification to the strings program above for use with PIC18x chips.

The only real difference is in the StringOut routine.

'****************************************************************
'*  Name    : STRINGS-16.PBP                                    *
'*  Author  : Darrel Taylor                                     *
'*  Date    : 6/12/2005                                         *
'*  Note:  Strings must be NULL Terminated                      *
'****************************************************************
DEFINE LOADER_USED 1       ' If using bootloader
DEFINE OSC 4
DEFINE HSER_TXSTA  24h     ' Use this for Higher Baud Rates
DEFINE HSER_SPBRG  25      ' 9600 Baud at 4mhz

Addr        var word
Char        var byte

Clear

goto StartLoop ' Required

String1:
@ da "This is a string",0

AnotherString:
@ da "Here is another string",0

'------------GetAddress Macro - Location insensitive -------------------------
ASM
GetAddress macro Label, Wout       ; Returns the Address of a Label as a Word
    CHK?RP Wout
    movlw low Label
    movwf Wout
    movlw High Label
    movwf Wout + 1
    endm
ENDASM


StartLoop  ' This loop repeats continuously just as a test.
   @ GetAddress _String1, _Addr        ' Get address of String
   gosub StringOut                     ' Send the String
   hserout [13,10]                     ' New Line

   @ GetAddress _AnotherString, _Addr  ' Get address of String
   gosub StringOut                     ' Send the String
   hserout [13,10]                     ' New Line
   pause 500
goto StartLoop                         ' Repeat


StringOut:  ' Send the string out via Hserout
    Readcode Addr, Char           ' Get a character
    if Char  = 0 then StringDone  ' Look for Null char, Stop if found
    hserout [Char]                ' Send char
    Addr = Addr + 1               ' Point to next character
    goto StringOut                ' Continue with rest of the string
  StringDone:
return


end

For more information about strings, and other approaches, see this thread
http://www.picbasic.co.uk/forum/showthread.php?t=1999

 

 
Article Rated: 9.50 (2 votes)
Rate this Article
Return to Category | Return To Main Index
The comments are owned by the poster. We aren't responsible for their content.
Poster Thread