- 3D-Druck Einstieg und Tipps         
Seite 4 von 4 ErsteErste ... 234
Ergebnis 31 bis 37 von 37

Thema: HC-SR04 & m32

  1. #31
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Anzeige

    Powerstation Test
    Hi inka,
    bei der nichtblockierenden version scheitere ich zunächst mal an der abfrage der PINs.
    Die Abfrage der Pins ist ja nicht abhängig von einer Programm-Variante.
    D.h.: Die Pins werden immer gleich abgefragt (wie es in deiner 1. Version ja schon klappt).

    an der nicht blockierenden variante arbeite ich noch...(ist die eigentlich vorteilhaft, oder halt nur eine variante?)
    Eine quasi nicht blockierende (bzw. wenig blockierende) Programmversion könnte so aussehen:
    Eine Task in der schnellen Hauptschleife:
    - Wenn (Stopwatch2 > 60):
    -- imp_flag löschen (LOW)
    -- Stopwatch2 zurück setzen auf 0
    - Sendet Triggerimpuls (nur wenn NOT imp_flag!!) und setzt dann ein Flag (nennen wir es "imp_flag"), dass der Impuls erfolgt ist.
    - Testet bei jedem Durchlauf den Pegel an Echo (nur wenn imp_flag == HIGH!!) :
    -- Wenn Echo == LOW:
    --- echo_low Flag setzen (HIGH)
    --- Wenn active Flag == HIGH:
    ---- Stopwatch1 lesen und Wert berechnen (evtl. Flag setzen, dass Wert vorliegt & angezeigt werden kann!)
    ---- active Flag löschen (LOW)
    ---- Stopwatch2 zurück setzen auf 0
    -- Oder wenn Echo == HIGH:
    --- Wenn echo_low Flag == HIGH:
    ---- Stopwatch1 zurück setzen auf 0
    ---- echo_low Flag löschen (LOW)
    --- Oder wenn echo_low Flag == LOW:
    ---- active Flag setzen (HIGH)

    Achtung:
    Nicht getestet und nur so hingeschrieben (es können also auch noch logische Fehler drin sein!).
    Also nicht rein schematisch umsetzen, sondern die Logik nachvollziehen und dann erst in ein Programm umsetzen!
    Gruß
    Dirk

  2. #32
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    76
    Beiträge
    2.180
    hi Dirk,

    werde ich probieren...

    zu der blockierenden version habe ich noch eine frage/problem:

    hab zwar geschrieben, dass es funktioniert - im prinzip tut es ja auch. Der sensor reagiert auf veränderungen der entfernung, die ausgabe ist zwar ungenau, sprünge habe ich beobachtet, dachte, das wird sich schon klären lassen....

    Beim versuch das zu beseitigen stelle ich fest, dass die sprüge in der ausgabe der gemessenen entfernung in "ganzen vielfachen von 17,15" erfolgen. Also 17,15 / 34,30 / 51,45 / 68,60 usw...

    was zum teufel kann dass denn bedeuten?
    gruß inka

  3. #33
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hi inka,

    mh, also ...

    17,15 " sind ja so etwa 43,56 cm.

    Bei einer Schallgeschwindigkeit von 343 m/s in deiner Wohnung braucht der Schall für die Strecke von 43,56 cm etwa 1,27 ms.

    Das passt recht gut:
    Deine Messschleife, die ja mit den Stopwatches arbeitet, kann ja nur in der Auflösung der Stopwatches messen und die beträgt 1 ms.

    Deine Messschleife misst also mit einer Auflösung von 1,27 ms, damit in Vielfachen von 43,56 cm.
    Deckt sich das mit deiner Erfahrung? Gibt es wirklich so hohe Sprünge?


    Abhilfe:
    Die Messschleife könnte noch verbessert werden, wenn man anstelle der Stopwatch die Variable "timer" benutzt.

    Die zählt mit 100 µs hoch, damit ist eine Auflösung von 3,4 cm möglich.
    Gruß
    Dirk

  4. #34
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    76
    Beiträge
    2.180
    hi Dirk,

    da ist ein missverständnis enstanden:

    entfernung in "ganzen vielfachen von 17,15"
    wurde zu
    17,15"
    es waren "nur" 17.5 cm, jetzt mit der neuen, genaueren stopwatch01 nur 1.75cm. Das ist mehr als nur "gut genug"...
    gruß inka

  5. #35
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Ah ok,

    das waren 17,15 cm und nicht Zoll.
    Macht das Sinn?

    Rechnung:
    17,15 cm auf EINEN Ultraschallweg (= Distanz) berechnet wären 34,3 cm auf dem kompletten Ultraschallweg (hin zum und zurück vom Objekt).
    Damit hattest du in der alten Version wirklich eine Auflösung von 1 ms (mit den 1 ms Stopwatches) und hast auf diesem Weg auch gleich die Schallgeschwindigkeit in deiner Wohnung auf 343 m/s bestimmt. Glückwunsch.

    (Macht VIEL mehr Sinn als meine Rechnung oben... )
    Gruß
    Dirk

  6. #36
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    76
    Beiträge
    2.180
    Hi Dirk,
    Zitat Zitat von Dirk Beitrag anzeigen
    Die Abfrage der Pins ist ja nicht abhängig von einer Programm-Variante.
    D.h.: Die Pins werden immer gleich abgefragt (wie es in deiner 1. Version ja schon klappt).
    offensichtlich haperts aber gerade daran , weil er nie in die abfragenschleife

    Code:
    blockierend:
    loop_until_bit_is_set(PINC, PC5);
    
    nicht blockierend:
     if ( PINC & (1<<PINC5) )
                            {}
    reingeht...

    der sensor ist genauso angeschlossen wie bei der blockierenden version, sind es evtl. wieder irgendwelche zeitablauf-probleme?

    Zitat Zitat von Dirk Beitrag anzeigen
    Eine quasi nicht blockierende (bzw. wenig blockierende) Programmversion könnte so aussehen:
    Eine Task in der schnellen Hauptschleife:
    - Wenn (Stopwatch2 > 60):
    -- imp_flag löschen (LOW)
    -- Stopwatch2 zurück setzen auf 0
    - Sendet Triggerimpuls (nur wenn NOT imp_flag!!) und setzt dann ein Flag (nennen wir es "imp_flag"), dass der Impuls erfolgt ist.
    - Testet bei jedem Durchlauf den Pegel an Echo (nur wenn imp_flag == HIGH!!) :
    -- Wenn Echo == LOW:
    --- echo_low Flag setzen (HIGH)
    --- Wenn active Flag == HIGH:
    ---- Stopwatch1 lesen und Wert berechnen (evtl. Flag setzen, dass Wert vorliegt & angezeigt werden kann!)
    ---- active Flag löschen (LOW)
    ---- Stopwatch2 zurück setzen auf 0
    -- Oder wenn Echo == HIGH:
    --- Wenn echo_low Flag == HIGH:
    ---- Stopwatch1 zurück setzen auf 0
    ---- echo_low Flag löschen (LOW)
    --- Oder wenn echo_low Flag == LOW:
    ---- active Flag setzen (HIGH)

    Achtung:
    Nicht getestet und nur so hingeschrieben (es können also auch noch logische Fehler drin sein!).
    Also nicht rein schematisch umsetzen, sondern die Logik nachvollziehen und dann erst in ein Programm umsetzen!
    ich habe versucht Dein vorschlag, so weit ich die "dutzende von flags " nachvollziehen konnte umzusetzen, bei mir sind es letztendlich zwei:

    Code:
    uint8_t trig_gesendet, echo_empfangen;

    Code:
    #include "RP6ControlLib.h"
    #include "RP6Control_MultiIOLib.h"
    //#include "standard.h"
    #include "RP6Stopwatch0Lib.h"
    
    volatile uint16_t zeit;
    double distanz;
    uint8_t trig_gesendet, echo_empfangen;
    
    
    void writeDouble(double number, uint8_t width, uint8_t prec)
    {
        char buffer[width + 1];
        dtostrf(number, width, prec, &buffer[0]);
        writeString(&buffer[0]);
    }
    
    void trig_PC6(void)
    {
        PORTC |= (1<<PC6);//Trig high
        _delay_us(12);
        PORTC &= ~(1<<PC6);//TRIG auf low
    }
    
    int main(void)
    {
    
        initRP6Control();
        multiio_init();
        initLCD();
    
        DDRC |= (1 << PC6);//Trig als Ausgang
        PORTC &= ~(1<<PC6);//TRIG auf low
    
        DDRC &= ~(1<<PC5);//Echo als Eingang
        PORTC &= ~(1<<PC5);//ECHO pullup AUS (Echo auf LOW)
    
        writeString_P("\n\n HC-SR-04 mit PC6 (trig,gruen) / PC5 (echo, gelb) zaehlschleife frei_1ms\n\n");
        writeChar('\n');
    
        startStopwatch02();
    
        while(1)
        {
    
            if (getStopwatch02() > 60)
            {
                if (trig_gesendet == 0)
                {
    
                    trig_gesendet = 0;
                    trig_PC6();
                    setStopwatch02(0);
                    trig_gesendet = 1;
    
                    while(1)
                    {
                        if (trig_gesendet == 1)
                        {
                            if ( PINC & (1<<PINC5) )
                            {
                                zeit = getStopwatch02();
                                echo_empfangen = 1;
    
                                distanz = ((zeit/2)*3.43);
    
                                setStopwatch02(0);
    
                                //Werte ausgeben
                                writeString("  zeit:  ");
                                writeIntegerLength(zeit, DEC, 4);
                                writeString("  distanz:  ");
                                writeDouble(distanz, DEC, 1);
                                writeString("  cm");
                                writeChar('\n');
                            }
                            else
    
                            {
                                echo_empfangen = 0;
                                trig_gesendet = 0;
                                setStopwatch02(0);
                                break;
                            }
                        }
    
                    }
                    echo_empfangen = 0;
                    trig_gesendet = 0;
                    setStopwatch02(0);
                }
                echo_empfangen = 0;
                trig_gesendet = 0;
                setStopwatch02(0);
            }
            echo_empfangen = 0;
            trig_gesendet = 0;
            setStopwatch02(0);
        }
    
        return 0;
    }
    dies hier am ende jeder schleife ist mehr oder weniger ein verzweifelter versuch:

    Code:
    echo_empfangen = 0;
                trig_gesendet = 0;
                setStopwatch02(0);
    geholfen hats nicht...

    danke für Deine zeit...
    gruß inka

  7. #37
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hi inka,
    offensichtlich haperts aber gerade daran , weil er nie in die abfragenschleife

    Code:
    blockierend:
    loop_until_bit_is_set(PINC, PC5);

    nicht blockierend:
    if ( PINC & (1<<PINC5) )
    {}
    Der if-Befehl blockiert ja so nicht, sondern führt die leere {} nur 1x aus, wenn PC5 high ist.

    Wenn man warten muss, bis PC5 high wird:
    // PC5 ist LOW!
    while ( !(PINC & (1<<PINC5)) ) {nop();} // Warte so lange wie PC5 LOW ist!
    // Jetzt ist PC5 HIGH geworden!

    Übrigens: (1 << PINC5) ist in der RP6Control.h definiert als IO_PC5.
    -> IO_PC5 = 1 << PINC5 = 0b00000001 << 5 = 0b00100000 = 32
    Damit reicht: ( PINC & IO_PC5 )
    Gruß
    Dirk

Seite 4 von 4 ErsteErste ... 234

Ähnliche Themen

  1. SRF02 und HC-SR04
    Von inka im Forum Robby RP6
    Antworten: 9
    Letzter Beitrag: 09.10.2014, 20:20
  2. Ansteuerung Ultraschallsensor HC-SR04
    Von icebreaker im Forum C - Programmierung (GCC u.a.)
    Antworten: 7
    Letzter Beitrag: 07.08.2013, 16:12
  3. Verkaufe Verkaufe RN-Control 1.4 Mega32 & 2x Servomotor & Entfernungssensor & PC Anschlusskabe
    Von Reiner47 im Forum Kaufen, Verkaufen, Tauschen, Suchen
    Antworten: 1
    Letzter Beitrag: 10.06.2013, 23:07
  4. Verkaufe [V] IC's & Diverse Platinen & SPS & Thin Clients & Display 6.4" Touch
    Von Noy im Forum Kaufen, Verkaufen, Tauschen, Suchen
    Antworten: 0
    Letzter Beitrag: 14.01.2012, 01:43
  5. Antworten: 5
    Letzter Beitrag: 22.11.2007, 10:17

Berechtigungen

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

Labornetzteil AliExpress