Jump to content
MrNobody

Convert From Hitech Pic16 Compiler To Boostc

Recommended Posts

MrNobody    0

Hi..

Can somebody please teach me how to convert the code below into BoostC..?

I have some basic knowledge on BoostC but I totally have no knowledge of HITECH PIC16 compiler..

So, I don't even know how to begin..

 

Thanks in advance..

 

Here is the code

 

////////////////////////////////////////////////////////////////////////////////
//
//	 PIC16F877 + SRF05 + LCD03 example
//	 Written October 2005 by Gerald Coe, using HITECH PIC16 compiler
// 
//		 Performs ranging using just a single pin on the PIC16F877 (RB0)
//
//		 Note - assumes a 20MHz crystal, which is 5MHz timer clock
//		 A 1:4 prescaler is used to give a 1.25MHz timer count (0.8uS per tick)
//
//	 This code is Freeware - Use it for any purpose you like.
//
///////////////////////////////////////////////////////////////////////////////


#include <pic.h>
#include <stdio.h>

__CONFIG(0x3b32);								// configuration register - see PIC data sheet for details		

#define TrgEch			RB0
#define TrgDir			TRISB0

void clrscn(void);							// prototypes
void cursor(char pos);
void print(char *p);
void setup(void);
unsigned int get_srf05(void);

char s[21];										// buffer used to hold text to print

void main(void)
{
unsigned int range;

setup();										// sets up the PIC16F877 I2C port
clrscn();									// clears the LCD03 disply
cursor(2);									// sets cursor to 1st row of LCD03
sprintf(s,"SRF05 Ranger Test");		// text, printed into our buffer
print(s);									// send it to the LCD03

while(1) {									// loop forever
	range = get_srf05();					// get range from srf05 (round trip flight time in 0.8uS units)
	cursor(24);								// sets cursor to 2nd row of LCD03
	sprintf(s,"Range = %dcm  ", range/72);	// convert to cm
	print(s);								// send it to the LCD03	
	cursor(44);								// sets cursor to 3rd row of LCD03
	sprintf(s,"Range = %dinch  ", range/185);	// convert to inches
	print(s);								// send it to the LCD03	

	TMR1H = 0;								// 52mS delay - this is so that the srf05 ranging is not too rapid
	TMR1L = 0;								// and the previous pulse has faded away before we start the next one
	T1CON = 0x21;							// 1:4 prescale and running
	TMR1IF = 0;
	while(!TMR1IF);						// wait for delay time
	TMR1ON = 0;								// stop timer	
}
}

unsigned int get_srf05(void)
{
TMR1H = 0xff;								// prepare timer for 10uS pulse
TMR1L = -14;
T1CON = 0x21;								// 1:4 prescale and running
TMR1IF = 0;
TrgDir = 0;									// make trigger/echo pin an output	
TrgEch = 1;									// start trigger pulse
while(!TMR1IF);							// wait 10uS
TrgEch = 0;									// end trigger pulse
TMR1ON = 0;									// stop timer
TrgDir = 1;									// make trigger/echo pin an input

TMR1H = 0;									// prepare timer to measure echo pulse
TMR1L = 0;	
T1CON = 0x20;								// 1:4 prescale but not running yet
TMR1IF = 0;
while(!TrgEch && !TMR1IF);				// wait for echo pulse to start (go high)
TMR1ON = 1;									// start timer to measure pulse
while(TrgEch && !TMR1IF);				// wait for echo pulse to stop (go low)
TMR1ON = 0;									// stop timer
TrgDir = 0;									// make trigger/echo pin an output again	
return (TMR1H<<8)+TMR1L;				// TMR1H:TMR1L contains flight time of the pulse in 0.8uS units
}

void clrscn(void)
{
SEN = 1;								// send start bit
while(SEN);							// and wait for it to clear

SSPIF = 0;
SSPBUF = 0xc6;						// LCD02 I2C address
while(!SSPIF);						// wait for interrupt
SSPIF = 0;							// then clear it.

SSPBUF = 0;							// address of register to write to 
while(!SSPIF);						// 
SSPIF = 0;							//

SSPBUF = 12;						// clear screen 
while(!SSPIF);						// 
SSPIF = 0;							//

SSPBUF = 4;							// cursor off 
while(!SSPIF);						// 
SSPIF = 0;							//

PEN = 1;								// send stop bit
while(PEN);							//
}


void cursor(char pos)
{
SEN = 1;								// send start bit
while(SEN);							// and wait for it to clear

SSPIF = 0;
SSPBUF = 0xc6;						// LCD02 I2C address
while(!SSPIF);						// wait for interrupt
SSPIF = 0;							// then clear it.

SSPBUF = 0;							// address of register to write to 
while(!SSPIF);						// 
SSPIF = 0;							//

SSPBUF = 2;							// set cursor 
while(!SSPIF);						// 
SSPIF = 0;							//
SSPBUF = pos;						//  
while(!SSPIF);						// 
SSPIF = 0;							//

PEN = 1;								// send stop bit
while(PEN);							//
}


void print(char *p)
{
SEN = 1;								// send start bit
while(SEN);							// and wait for it to clear

SSPIF = 0;
SSPBUF = 0xc6;						// LCD02 I2C address
while(!SSPIF);						// wait for interrupt
SSPIF = 0;							// then clear it.

SSPBUF = 0;							// address of register to write to 
while(!SSPIF);						// 
SSPIF = 0;							//

while(*p) {
	SSPBUF = *p++;					// write the data 
	while(!SSPIF);					// 
	SSPIF = 0;						// 
}

PEN = 1;								// send stop bit
while(PEN);							//
}


void setup(void)
{
unsigned long x;

PORTB = 0xfe;						// RB0 (trig) is output
TRISB = 0xfe;						// and starts low

TRISC = 0xff;
PORTC = 0xff;

SSPSTAT = 0x80;
SSPCON = 0x38;
SSPCON2 = 0x00;
SSPADD = 50;						// SCL = 91khz with 20Mhz Osc

for(x=0; x<300000L; x++);		// wait for LCD03 to initialise		
}

Share this post


Link to post
Share on other sites
joli    0

This is a delayed answer but in any case maybe it could be usefull to the ones that start trying to do it, also because i saw several guests seeing this thread.

 

as far i can see the changes that should be made, are:

 

includes:
replace both by
#include <system.h>

 

__CONFIG
replace it by:
#pragma DATA _CONFIG, 0x3b32

note: this is an oggly way to do it, in the future try to replace literal 0x3b32 by the fuse names you want to set, separated by commas (edit pic16f877.h under "c:\.....\sourceboost\include" to see what correct names are defined.

ex: #pragma DATA _CONFIG, _WRT_ENABLE_ON & _WDT_ON .... whatever you want.. this is just an example

This is more readable to see what fuses are defined at a first glance.

 

pic registers:
all them should be in lower case... ex: use tmr1h instead of TMR1H.

pic register bits:
use "intcon.TMR1IF = 0;" instead of "TMR1IF = 0;" (the same to all others you use)

 

side comments:
As this old pic is one of many that have the rmw issue (read modify write), i recomend you use the below methode to change

ports:

unsigned char portb_mirror = 0xfe;
portb = portb_mirror;

instead of: portb = 0xfe;

 

 

br

Edited by joli

Share this post


Link to post
Share on other sites
Pavel    0

As this old pic is one of many that have the rmw issue (read modify write), i recomend you use the below methode to change

ports:

unsigned char portb_mirror = 0xfe;

portb = portb_mirror;

instead of: portb = 0xfe;

 

Please explain why your method is more preferable?

 

Regards,

Pavel

Share this post


Link to post
Share on other sites
joli    0

 

As this old pic is one of many that have the rmw issue (read modify write), i recomend you use the below methode to change

ports:

unsigned char portb_mirror = 0xfe;

portb = portb_mirror;

instead of: portb = 0xfe;

 

Please explain why your method is more preferable?

 

Regards,

Pavel

 

In the particular case where he just write the entire port and he do nothing more, its irrelevant the use of a port shadow.

I point it just a general rule to follow just in case.

 

Actually in some load circumstancies pic12/16/18 all them have this issue, the difference is that the pic18 and new pic16 have the lat(x).

 

google for "microchip DS31009A" pag 9

 

br

Edited by joli

Share this post


Link to post
Share on other sites
JorgeF    0

Hi

 

All microcontroler program can suffer the R-M-W issue whenever the loading of one output pin is over the limits. This is valid for PICs and for all others.

But the R-M-W efect is only an issue when we are using an "r-m-w" instruction, wich is not the case in this sample.

 

 

"portb = 0xfe"
compiles to ...

 

movlw 0xfe
movwf  portb

none of the above is an r-m-w instruction so there is no point in using a ghost register.

 

In PICs, only the "bit" instructions have an r-m-w behaviour, the byte instructions don't.

 

 

Just my 2 cents....

 

 

Best regards

Jorge

Edited by JorgeF

Share this post


Link to post
Share on other sites

Your content will need to be approved by a moderator

Guest
You are commenting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoticons maximum 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...

×