//Ultrasound Pulse and detect routine //Returns distance in 100um (or tenths of mm) #include#include "ses.h" #include "timer.h" //#include "ad_lib.h" #include "shiftreg.h" //#include "kbhit.h" /*---------------- Module Defines ---------------------------*/ //#define ULTRASONIC_TIMEOUT_TIMER 7 //#define ULTRASONIC_PULSE_PERIOD 52 //in desired mS //#define ULTRASONIC_TIMEOUT 10 // in 4mS ticks. 10 ticks=40mS //#define SAMPLES_PER_POINT 1 //number of chirp cycles to average //to get the distance. if commented out it //must be now a passed variable. 955am Sunday BR #define DEBUG 0 /*---------------- Global Variables -------------------------*/ //static unsigned int wallDistance[ROTATIONAL_SAMPLE_POINTS]; static unsigned int samplePointNum; //static unsigned int sampleArrayForAveraging[SAMPLES_PER_POINT]; static unsigned int sampleArrayForAveraging[1]; /*---------------- Function Prototypes ----------------------*/ void sendGoPulse(void); unsigned int averageSampleDistances (unsigned int samplesToAverage); unsigned int doSample (void); /*---------------- Module Code -----------------------------*/ unsigned int getUltrasoundSample (unsigned int samplesToAverage) { //unsigned char getUltrasonicDistance (unsigned char motorIndex) { //TMR_Init() 4mS must have been called prior to this routine! but not in this routine! unsigned int thisSampleDistance; //this single-sampled distance unsigned int theDistance; //post-averaging distance unsigned int s; //counter //unsigned char motorIndex; //for testing--remove once modularized //motorIndex = 77; //for testing--remove once modularized if (DEBUG) printf("\nstarting getUltrasoundSample, averaging %u", samplesToAverage); for (s=0; s 1) { //stick it in array sampleArrayForAveraging[s] sampleArrayForAveraging[s] = thisSampleDistance; } } if (samplesToAverage > 1) { theDistance = averageSampleDistances(samplesToAverage); if (DEBUG) printf("\n Avg %d: %u", samplesToAverage, theDistance); } else { theDistance = thisSampleDistance; if (DEBUG) printf("\n 1 sample: %u", theDistance); } return theDistance; //} //else wallDistance[sample point number] = thisSampleDistance; //stick it in array wallDistance[sample point number] } /*******************/ void sendGoPulse(void) { //send out as quick a pulse as possible on G0. This seems to be ~100uS. uchar initialPORTGdata; uchar pulseUp; uchar pulseDown; // WritePORTG(0xE3); //Test with alternate values in it. Should go to e2 after 1st cycle initialPORTGdata = ReadPORTG(); pulseUp = 0x01 | initialPORTGdata; /* if (DEBUG) { pulseDown = 0xFE & pulseUp; printf("\n chirp request pulse going out."); } */ WritePORTG(0x01 | initialPORTGdata); WritePORTG(0xFE & pulseUp); //this up-down thing takes about 100uS //if (DEBUG) printf("\n %x %x %x", initialPORTGdata, pulseUp, pulseDown); //if (DEBUG) printf("\n pulse out, now: %u", ReadPORTG()); } /*********************************************/ unsigned int doSample (void) { unsigned int echoPulseStart; unsigned int echoPulseEnd; unsigned int interval; unsigned int distance100um; //in tenths of mm for bit filling //send the pulse if (DEBUG) printf("\n calling sendGoPulse"); sendGoPulse(); //wait for the return pulse to go high //Temp commented out /*while (!(ReadPORTF() & 0x01)){ //empty loop printf("\n RPF hi"); }*/ //time the return echoPulseStart = TCNT; while (ReadPORTF() & 0x01) { //F0! while it is 1 or pulse returning //if (DEBUG) printf("\n This Echo Pulse end TCNT count %u ", echoPulseEnd); } echoPulseEnd = TCNT; //set the timer value, after it is off, you'll have it interval = (echoPulseEnd - echoPulseStart) / 2; //if (DEBUG) printf("\n %u uS", interval); distance100um = (echoPulseEnd - echoPulseStart) * .86; if (DEBUG) printf("\n %u ", distance100um); return distance100um; } /*******************/ unsigned int averageSampleDistances (unsigned int samplesToAverage) { double summationOfDistances; unsigned int thisSample; double averageDistance; unsigned int i; summationOfDistances = 0; for (i=0; i