OK , hier ist der Code :
Code:
#include "asuro.h"
void InitUlrasonics(void)
{
// Change Oscillator-frequency of Timer 2
// to 40kHz, no toggling of IO-pin:
TCCR2 = (1 << WGM21) | (1 << CS20);
OCR2 = 100; // 40kHz @8MHz crystal
ADCSRA = (0 << ADEN); // ADC deaktivieren
// Analog Comparator einstellen:
ACSR = (1 << ACIS1); // Comparator Interrupt on Falling Output Edge
ADMUX = 0x03; // ADC3-Eingang mit Komparator verbinden
SFIOR |= (1 << ACME); // ADC Multiplexer mit Komparator verbinden
DDRD &= ~(1 << 6); // Port D Pin 6 als Eingang schalten (AIN0)
}
int Chirp(unsigned char flag)
{
// Variablen definieren
unsigned int sleeptime = 0, dist = 0;
if(flag)
InitUlrasonics();
// Chripen:
count72kHz = 0;
while(count72kHz != 20) {
OCR2 = 100 + 20 / 2 - count72kHz;
}
TCCR2 = (1 << WGM21) | (1 << CS20);
OCR2 = 100;
// Echos auswerten:
for(;;) {
Sleep(1);
sleeptime += 1;
if((ACSR & (1 << ACI))) {
dist = (unsigned int) ((long) ((344L * ((sleeptime * 1000L) / 72L) / 10000L) / 2L));
ACSR |= (1 << ACI);
break;
}
ACSR |= (1 << ACI);
if(sleeptime > 3500) {
return -1;
}
}
//if(flag)
//ReinitAsuro();
return dist;
}
int main(void)
{
// Variablen
int chirpData = 0;
int speed =200;
// Asuro initialisieren
Init();
for(;;) {
chirpData = Chirp(TRUE);
if(chirpData>21){
MotorDir(FWD,FWD);
MotorSpeed(speed,speed);
}
else
{
MotorDir(RWD,RWD);
MotorSpeed(100,speed);
}
}
return 0;
}
Der Code der Ultrasonics.h von luma
Code:
/*******************************************************************************
* Dateiname: ultrasonics.h
* Projekt: Erweiterte Asurobibliothek
*
*
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation; either version 2 of the License, or any later version.
*
*
* Kleine Funktionsbibliothek, mit welcher man die Ultraschall-
* Erweiterungsplatine für Asuro betreiben kann.
*
*
* @version 1.0.0
* @since 13.08.2005
* @author Luma
*******************************************************************************/
#ifndef ULTRASONICS_H
#define ULTRASONICS_H
#include "asuro.h"
/**
* Konfiguriert den Asuro so, das er die Ultraschall-Erweiterungsplatine in
* Betrieb nehmen kann. Hinweis: Diese Funktion wird automatisch von der
* Funktion Chirp aufgerufen und sollte sonst nicht verwendet werden.
*/
void InitUlrasonics(void);
/**
* Diese Funktion wird aufgerufen, wenn man den Asuro wieder zurückstellen
* will. (Das geschieht normalerweise nach einem "Chirp".). Auch diese
* Funktion sollte sonst nicht verwendet werden.
*
*/
void ReinitAsuro(void);
/**
* Sendet einen sogenannten "Chirp". Ist flag true (also = 1), so wird der
* Asuro nach dem Chrip wieder zurückgestellt, damit man wieder wie gewohnt
* alle Funktionen verwenden kann (während eines Chirps ist es z. Bsp. nicht
* möglich über USART Daten zu schicken/empfangen, da der ADC deaktiviert werden
* muss). Tritt irgendein Fehler auf, oder kann nicht gemessen werden, gibt
* die Funktion -1 zurück.
*
* @param flag Ist flag true wird der Asuro nach jedem Chirp
* wieder zurückgestellt und vor dem Chirpen,
* umkonfiguriert. Ist flag false so kann man
* mit den Funktionen InitUlrasonics sowie
* ReinitAsuro Asuro entweder zum Chirpen oder
* zum "Normalbetrieb" umkonfigurieren. flag auf
* true zu setzen wird empfohlen wenn man nur
* einzelne Messung macht.
* @return Gibt die gemessene Strecke in [cm] zurück
*/
int Chirp(unsigned char flag);
#endif
Danke schonmal für die Hilfe
Oliver
Lesezeichen