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?
Lesezeichen