- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
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
    also, es funktioniert, zumindest teilweise. Ich musste (wegen code:blocks) noch ein paar libs inkludieren und auch die multiIO initialisieren, jetzt lässt sich der code bei mir auch starten:

    Code:
    //#include "RP6ControlLib.h"
    
    
    #include "RP6ControlLib.h"
    #include "RP6I2CmasterTWI.h"
    #include "RP6Control_MultiIOLib.h"
    #include "RP6Control_I2CMasterLib.h"
    #include "RP6Control_LFSBumperLib.h"
    #include "RP6ControlServoLib.h"
    #include "RP6Control_OrientationLib.h"
    //#include "standard.h"
    
    
    /*****************************************************************************/
    
    uint16_t distanz_PC5 = 0;
    volatile uint16_t zeit_PC5 = 0;
    volatile uint16_t timestamp_last_PC5 = 0;
    
    uint16_t distanz_PC6 = 0;
    volatile uint16_t zeit_PC6 = 0;
    volatile uint16_t timestamp_last_PC6 = 0;
    
    /*****************************************************************************/
    
    
    ISR(TIMER1_CAPT_vect)
    {
    //Wenn steigende Flanke
        if(TCCR1B & (1<<ICES1))
        {
    //Flankenerkennung auf fallend
            TCCR1B ^= (1<<ICES1);
    //aktuelen timer-wert speichern
            timestamp_last_PC5 = ICR1;
            timestamp_last_PC6 = ICR1;
        }
    //fallende Flanke
        else
        {
    //Flankenerkennung auf steigend
            TCCR1B ^= (1<<ICES1);
    //Laufzeit = aktueller timerwert - vorheriger timerwert
            zeit_PC5 = ICR1 - timestamp_last_PC5;
            zeit_PC6 = ICR1 - timestamp_last_PC6;
        }
    
    }
    
    /*****************************************************************************/
    
    void HCSR04_vorn (void)
    {
      // Messung
      DDRC |= (1 << PC5);//Trig als Ausgang
      PORTC &= ~(1<<PC5);//TRIG auf low
      DDRD &= ~(1<<PD6);//Echo als Eingang
      PORTD &= ~(1<<PD6);//ECHO pullup AUS
    
    
    //Timer konfigurieren
        TCCR1A = 0; // normal mode, keine PWM Ausgänge
    //Noise Canceler aktivieren, Flankenerkennung auf steigende, Prescaler auf 64
        TCCR1B |= (1<<ICNC1) | (1<<ICES1) | (1<<CS11) |(1<<CS10);
    
    //ICP Interrupt aktivieren
        TIMSK |= (1<<TICIE1);
    
    //Globale Interrupts aktivieren
        sei();
        distanz_PC5 = (zeit_PC5*4)/58;
        mSleep(100);
    // Trig
      PORTC |= (1<<PC5);//Trig high
      _delay_us(12);
      PORTC &= ~(1<<PC5);//TRIG auf low
      _delay_ms(50);
    
    //Werte ausgeben
    
      writeString("zeit_PC5:      ");
      writeIntegerLength(zeit_PC5, DEC, 4);
      writeChar('\n');
      writeString("distanz_PC5:    ");
      writeIntegerLength(distanz_PC5, DEC, 4);
      writeChar('\n');
      mSleep(2000);
    
    }
    /*****************************************************************************/
    void HCSR04_hinten (void)
    {
    
      // Messung
      DDRC |= (1 << PC6);//Trig als Ausgang
      PORTC &= ~(1<<PC6);//TRIG auf low
      DDRD &= ~(1<<PD6);//Echo als Eingang
      PORTD &= ~(1<<PD6);//ECHO pullup AUS
    
    
    //Timer konfigurieren
        TCCR1A = 0; // normal mode, keine PWM Ausgänge
    //Noise Canceler aktivieren, Flankenerkennung auf steigende, Prescaler auf 64
        TCCR1B |= (1<<ICNC1) | (1<<ICES1) | (1<<CS11) |(1<<CS10);
    
    //ICP Interrupt aktivieren
        TIMSK |= (1<<TICIE1);
    
    //Globale Interrupts aktivieren
        sei();
        distanz_PC6 = (zeit_PC6*4)/58;
        mSleep(100);
    // Trig
      PORTC |= (1<<PC6);//Trig high
      _delay_us(12);
      PORTC &= ~(1<<PC6);//TRIG auf low
      _delay_ms(50);
    
     //Werte ausgeben
    
      writeString("zeit_PC6:      ");
      writeIntegerLength(zeit_PC6, DEC, 4);
      writeChar('\n');
      writeString("distanz_PC6:    ");
      writeIntegerLength(distanz_PC5, DEC, 4);
      writeChar('\n');
      mSleep(2000);
    
    }
    
    
    /*****************************************************************************/
    void taster_M32(void)
    {
      uint8_t key = getPressedKeyNumber();
    
      if(key)
        {
    
         while(getPressedKeyNumber());
         switch(key)
            {
             case 1:
                   setLEDs(0b0001);
                HCSR04_vorn();
                break;
             case 2:
                 setLEDs(0b0010);
                HCSR04_hinten();
                break;
    
            }
        }
    }
    
    /*****************************************************************************/
    
    int main(void)
    {
     //   initRP6Control();
    
        initRP6Control();
        multiio_init();
        initLCD();
    
        while(true)
        {
        taster_M32();
        }
    
        return 0;
    }
    die jeweiligen messungen werden durch die tasten der m32 ausgelöst, allerdings wird beim druck auf die taste 2 das vorhergehende ergebnis der taste 1 ausgegeben. Also muss man die ausgaben die durch die taste 1 entstehen noch irgendwo "nullen"...

    ansonsten ähnelt die situation meinem vorhergehenden test, wenn ich auf PD6 die Sensoren umstecke, läufts, wenn beide Sensoren angeschlossen sind - nicht...

    die ausgabe im terminal:

    Code:
    Terminal cleared!
    zeit_PC5:      0694
    distanz_PC5:    0047
    zeit_PC6:      0694
    distanz_PC6:    0047
    zeit_PC5:      0694
    distanz_PC5:    0047
    zeit_PC6:      0694
    distanz_PC6:    0047
    gruß inka

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.05.2009
    Ort
    Berlin
    Beiträge
    450
    da ist ein Fehler bei der hinten Funktion, Werte ausgeben da steht PC5 statt PC6, ich mach weiter wenn meine Sensoren da sind.
    Vielleicht sollte man den PD6 nach dem Messen auch neu setzen. Also denn auf Ausgang.
    Gruß TrainMen

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

    es gäbe für die Zeitmessung noch die Option, eine eigene Mess-Schleife zu bauen.
    Dann könnte man auf ICP und Timer komplett verzichten.

    Also:
    - Routine, die nach dem Trigger-Impuls aufgerufen wird.
    - Dort läuft eine Zählschleife, die nur die Abfrage nach dem Ende-Impuls enthält und abbricht, wenn der Impuls kommt.
    - Ergebnis ist ein Zählwert, der der Entfernung entspricht.

    Die Funktion kann man (nacheinander) für mehrere Sensoren benutzen.
    Je nachdem, wie man die Funktion umsetzt, geht das blockierend (Interrupts gesperrt) oder besser als "Task" in einer schnellen Programm-Hauptschleife.

    Als Auflösung sind im 2. Fall 100µs (Variable timer der RP6-Library) möglich.

    Vorteil:
    Jeder Prozessor-Pin läßt sich nutzen.
    Keine Timer-Definitionen nötig.
    Gruß
    Dirk

  4. #4
    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 Funktion kann man (nacheinander) für mehrere Sensoren benutzen.
    Je nachdem, wie man die Funktion umsetzt, geht das blockierend (Interrupts gesperrt) oder besser als "Task" in einer schnellen Programm-Hauptschleife.
    also in einer schnellen programm-hauptschleife nur diese funktion, oder die möglichkeit aus einer hauptschleife diese schnelle funktion aufzurufen?
    gruß inka

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

    ... in einer schnellen programm-hauptschleife nur diese funktion, oder die möglichkeit aus einer hauptschleife diese schnelle funktion aufzurufen?
    Egal, wichtig wäre nur, dass die "Zählfunktion" alle paar MS wieder dran ist (so wie z.B. die Funktionen task_ADC(), task_motionControl() der RP6 Lib).
    Gruß
    Dirk

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    also ich habs jetzt mit meinen bescheidenen möglichkeiten versucht:

    Code:
    #include "RP6ControlLib.h"
    #include "RP6Control_MultiIOLib.h"
    
    uint16_t anfang, ende, dauer, distanz_schleife;
    
    void trig_schleife(void)
    {
        PORTC |= (1<<PC6);//Trig high
        _delay_us(12);
        PORTC &= ~(1<<PC6);//TRIG auf low
    }
    
    
    
    void messung_SR_04_schleife (void)
    {
    
        startStopwatch2();
    
        anfang=getStopwatch2();
    
        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)
    //    PORTC |= (1<<PC5);//Echo auf high
    
            while(1)
            {
                if ( PINC & (1<<PC5) )
                {
                    ende = getStopwatch2();
    
                    dauer = (ende - anfang);
                    distanz_schleife = (dauer*4)/58; //das stimmt noch nicht!
    
                    break;
                }
    
            }
    }
    
    
    int main(void)
    {
    
        initRP6Control();
        multiio_init();
        initLCD();
    
        while(1)
        {
    //Messung starten
            messung_SR_04_schleife ();
    
    //Signal auslösen
            trig_schleife();
            _delay_ms(50);
    
    //Werte ausgeben
    
            writeString("anfang:  ");
            writeIntegerLength(anfang, DEC, 4);
    
            writeString("  ende:  ");
            writeIntegerLength(ende, DEC, 4);
    
             writeString("  dauer:  ");
            writeIntegerLength(dauer, DEC, 4);
    
            writeString("  distanz:  ");
            writeIntegerLength(distanz_schleife, DEC, 4);
            writeChar('\n');
            mSleep(200);
    
        }
    
        return 0;
    }
    der code läuft einmal durch und gibt vier mal "0000" aus. Ich habe es bereits mit zeitmessung mit stopwatch zu ergründen versucht, danach bleibt der code in der " if ( PINC & (1<<PC5) )" abfrage hängen...


    Habe ich einen logischen fehler eingebaut, stimmt die reihenfolge der programmteile nicht, oder ist schlicht die abfrage des ports falsch? Ich wüsste nicht wo ich noch nachlesen soll, oder was ich noch probieren kann...
    gruß inka

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hi inka,
    ja, so im Prinzip meinte ich das.

    Programm Ablauf:
    1. Lass mal zuerst zum Probieren die Funktion messung_SR_04_schleife() ganz weg.
    2. Die Portpin-Definitionen für Trig und Echo und startStopwatch2(); pack an den Anfang von Main.
    3. In der while(1)-Schleife in Main Folgendes:
    3. a. trig_schleife();
    3. b. In einer while-Schleife warten bis Echo HIGH wird
    3. c. setStopwatch2(0);
    3. d. In einer while-Schleife warten bis Echo wieder LOW wird
    3. e. dauer = getStopwatch2();
    3. f. dauer anzeigen, Distanz berechnen und auch anzeigen
    3. g. ca. 60ms warten, dann geht's mit der while(1)-Schleife von vorn los.
    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
  •  

fchao-Sinus-Wechselrichter AliExpress