Jump to content
Sign in to follow this  
Flanneltron

Pic18458 Configuration Bits

Recommended Posts

My target is a PIC18F458, and I noticed that the p18f458.h which is generated from P18F458.INC with inc2h seems to have the incorrect addresses for the configuration bits. They are supposed to be mapped to 0x300001 and so on.

 

The fix is to change this section in \SourceBoost\include\p18f458.h:

 

//=============================================
// Configuration Bits

#define         _CONFIG1H       0x3000                                                                                         
#define         _CONFIG2L       0x3000                                                                                         
#define         _CONFIG2H       0x3000                                                                                         
#define         _CONFIG4L       0x3000                                                                                         
#define         _CONFIG5L       0x3000                                                                                         
#define         _CONFIG5H       0x3000                                                                                         
#define         _CONFIG6L       0x3000                                                                                         
#define         _CONFIG6H       0x3000                                                                                         
#define         _CONFIG7L       0x3000                                                                                         
#define         _CONFIG7H       0x3000                                                                                         
#define         _DEVID1         0x3FFF                                                                                         
#define         _DEVID2         0x3FFF                                                                                         
#define         _IDLOC0         0x2000                                                                                         
#define         _IDLOC1         0x2000                                                                                         
#define         _IDLOC2         0x2000                                                                                         
#define         _IDLOC3         0x2000                                                                                         
#define         _IDLOC4         0x2000                                                                                         
#define         _IDLOC5         0x2000                                                                                         
#define         _IDLOC6         0x2000                                                                                         
#define         _IDLOC7         0x2000    

 

to this:

 

//=============================================
// Configuration Bits

#define         _CONFIG1H       0x300001                                                                                         
#define         _CONFIG2L       0x300002                                                                                         
#define         _CONFIG2H       0x300003                                                                                         
#define         _CONFIG4L       0x300006                                                                                         
#define         _CONFIG5L       0x300008                                                                                         
#define         _CONFIG5H       0x300009                                                                                         
#define         _CONFIG6L       0x30000A                                                                                         
#define         _CONFIG6H       0x30000B                                                                                         
#define         _CONFIG7L       0x30000C                                                                                         
#define         _CONFIG7H       0x30000D                                                                                         
#define         _DEVID1         0x3FFFFE                                                                                        
#define         _DEVID2         0x3FFFFF                                                                                         
#define         _IDLOC0         0x200000                                                                                        
#define         _IDLOC1         0x200001                                                                                         
#define         _IDLOC2         0x200002                                                                                         
#define         _IDLOC3         0x200003                                                                                         
#define         _IDLOC4         0x200004                                                                                       
#define         _IDLOC5         0x200005                                                                                       
#define         _IDLOC6         0x200006                                                                                       
#define         _IDLOC7         0x200007  

 

And then BoostC will produce a hex file with correct configuration, in this case for the 18F458.

Share this post


Link to post
Share on other sites

I've written another perl script.. this time it will take the .inc files and convert them to header files, much like the inc2h app. I've made two additional changes, one is that for every register, I've also put in a define, and the other is that I comment out everything else that isn't relavant to the header files instead of just omitting them.

 

Here's the code. If anyone finds any bugs, please tell me and I'll submit a fix. Also, Pavel, if you think this is useful, perhaps create a link for it on your site somewhere?

 

File: inc2boosth.pl

#!/usr/bin/perl -w
# Project : inc2boosth v1.0

use strict;
sub ProcessINC($);
    
my $directoryOfINCs="C:\\progra~1\\MPLAB IDE\\MCHIP_Tools\\";
my $outputDir="c:\\progra~1\\sourceboost\\include\\";

opendir(INCDIR, $directoryOfINCs);

while (defined(my $fileName = readdir(INCDIR)))
{
if ( ($fileName ne ".") && ($fileName ne "..") )
{
 # only process p12*.inc p16*.inc and p18*.inc files
 if ($fileName =~ m/^p(12|16|18).+[.]inc$/i)
 {
	 ProcessINC($directoryOfINCs . $fileName);
 }
}
}
closedir(INCDIR);

sub ProcessINC($)
{
my $thisFile = shift;
open (INCFILE, "<" . $thisFile) or die "Couldn't open $thisFile\n";
$thisFile =~ m/([^\\]+)[.][^.]+$/;
open (HFILE, ">" . $outputDir . $1 . ".h") or die "Couldn't create $1\n";

my $indentCount = 0;
my $isRegisterBlock = 0;

while (<INCFILE>)
{
 my $currentLine = $_;
 chomp $currentLine;
 # wipe out any trailing whitespace
 $currentLine =~ s/[\s\t]+$//g;
 # if comments exist anywhere in the line, convert to C-Style comment type
 if ($currentLine =~ m/\;/)
 {
	 # replace the first semicolon with /*
	 $currentLine =~ s/\;/\/\*/;
	 # append a */ to the end of the line
	 $currentLine .= " */";
 }
 # if entire line is a comment pass it through
 if ($currentLine =~ m/^[\s\t]*\/\*.*\*\/$/)
 {
	 #Check to see if we're in the register
	 #block and set the flag appropriately
	 if ($currentLine =~ m/Register/i)
	 {
   $isRegisterBlock=1;
	 }
	 else
	 {
   $isRegisterBlock=0;
	 }
	 print (HFILE $currentLine . "\n");
 }
 # if line is blank, pass it through
 elsif ($currentLine =~ m/^$/)
 {
	 print (HFILE "\n");
	 next;
 }
 # if line contains a IFDEF/IFNDEF statement, convert to c-style
 elsif ($currentLine =~ m/(IFDEF|IFNDEF)[\s\t]+([^\s\t]+)(\/?.*)$/)
 {
	 print (HFILE "\t" x $indentCount . "#" . $1 . "\t" . $2);
	 if ($3 ne "")
	 {
   print (HFILE "\t" . $3);
	 }
	 print (HFILE "\n");
	 $indentCount++;
 }
 # if line contains a ENDIF statement, convert to c-style
 elsif ($currentLine =~ m/ENDIF[\s\t]*(\/?.*)$/)
 {
	 $indentCount--;
	 print (HFILE "\t" x $indentCount . "#ENDIF");
	 if ($1 ne "")
	 {
   print (HFILE "\t" . $1);
	 }
	 print (HFILE "\n");
 }
 # if line contains a DEFINE/UNDEFINE statement without a value, pass it through
 elsif ($currentLine =~ m/#(DEFINE|UNDEFINE)[\s\t]+([^\s\t\/]+)(\/?.*)$/i)
 {
	 my $temp = $1;
	 $temp =~ tr/[a-z]/[A-Z/;
	 print (HFILE "\t" x $indentCount . "#" . $temp . "\t" . $2);
	 if ("" ne $3)
	 {
   print (HFILE "\t" . $3);
	 }
	 print (HFILE "\n");
 }
 # if line contains a DEFINE statement with a value, convert to c-style
 elsif ($currentLine =~ m/#DEFINE[\s\t]+([^\s\t\/]+)(.*)$/i)
 {
	 my $rawValue = $1;
	 my $extraData = $2;
	 print (HFILE "\t" x $indentCount . "#define\t");
	 if ($rawValue =~ m/^H'([^']+)'$/)
	 {
   print (HFILE "0x$1");
	 }
	 if ($extraData ne "")
	 {
   print (HFILE "\t" . $extraData);
	 }
	 print (HFILE "\n");
 }
 # if line contains " EQU ", convert to c-style DEFINE
 elsif ($currentLine =~ m/^([^\s\t]+)[\s\t]+EQU[\s\t]*([a-fA-F0-9Hh']+)(\/?.*)$/)
 {
	 my $name = $1;
	 my $rawValue = $2;
	 my $extraData = $3;
	 if ($isRegisterBlock == 0)
	 {
   print (HFILE "\t" x $indentCount . "#define\t" . $name . "\t");
   if ($rawValue =~ m/^[Hh]'([^']+)'$/)
   {
  	 print (HFILE "0x$1");
   }
   elsif($rawValue =~ m/^([0-9A-Fa-f]+)$/i)
   {
  	 print (HFILE "0x$1");
   }
   if ($extraData ne "")
   {
  	 print (HFILE "\t" . $extraData);
   }
   print (HFILE "\n");
	 }
	 #if we're part of the register block
	 #create special char ToLower(variable)@location lines too
	 if ($isRegisterBlock == 1)
	 {
   $name =~ tr/[A-Z]/[a-z]/;
   print (HFILE "\t" x $indentCount . "char " . $name . "@");
   if ($rawValue =~ m/^[Hh]'([^']+)'$/)
   {
  	 print (HFILE "0x$1;");
   }
   elsif($rawValue =~ m/^([0-9A-Fa-f]+)$/i)
   {
  	 print (HFILE "0x$1;");
   }
   if ($extraData ne "")
   {
  	 print (HFILE "\t" . $extraData);
   }
   print (HFILE "\n");
	 }
 }
 # if line contains INCLUDE, rename the include file to use the .h extension
 elsif ($currentLine =~ m/INCLUDE[\s\t]+([<"])([^>]+)([>"])(.*)$/)
 {
	 my $openChar = $1;
	 my $incFile = $2;
	 my $closeChar = $3;
	 my $extraData = $4;
	 $incFile =~ m/^([^.]+)/;
	 print (HFILE "\t" x $indentCount . "#include " . $openChar . $incFile . ".h" . $closeChar);
	 if ($extraData ne "")
	 {
   print (HFILE "\t" . $extraData);
	 }
	 print (HFILE "\n");
 }
 # else, it probably isn't anything we can use, so comment it out.
 # this includes:
 #(LIST|NOLIST|__MAXRAM|__BADRAM|MESSG|__MAXROM|__BADROM)
 else
 {
	 print (HFILE "/*\t" . $currentLine . " */\n");
 }
}
close (INCFILE);
close (HFILE);
}

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

×
×
  • Create New...