-
        

Ergebnis 1 bis 2 von 2

Thema: Ultraschall Interface Problem

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    15.11.2006
    Ort
    NRW
    Alter
    32
    Beiträge
    54

    Ultraschall Interface Problem

    Anzeige

    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

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    15.11.2006
    Ort
    NRW
    Alter
    32
    Beiträge
    54
    Kann mir wenigstens jemand sagen ob meine Software so Ok ist, so das ich wenigstens weißob es an der Hard- oder Software liegt.

    Danke

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •