-

+ Antworten
Seite 2 von 2 ErsteErste 12
Ergebnis 9 bis 14 von 14

Thema: RP6 Master-Slave Einstellung

  1. #9
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    30
    Beiträge
    1.509
    @Mac80:
    Zu dem TSL Code.
    Erstmal glaube ich das da ein paar Klammern in Deiner task_TSL nicht so ganz richtig gesetzt sind.
    Eine if Bedingung ohne klammer führt nur genau EINE direkt darauf folgende Zeile aus.
    Die Einrückung spielt in C anders als in Python keine Rolle

    Und was if(channel == 3) da überhaupt zu suchen hat ist mir auch nicht ganz klar.

    Also strukturier es doch zunächst etwas einfacher und versuch erst danach es so zu machen
    wie es für die SRFs gelöst wurde.

    Du musst ja nicht die requestedDataReady Funktion verwenden.
    Das ist nur um mehr Dinge nebenläufig erledigen zu können eingeführt worden.
    Es geht auch normal blockierend.

    Im Beispiel RP6Base_I2CMaster_04.c siehst Du wie man beide Arten auch miteinander mischen kann.

    Dann reduziert sich ein Zugriff auf so einen Sensor z.B. auf


    Code:
    #define PCF8591_4LDRS_ADR  0x90
    
    /**
     * Read 4x PCF8591 LDRs - we do not take advantage of the method we use for
     * the SRF Sensors above!
     */
    void task_ext_LDRs(void)
    {
        if(getStopwatch2() > 200) 
        {
            I2CTWI_transmitByte(PCF8591_4LDRS_ADR, 0b01000100 );  // 64 + 4); 
            
            uint8_t results[6];
            I2CTWI_readBytes(PCF8591_4LDRS_ADR,results,5);
            // Byte 0 contains last conversion result - thus we skip it and
            // begin with results[1]:
            writeString_P(" | LDR1:"); writeInteger(results[1], DEC); 
            writeString_P(" | LDR2:"); writeInteger(results[2], DEC); 
            writeString_P(" | LDR3:"); writeInteger(results[3], DEC); 
            writeString_P(" | LDR4:"); writeInteger(results[4], DEC); 
            writeChar('\n');
            setStopwatch2(0);
        }
    }
    Hier ein PCF8591 4 Kanal ADC auslesen - musst Du natürlich noch an den Sensor anpassen.
    Probiers doch erstmal so.

    MfG,
    SlyD

  2. #10
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    30
    Beiträge
    1.509
    Jetzt noch kurz eine Vermutung warum Du oben mit der Lib auf dem M32 Probleme hast.
    Du hast da einfach nicht bedacht das die RP6Control_I2CMasterLib mit eingebunden ist.
    Der Code gehört natürlich mit zum Programm!

    #define INT0_STATUS_CHECK 0

    und


    #define MEASURE_US_LEFT_LOW 0

    sind hier beide auf derselben Request ID.
    --> Schlecht.
    Also bitte alle Deine eigenen request IDs um 1 erhöhen.


    Dann noch folgendes aus einem der Beispielprogramme lesen:

    Code:
    /**
     * The I2C_requestedDataReady Event Handler is now a lot smaller. 
     * It is free for your own request routines. 
     * You can put them in the Block of the if condition.
     * (similar to the RP6 Base Example programs...)
     */
    void I2C_requestedDataReady(uint8_t dataRequestID)
    {
        // We need to check if this is an INT0 Request from the Robot Base unit.
        // The Function call inside the if condition returns true if it was an
        // interrupt request, so we have to negate it here and if it was NOT
        // an interrupt request from the Robot base we can check any other sensors
        // from which you may have requested data...
    
        if(!checkRP6Status(dataRequestID)) 
        {
            // Here you can Check other sensors/microcontrollers with their own
            // request IDs - if there are any... 
        }
    }


    Dein Code gehört also eigentlich in die If Bedingung rein.
    Nicht davor.
    Das alleine wäre aber nicht so schlimm, problematischer
    ist da schon das mit der doppelt belegten request ID.

    Das kommt sich natürlich in die Quere da ja beides gleichzeitig läuft...



    Ob das das einzige Problem ist oder noch an anderer Stelle irgendwas nicht stimmt habe ich jetzt nicht genauer untersucht.
    Aber ändere erstmal das und teste es dann nochmal.

    Hattest Du am Slave Code von der RP6Base irgendwas geändert?
    (Ich frage nur weil Du den Code hier gepostet hattest, auf den ersten blick sieht der unverändert aus)

    MfG,
    SlyD

  3. #11
    Neuer Benutzer Öfters hier
    Registriert seit
    04.09.2011
    Ort
    Hannover
    Beiträge
    9
    @SlyD

    Ja, der Slave Code ist nur um ein paar Zeilen erweitert worden und evtl. waren da noch die Reste vom Test Code (SRF im Slave auslesen - das habe ich ja nun verworfen).
    Danke - die "Request ID 0" Doppeltvergabe habe ich übersehen. Das werde ich nochmal testen und bescheid geben ob es daran lag. Die if-Bedingung ist mir leider nicht so gut gelungen (garnicht), da ich ein wenig von den Herstellangaben irritiert war. Ich habe die nächsten Tage noch mal vor, eine abgespeckte Version vom I2C Slave Read (nur der TSL2561) zu schreiben, in der Hoffnung ein paar Daten zu erhalten.

    Das macht mir jetzt wieder Hoffnung.

    @RolfD
    Ich habe testweise schon mal probiert die Libs von Arduino zu verwenden. Da muss man jede Menge Header Dateien mit einbinden, um einen Haufen Fehlermeldungen zu verarbeiten. Das Beste in diesem Fall wäre, alle Libs von Arduino in das entsprechende Verzeichnis zu kopieren. Da gibt es auch ein paar doppelte Definierungen eines Typs und ein Haufen anderer Fehlermeldungen. Das ist aber ein lohnendes Ziel, die Libs von Arduino zu importieren. Das werde ich mal am Wochenende austesten.

    Vorzugsweise werde ich den TSL in das schon vorhandene Gerüst im RP6 ein zu binden versuchen. Danach geht es Schritt für Schritt weiter.

    Ich danke euch beiden.

    Gruß
    Mac80

  4. #12
    Neuer Benutzer Öfters hier
    Registriert seit
    04.09.2011
    Ort
    Hannover
    Beiträge
    9
    @SlyD

    Hallo, du hattest recht. Als ich die ID angepasst hatte, funktionierte der Ablauf absturzfrei. Die SRF Anweisung habe ich dann noch in die if Bedingung gesetzt und siehe da: Es funktionierte, wie es wohl sollte.
    Ich habe weiterhin noch die requestedDataReady Funktion verwendet. Hier noch ein kurzer Auszug von der Terminalausgabe:

    Read Sensor Values:
    PL:000 | PR:000 | VL:000 | VR:000 | DL:000 | DR:000
    DSTL:00001 | DSTR:00001
    LSL:0971 | LSR:0963 | MCL:0000 | MCR:0000 | BAT:0748 | AD0:0956 | AD1:0949
    | SRF_M: 146 cm |
    SRF_L: 34 cm

    Read Sensor Values:
    PL:000 | PR:000 | VL:000 | VR:000 | DL:000 | DR:000
    DSTL:00001 | DSTR:00001
    LSL:0967 | LSR:0960 | MCL:0000 | MCR:0000 | BAT:0748 | AD0:0953 | AD1:0946
    |tSRF_R: 53 cm | | SRF_M: 146 cm |

    Read Sensor Values:
    PL:000 | PR:000 | VL:000 | VR:000 | DL:000 | DR:000
    DSTL:00001 | DSTR:00001
    LSL:0967 | LSR:0960 | MCL:0000 | MCR:0000 | BAT:0748 | AD0:0953 | AD1:0946
    SRF_L: 28 cm |tSRF_R: 53 cm |

    Read Sensor Values:
    PL:000 | PR:000 | VL:000 | VR:000 | DL:000 | DR:000
    DSTL:00001 | DSTR:00001
    LSL:0980 | LSR:0968 | MCL:0000 | MCR:0000 | BAT:0748 | AD0:0960 | AD1:0953
    | SRF_M: 146 cm |
    SRF_L: 33 cm

    Read Sensor Values:
    PL:000 | PR:000 | VL:000 | VR:000 | DL:000 | DR:000
    DSTL:00001 | DSTR:00001
    LSL:0893 | LSR:0894 | MCL:0000 | MCR:0000 | BAT:0748 | AD0:0888 | AD1:0882
    |tSRF_R: 53 cm | | SRF_M: 14 cm |

    [RP6BOOT]

    [READY]


    Wie man sieht, werden die Messergebnisse nur alle 2 Aufrufe von "Read Sensor values" mitgeliefert. Da könnte man noch eine Pause integrieren, ist aber nicht so schlimm. Aber was hier definitiv fehlt sind die ACS Ausgaben, welche ich eigentlich auch bekommen sollte.
    Der Slave Code ist diesmal der original Code ohne Erweiterungen und der Master Code nur etwas erweitert/ korrigiert.

    Das sollte ich aber hoffentlich dieses Wochenende geklärt haben.

    Gruß
    Mac80

  5. #13
    Erfahrener Benutzer Fleißiges Mitglied Avatar von Filou89
    Registriert seit
    24.12.2010
    Ort
    Thun, Switzerland
    Alter
    25
    Beiträge
    113
    Hallo zusammen,
    Ich schliesse mich nun mal diesem Thema an, da es auch um I2C Master-Slave Einstellungen geht.
    Dazu mal die Hardware:
    1 RP6 Base, 1 RP6 M32, 1 PR6 M256, 1 Atmega8, 1 Attiny44

    Idee:
    Am Attiny44 sind 2 Servos und ein Sharp angeschlossen. Diese dienen als 3D- Distanz-Scanner. Siehe hier
    Der Atmega8 steuert einen Schrittmotor, Display eine serielle Schnittstelle. Zudem kann er Helligkeit und Temperatur messen.
    Die M32 steuert nebst Beeper einige Servos an und liest ein ADC-Tastenfeld aus.
    Die M256 sollte das Gehirn (Master) bilden und alle infos sammeln und übertragen / auf die SD-Karte speichern.
    RP6 Base ist das Fahrgestell von alldem.

    Als Bus möchte ich den I2C verwenden.

    Fragen:
    Gibt es zur M32 eine bestehende I2C Slave Bibliothek?
    Würde es Probleme verursachen, die M32 und M256 mit den vorhandenen LIB's als Master zu betreiben?
    Muss ich noch irgendwo Pull-Up's anbringen?

    Für eure Antworten dankt euch
    Filou

  6. #14
    Erfahrener Benutzer Roboter-Spezialist Avatar von RolfD
    Registriert seit
    07.02.2011
    Beiträge
    414
    Hallo Filou,
    zu deinen Fragen...
    Es gibt im Projekt RP6 Remotrol 1.3 unter RP6 Remotrol 1.3\Firmware\M128 - Master\ ein M32 Slave.
    Ja es würde Probleme machen 2 Master auf dem i2c gleichzeitig laufen zu lassen da hier für eine Vorrangsteuerung bzw. Busarbitierung nötig ist, die in der RP6Lib so nicht implementiert ist. Je einen der beiden wirst du aber als Master zum Laufen bekommen.
    Nein du brauchst keine Pullups... die Prozessoren bringen schon Pullups mit und auf dem Baseboard sind auch welche. Siehe auch i2c Spezifikation bei NPX oder für TWI bei Amtel.
    LG Rolf
    Sind Sie auch ambivalent?

+ Antworten
Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. Master & Slave AVR
    Von Tonyy im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 30.09.2010, 21:14
  2. Slave-Master-Slave übertragung geht nicht
    Von Dämmi im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 16
    Letzter Beitrag: 26.11.2008, 01:08
  3. I²C Master und Slave, Problem bei Master Reset
    Von ACU im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 01.03.2007, 12:07
  4. LPT-Master <=> SPI <=> AVR-Slave
    Von BlueNature im Forum Elektronik
    Antworten: 2
    Letzter Beitrag: 17.04.2006, 21:38
  5. 2 x I2C Master und 1 x Slave
    Von Anubisbot im Forum Elektronik
    Antworten: 2
    Letzter Beitrag: 29.12.2005, 14:27

Stichworte

Berechtigungen

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