Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

Ultrasonic SRF05 with PIC 16F877a or similar

Status
Not open for further replies.

alex04032

Newbie level 4
Joined
Apr 8, 2012
Messages
6
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Activity points
1,341
Does any have C code for PIC 16F877a with the SRF05 module that has a pulse output proportional in duration to the range distance. I suspect this uses the capture mode. Im pretty new at this and am learning by modifying examples. Sure could use an example on this one.
 

Does any have C code for PIC 16F877a with the SRF05 module that has a pulse output proportional in duration to the range distance. I suspect this uses the capture mode.

Here is a fairly good tutorial:

SRF05 - Ultra-Sonic Ranger

FAQ:

Ultrasonic Rangers FAQ

Example Code PIC16F/SRF05:
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 <htc.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		
}

BigDog
 

Thanks, Big Dog, that looks good. Can you tell what effect a lower frequency clock might have ? I dont have the 20mhz crystal, but then again I dont need absolute distance readings, either. I just need relative readings right now. But, I wonder if that would affect the shortest distance that could be read.
 

Can you tell what effect a lower frequency clock might have ? I dont have the 20mhz crystal, but then again I dont need absolute distance readings, either. I just need relative readings right now. But, I wonder if that would affect the shortest distance that could be read.

The various timer configurations would need to be recalculated when using a different frequency crystal which would generate a different system clock frequency (Fosc).

It should not be difficult for you to adapt the code provided to a new crystal frequency and it should not effect the SRF05.

What crystal frequency do you plan to use in your design?

BigDog
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top