Hallo zusammen,

ich versuche schon seit einiger Zeit das Ultraschall Interface aus dem RN-Wissenbereich nach zu Bauen. Aber ich bekomme es einfach nicht zumlaufen.

Ich habe erstmal mit Eagle das Layout kopiert, und noch ein paar Veränderungen vor genommen (Verpolungsschutz, Abblockkondensatoren, etc.). Die Kondensatoren C5 und C6 im Layout sollen den Ultraschallsender bzw. -empfänger(beide von Reichelt) darstellen, und der Kondensator L1 die Spule.

Nachdem ich das Board dann erstellt hatte habe ich die Software geschreiben. Doch irgendwie will das Teil nicht funktionieren. Es leuchten immer nur die ersten 6 LEDs, egal wie weit weg oder nah ein Objekt ist. Auch wenn meine Formel zur Entfernungsberechnung falsch ist, müsste das Teil wenigstens etwas dynamik aufweisen.

Hier mein Quellcode:
Code:
#include <avr\io.h>
#include <avr\interrupt.h>
#include <inttypes.h>

//---------------------- Globale Variablen --------------------------------------------------------
//-------------------------------------------------------------------------------------------------
volatile uint8_t toggle=0;  // wenn 1 dann werden 16 Impulse gesendet
volatile uint8_t impulse=0; // um 16 Impulse zu senden muss impulse bis 32 laufen
volatile uint8_t resived=0; // wenn 1 dann INT0 ausgelöst
         float length;

//---------------------- Initialisierung ----------------------------------------------------------
//-------------------------------------------------------------------------------------------------
void init_Timer()
{
DDRD   |= (1<<PD5);      // OC1 Ausgang
PORTD  |= (1<<PD5);      // Standart ist High
TCCR1A |= (1<<COM1A0);   // OC1 wird bei einem Compare Match invertiert (Kein PWM)

TCCR1B |= (1<<CS11);     // Prescaler: Takt/8 
OCR1AL  = 25;            // Compare Wert: Takt/8/25= 80kHz
TIMSK  |= (1<<OCIE1A);   // Interrupt wenn Vergleichswert erreicht wird
TCCR1B |= (1<<3);        // Compare Match Modus (CTC1);Timer wird gestartet
}

void init_Interrupt()
{
PORTD |= (1<<PD2);       // Pull Up für INT0
GIMSK |= (1<<INT0);      // INT0 wird als Ext. Interrupt benutzt
MCUCR |= (1<<ISC00) | (1<<ISC01); // INT0 reagiert auf steigende Flanke
}



//---------------------- Interrupts ---------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
ISR(TIMER1_COMPA_vect)  // Compare Match Timer1
{
impulse++;
}


ISR(INT0_vect)  // Externer Interrupt INT0
{
resived=1;
//PORTC ^= (1<<PC7);
}
//---------------------- Unterprogramm ------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
void Target()
{


length=((impulse-64)*12.5)*0.33;

if (length>200)
  PORTC &= ~(1<<PC0);  //LED an
else
  PORTC |= (1<<PC0);   //LED aus
if (length>300)
  PORTC &= ~(1<<PC1);  //LED an
else
  PORTC |= (1<<PC1);   //LED aus
if (length>400)
  PORTC &= ~(1<<PC2);  //LED an
else
  PORTC |= (1<<PC2);   //LED aus
if (length>500)
  PORTC &= ~(1<<PC3);  //LED an
else
  PORTC |= (1<<PC3);   //LED aus
if (length>600)
  PORTC &= ~(1<<PC4);  //LED an
else
  PORTC |= (1<<PC4);   //LED aus
if (length>700)
  PORTC &= ~(1<<PC5);  //LED an
else
  PORTC |= (1<<PC5);   //LED aus
if (length>800)
  PORTC &= ~(1<<PC6);  //LED an
else
  PORTC |= (1<<PC6);   //LED aus
if (length>900)
  PORTC &= ~(1<<PC7);  //LED an
else
  PORTC |= (1<<PC7);   //LED aus
}


//---------------------- Hauptprogramm ------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
int main()
{
DDRC = 0xFF; //Ausgang
PORTC = 0xFF; //Alle LEDs aus

init_Interrupt();
init_Timer();

sei();



while(1)
  {
    if(impulse==32)
	  {
         toggle=TCCR1A;
		 TCCR1A=  0x00;  //Invertierung wird gestoppt
         
		 // Empfangen
		 while( !(resived==1) && (impulse<250) )
		            ;
//            PORTC = 0xFF; //PORTC alles AUS
            resived=0;
			Target();
         
		 impulse=0;
		 TCCR1A=toggle;  //Invertierung wird gestartet
	  }
  }


return 0;
}
Ich würde mich sehr freuen wenn jemand mein Problem finden könnte. Ich versuch mich dadran schon seit ein paar Wochen.

Danke schön
NemesisoD