- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 10 von 37

Thema: HC-SR04 & m32

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    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

  2. #2
    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

Ä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
  •  

LiFePO4 Speicher Test