Quellcode:
Code:
/*****************************************************************************/
// Includes:

#include "RP6ControlLib.h" 		// The RP6 Control Library. 
								// Always needs to be included!
//#include "RP6I2CmasterTWI.h"

/*****************************************************************************/

#define sbi(ADDRESS,BIT) ((ADDRESS) |= (1<<(BIT)))
#define cbi(ADDRESS,BIT) ((ADDRESS) &= ~(1<<(BIT))) 

/*****************************************************************************/

//***********************************************//
// VOID USLEEP
// Wartet fuer 100*usec Mikro-Sekunden
// = msleep mit 10x hoeherer Aufloesung
// msleep(1) entspricht usleep(10)
//***********************************************//
void usleep(unsigned char usec)
{
  for (int s=0; s<usec; s++) {
    for (long int i=0; i<140; i++) {
      asm volatile("nop");
      asm volatile("nop");
    }
  }
} 

/*****************************************************************************/

/*****************************************************************************/

//Auszug aus ibex_header_v117.h
//(c) Bernhard Stiehle 2008-2010
//***********************************************//
// INT USONIC
// liefert den Abstand des Ultraschallsensors
// in Zentimetern. Es muss die Type SRF05 sein.
// Rueckgabewert -1 = Modul reagiert nicht/ außerhalb Bereich
//***********************************************//
int usonic();

int usonic()
{

 int ustime=0;  //Eine Variable bitte ... danke !
 int failure=0; //Sicherheit
 
 cbi(DDRA,2);           //Anschluss als Eingang
 cbi(PORTA,2);        //Pull-ups sicherheitshalber ausschalten
 
 sbi(DDRA,2);           //Anschluss als Ausgang
 cbi(PORTA,2);         //Low-Pegel ausgeben
 usleep(1);             //Wartezeit
 
 sbi(PORTA,2);          //High-Impuls ausgeben (-> Sensor misst)
 usleep(1);             //Warten
 cbi(PORTA,2);          //Impuls Ende
 
 cbi(DDRA,2);           //Anschluss als Eingang
 cbi(PORTA,2);          //Pull-ups sicherheitshalber ausschalten
 usleep(1);             //warten
 
 
 while( !(PINA & 4) )  //warten, bis der Sensor sein Signal
 {                      //zurueckgibt (warten solange low)
  asm volatile("nop");
  asm volatile("nop");
  failure++;            //Sicherheit: wenn kein Signal nach bestimmter Zeit kommt
  if(failure>2500)   
  {return -1;}         //dann -1 zurueck liefern (= kein Modul angeschlossen)
 }

 failure=0;
 
 while(PINA & 4)       //Signal hat begonnen (=high)
 {
  ustime++;             //Dauer des Impulses messen
  usleep(1);            //Die Variable will eine Einheit (hier 0,1 ms)
  failure++;            //Sicherheit: wenn Signal nach bestimmter Zeit nicht endet
  if(failure>5000)
  {return -1;}         //dann -1 zurueck liefern (= kein Modul angeschlossen)
 }
 
 mSleep(35);            //Wartezeit (Echo soll verhallen, sonst Fehlmessung)
 
 return int( float(ustime)*float(1.408) );  //Rueckgabewert in Zentimeter, bitte !
} 

/*****************************************************************************/

/*****************************************************************************/
// Main function - The program starts here:

int16_t main(void)
{
	initRP6Control(); // Always call this first! The Processor will not work
					  // correctly otherwise. 
	// Play a sound to indicate that our program starts:
	sound(100,40,64);
	sound(170,40,0);
	mSleep(400);
	setLEDs(0b0000);
	
	initLCD(); // Initialize the LC-Display (LCD)
			   // Always call this before using the LCD!
	showScreenLCD("  SRF05  ", " Messung ");
	mSleep(500);
	
	//int abstand=usonic(); //FunktionsAufruf
	
	// .... (abstand); Ausgabe auf dem LCD
	

	
	return 0;
}
/*****************************************************************************/

Muss vielleicht was an "Makefile" gemacht werden?