- Labornetzteil AliExpress         
Ergebnis 1 bis 10 von 10

Thema: RP6: Probleme mit I2C und move

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter-Spezialist Avatar von -schumi-
    Registriert seit
    30.12.2009
    Ort
    Wasserburg am Inn / Bayern
    Alter
    30
    Beiträge
    449

    RP6: Probleme mit I2C und move

    Hallo zusammen,

    ich baue gerade eine Bibliothek für den Raspberry Pi, die ähnliche Funktionen wie die für das M32 bietet, um den RP6 steuern zu können.

    Für die Base habe ich das I2C-Slave-Beispielprogramm genommen. Wenn ich jetzt mit dem Raspi über I2C z.B. den Befehl für MoveAtSpeed(30, 30) schicke, dann macht der Robby das auch ganz brav.

    Die Move() und Rotate() Funktionen gehen dagegen nicht. Die Ketten fahren nur ganz kurz an bleiben dann wieder stehen.

    Das hier ist meine move-Funktion:
    Code:
    void rp6rpi_move (char desired_speed, char dir, unsigned int distance)
    {
        char buffer[] = {0, CMD_MOVE, desired_speed, dir, (distance>>8)&0xFF, distance&0xFF};
        rp6rpi_write(buffer);
    }
    Dazu gehört noch:
    Code:
    //Direction:
    #define FWD 0
    #define BWD 1
    #define LEFT 2
    #define RIGHT 3
    Und aufrufen tu ich die hiermit:
    Code:
    int main()
    {
        rp6rpi_openConnection();
        rp6rpi_move(60, FWD, 300);
        rp6rpi_closeConnection();
        return 0;
    };
    Warum funzt das nicht? Fehlt Irgend ein Watchdog zeuch oder sowas? Power On? Interrupt?

    Viele Grüße
    -schumi-

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Es kann daran liegen, dass die Bewegung noch andauert, während deine main mit deinem Gsamtprogramm schon abbricht.
    Mach mal eine Endlosschleife vor return.
    Du must auch auf den INT0 reagieren: Siehe task_checkINT0();
    Gruß
    Dirk

  3. #3
    Erfahrener Benutzer Roboter-Spezialist Avatar von -schumi-
    Registriert seit
    30.12.2009
    Ort
    Wasserburg am Inn / Bayern
    Alter
    30
    Beiträge
    449
    Also die Endlosschleife alleine reicht noch nicht..

    Das mit dem tast_checkINT0() hab ich so verstanden:

    Jedes mal wenn die Base die INT0-Leitung auf high setzt, möchte die dass der Master die ersten 3 Register (I2C_REG_STATUS1, I2C_REG_STATUS2, I2C_REG_MOTION_STATUS) ausliest?

    Ist das richtig?

    Und ist die INT0-Leitung mit Open-Collector-Ausgängen mit Pullups realisiert? (Damit jeder einen Interrupt auslösen kann. Währe wichtig zu wissen für den Pegelwandler)

    Viele Grüße
    -schumi-

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Nein, das ist ein normaler Portpin mit einem 10 kOhm PULLDOWN.
    Gruß
    Dirk

  5. #5
    Erfahrener Benutzer Roboter-Spezialist Avatar von -schumi-
    Registriert seit
    30.12.2009
    Ort
    Wasserburg am Inn / Bayern
    Alter
    30
    Beiträge
    449
    Und wenn jetzt die M32 einen Interrupt auslösen möchte? Gibts nen Datencrash und die Base bekommts nicht mit?!

    Oder wird der Pin entweder auf Eingang (mit Pulldown = low) oder Ausgang high und niemals Ausgang low geschalten?

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hardware:
    Am XBUS (Pin 8 ) werden im ganzen RP6-System je ein Portpin der Platinen zusammen geführt:
    Base -> PA4
    M32 -> PD2
    M128 -> PE5

    D.h.: Natürlich kann es da zu Konflikten kommen.

    Software:
    Ein System (Base, M32 oder M128 ) kann nur als Ausgang den IRQ auslösen, die anderen Systeme müssen den Portpin auf Eingang schalten. Das System, was einen IRQ auslöst, ist ein I2C-Slave, denn der will ja dem Master sagen, dass Daten anliegen. Dazu zieht er den XBUS Pin 8 auf Highpegel. Im RP6Base-Slave-Programm passiert das in der Funktion signalInterrupt() und darin mit dem Makro extIntON. Umgekehrt wird der Interrupt gelöscht mit clearInterrupt() bzw. dem Makro extIntOFF.
    Die Makros schalten einfach PA4.

    Die M32 (oder deine Platine) als Master bekommt das Signal über einen Eingangspin und muss dann darauf reagieren (z.B. über den I2C-Bus Daten übernehmen...).
    Geändert von Dirk (16.06.2012 um 20:50 Uhr)
    Gruß
    Dirk

Ähnliche Themen

  1. Antworten: 4
    Letzter Beitrag: 01.09.2010, 12:34
  2. per TV-remote ein "move" programmablauf auslösen..
    Von carlitoco im Forum Robby RP6
    Antworten: 4
    Letzter Beitrag: 01.04.2008, 20:59
  3. Probleme mit Op-Amp
    Von Xtreme im Forum Elektronik
    Antworten: 6
    Letzter Beitrag: 30.07.2007, 17:03
  4. pwm Probleme
    Von fatjoe im Forum PIC Controller
    Antworten: 0
    Letzter Beitrag: 01.05.2007, 11:35
  5. Probleme mit den AVR´s
    Von mcmonkey im Forum AVR Hardwarethemen
    Antworten: 6
    Letzter Beitrag: 23.02.2005, 19:21

Berechtigungen

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

Solar Speicher und Akkus Tests