Go Down

Topic: [GELÖST] RFM12b wie kann ich ACK ausschalten (brauche Halbduplex) (Read 928 times) previous topic - next topic

windman

Mar 12, 2013, 11:32 am Last Edit: Mar 14, 2013, 09:38 am by windman Reason: 1
Hallo,

für meine zwei Arduinos habe ich zwei RFM12B Module gekauft.
Ich habe die Module ans laufen gebracht und die Arduinos Kommunizieren miteinander, leider nicht ganz wie ich es will.

Ich kriege das nicht hin, dass beide Arduinos als Transmitter UND Receiver funktionieren (Halbduplex).
Ein Arduino funktioniert als Transmitter und das andere als Receiver - nur so funktioniert das bei mir.

Ich habe gelesen, dass ich lediglich ACK ausschalten muss um das Halbduplex-Modus ans laufen zu bringen.
Leider weiß ich nicht wie ich das machen soll! Ich benutze die JeeLib Bibliothek.

Danke für Eure Hilfe!

MaFu

Sollte eigentlich kein Problem sein, in der JeeLib Bibliothek sind einige Beispiele dabei wo Senden und Empfangen zwischen zwei Arduino in beide Richtungen funktioniert.
Eigentlich ist dabei auch gar nichts besonderes zu beachten. Was macht den Dein Testprogramm. Wird eventuell permanent gesendet?
Du must eines bedenken: Halbduplex in dem Sinne gibt es nicht. Jedes Modul kann Senden und Empfangen, aber nicht gleichzeitig. Wenn also eine Seite permanent sendet, hat die andere Seite keine Chance.
_______
Manfred

windman

#2
Mar 12, 2013, 12:31 pm Last Edit: Mar 12, 2013, 12:35 pm by windman Reason: 1

Du must eines bedenken: Halbduplex in dem Sinne gibt es nicht. Jedes Modul kann Senden und Empfangen, aber nicht gleichzeitig. Wenn also eine Seite permanent sendet, hat die andere Seite keine Chance.

Und genau deswegen habe ich Halbduplex und nicht Vollduplex/Fullduplex geschrieben.
Ich habe schon die Empfang-Sende Beispiele getestet... leider immer das gleiche... alle drei Sekunden ein Arduino (das erste) sendet Testdaten, das andere (zweite) empfängt die Daten ohne Probleme.
Leider wenn das andere (zweite) versendet Daten, das erste Arduino empfängt nichts.
Ich habe auch dieses Skript ausprobiert: http://jeelabs.org/2011/05/07/rf12-skeleton-sketch/

MaFu

#3
Mar 12, 2013, 12:51 pm Last Edit: Mar 12, 2013, 02:10 pm by MaFu Reason: 1
:smiley-eek-blue: Uuups, da hatte ich wohl grad einen geistigen Hänger. Klar, mit Halfduplex meintest Du ja schon das Richtige.
Jetzt auf die Schnelle hätte ich auch keine Lösung parat. Wenn sich bis dahin noch nichts ergeben hat, kann ichs heute Abend ja mal mit meinen Modulen testen.
_______
Manfred

windman

Wenn sich bis dahin noch nichts ergeben hat, kann ichs heute Abend ja mal mit meinen Modulten testen.

Na da wäre ja prima, danke!

windmis

Wenn sich bis dahin noch nichts ergeben hat, kann ichs heute Abend ja mal mit meinen Modulen testen.

@MaFu: ich wollte nur fragen ob du das schon ausprobiert hast ... ?

MaFu

Ja, habe ich.

Ich hab mir ein kleines Testprogramm geschrieben und auf zwei Arduinos geladen. Diese haben sich dann immer gegenseitig ein Byte zugesendet. Wichtig bei dem Beispielprogramm ist, dass für den einen Arduino die Konstante FIRST (siehe Anfang des Codes) gesetzt ist, bei dem anderen Arduino muss sie auskommentiert werden. Der Arduino mit der FIRST Konstante startet im Sendemodus, der Andere im Empfangsmodus. Da im Beispiel erst nach einem Datenempfang in den Sendemodus umgeschaltet wird, muss zwingend der sendende Arduino als letzter gestartet werden.
Ist jetzt nur ein schnell zusammengeschustertes Beispiel. Aber man sieht, dass es geht, und kann darauf aufbauen.
Code: [Select]
#include <JeeLib.h>

#define FIRST

byte outData;
bool sendMode;

void setup()
{
    Serial.begin(38400);
    Serial.println("Start");

    outData = 0;

#ifdef FIRST
    rf12_initialize('T', RF12_433MHZ);
    sendMode = true;
#else
    rf12_initialize('R', RF12_433MHZ);
    sendMode = false;
#endif
}

void loop()
{
    if (sendMode)
    {
        delay(100);

        rf12_recvDone();

        ++outData;

        if (rf12_canSend())
        {
            Serial.print("Sende ");
            Serial.println(outData);

#ifdef FIRST
            rf12_sendStart('R', &outData, sizeof outData);
#else
            rf12_sendStart('T', &outData, sizeof outData);
#endif
            rf12_sendWait(0);
        }
        else
            Serial.println("Kann nicht senden!");

        sendMode = false;
    }
    else
    {
        if (rf12_recvDone() && rf12_crc == 0 && rf12_len == 1)
        {
            Serial.print("Empfangen: ");
            Serial.println(rf12_data[0]);

            sendMode = true;
        }
    }
}
_______
Manfred

windmis


Ja, habe ich.

Ich hab mir ein kleines Testprogramm geschrieben ...

Danke für Deine Hilfe, ich werde das heute Abend ausprobieren...

windman

Das Problem wurde gelöst.
Ich habe meine Module mit einem Arduino-UNO und einem Arduino-Ethernet getestet.
Bei dem zweiten gibt es Probleme mit SPI... die RFM12-Lib muss entsprechend angepasst werden, mehr Info:
http://thebillplease.net/play/fixing-arduino-ethernet-rfm12-communication/

Danke für Eure Hilfe!

Go Up