PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit dem Ultraschallsensor (Ohne Asurofunktionen)



crabtack
10.10.2011, 14:40
Hallo,

da ich freiwillig einer inoffiziellen Roboter AG beigetreten bin soll ich nun eineen Asuro mit Ultraschallsensor ausstatten.
Der Bausatz von Arexx.

Jedenfalls registriert er schon was, wenn ich einfach Ultraschall erzeuge und dann die LED anschalte, wenn was am ADC eingang ankommt, wo der ausgang des Verstärkers vom receiver dranne ist.
Wenn ich nun was vor den Sensor halte geht die LED an.

Nun möchte ich die Entfernung zum Objekt messen, dazu habe ich dieses Programm geschrieben:


#include <avr/io.h>
#include <util/delay.h>
#ifndef F_CPU
#warning "F_CPU war noch nicht definiert, wird nun mit 3686400 definiert"
#define F_CPU 8000000UL
#endif
//ADC Funktion Anfang
uint16_t reciver = 0;
float zeit = 0;
uint8_t timer = 0;
float distanz = 0;
void ADC_Init(void)
{
TCCR0 = (1<<CS02); //Timer initalisieren
uint16_t ergebnis = 0; //ADC zeugs anfang
ADMUX = (1<<REFS1) | (1<<REFS0);
ADCSRA = (1<<ADPS2) | (1<<ADPS1);
ADCSRA |= (1<<ADEN);

ADCSRA |= (1<<ADSC); //Warmlaufen
while (ADCSRA & (1<<ADSC) ) {} // auf Abschluss der Konvertierung warten
ergebnis = ADCW;
}
//ADC Funktion Ende
uint16_t ADC_Read( uint8_t channel )//Einzelmessung
{
ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
ADCSRA |= (1<<ADSC);
while (ADCSRA & (1<<ADSC) ) {} // auf Abschluss der Konvertierung warten
return ADCW; //ADC Zeugs Ende
}

int main (void)
{

DDRB = 0xFF; //Ausgang
DDRD = 0xFF; //Ausgang

//TCCR1A = (1 << WGM10) | (1<<COM1A1)| (1<<COM1B1);
//TCCR1B = (1<<CS12) | (1<<CS10);
TCCR2 = (1 << WGM20) | (1<<COM21)|(1<<CS22); //PWM register. Vorteiler : 256
//OCR1A = 0;
//OCR1B = 0;
//OCR2 = 126;

//PORTB |= (1<<DDB5);//Vorwärts
//PORTD |= (1<<DDD5);//Vorwärts
ADC_Init();


while (1)
{

if (TCNT0 < 62) //wenn timer noch nciht 62 mal gezählt hat
{
OCR2 = 126;
if (timer == 0)
{
timer = 1;
TCNT0 = 0;
}
}
else {OCR2 = 0;}

reciver = ADC_Read(2);
if (reciver > 1000){
zeit = TCNT0;
zeit = zeit * 0.32/1000;
distanz = zeit;
distanz = distanz * 3/100;
timer = 0;
}
if (distanz > 0.01){PORTB |= (1<< DDB0);} //Led zur Kontrolle
else {PORTB &= ~ (1<< DDB0);} //LED aus
}
}



Die LED leuchtet nicht, also ist die gemessene Entfernung unter 0.01 cm.
Egal, was ich amche, also was hinhalte zum reflektieren oder so: die LED will nicht leuchten.
Wo liegt mein Fehler?
Ode rhat hier jemand ein dunkles Ritual abgehalten um die Schallgeschwindigkeit zu ändern?

Ich bin für alle hilfreichen Antworten dankbar.

Gruß
Olaf