Forum: Mikrocontroller und Digitale Elektronik Amtega644a und RFM12


von Marian S. (ramsem2)


Lesenswert?

Hallo,

ich bin gerade am Zweifeln meiner Arbeit.
Mittlerweile kann ich mit meinen RFM12 Modulen kommunizieren. Soweit 
gut.
Aber,
ich möchte ein Modul dazu verwenden, die Daten von zwei anderen Modulen 
zu sammeln.

Modul1 = Auswerter

Modul1 sendet an Modul2 und Modul 3 einen Wert auf den diese reagieren. 
OK!
Modul 2 empfängt. Funktioniert!
Modul 3 empfängt. Funktioniert!

Modul1 wartet auf Empfang. Funktioniert.
Modul 2 sendet ("A\n"). Funktioniert.
Modul 1 empfängt und vergleicht ob es sich um ("A\n") handelt. hier 
hakt's

Modul 1 empfängt zwar etwas, aber dieses ist der Meinung, dass es sich 
hierbei nicht um ("A\n") handelt.

Modul 3 sendet("B\n) Funktioniert.
Modul 1 empfängt und vergleicht ob es sich um ("B\n") handelt. hier 
hakt's

Eswird zwar ebenfalls etwas empfangen, aber laut Modul 1 kein ("B\n").

Ich bin mir aber sicher, dass ("A\n") bzw. ("B\n") ausgesandt wird.

Wenn ich nämlich folgendes mach funktioniert es:

Modul 1: sendet an Modul2 dessen Startwert. Funktioniert!
Modul 2 erkennt diesen, und sendet ("A\n") aus. Funktioniert!
Modul 3 ist auf Empfang eingestellt. Funktioniert.
Modul 3 empfängt das ("A\n). somit funktioniert es und ich kann sicher 
sagen, dass das richtige gesendet wird.

Zusammengefasst lässt sich sagen, wenn ich etwas sende, und dann auf 
empfang umstelle, wird das empfangene nicht richtig erkannt.

Was kann daran schuld sein?

Noch einen schönen Abend

von Christian K. (the_kirsch)


Lesenswert?

Zeig doch mal deinen Quellcode.

Haben die Module 2 und 3 bis auf den unterschied, das sie jeweils auf 
einen anderen "Startwert" reagieren den gleichen Code?

von Marian S. (ramsem2)


Lesenswert?

ja, haben sie

von Marian S. (ramsem2)


Lesenswert?

So sieht der Sende & EmpfängerCode aus

void rf12_txdata( char *data, unsigned char number)
{  unsigned char i;
  rf12_trans(0x8238);      // TX on
  rf12_ready();
  rf12_trans(0xB8AA);
  rf12_ready();
  rf12_trans(0xB8AA);
  rf12_ready();
  rf12_trans(0xB8AA);
  rf12_ready();
  rf12_trans(0xB82D);
  rf12_ready();
  rf12_trans(0xB8D4);
  for (i=0; i<number; i++)
  {    rf12_ready();
    rf12_trans(0xB800|(*data++));
  }
  rf12_ready();
  rf12_trans(0x8208);      // TX off
}

void rf12_rxdata( char *data, unsigned char number)
{  unsigned char i;
  rf12_trans(0x82C8);      // RX on
  rf12_trans(0xCA81);      // set FIFO mode
  rf12_trans(0xCA83);      // enable FIFO
  for (i=0; i<number; i++)
  {  rf12_ready();
    *data++=rf12_trans(0xB000);
  }
  rf12_trans(0x8208);      // RX off
}

von Christian K. (the_kirsch)


Lesenswert?

Marian S. schrieb:
> for (i=0; i<number; i++)
>   {    rf12_ready();
>     rf12_trans(0xB800|(*data++));
>   }
>   rf12_ready();
>   rf12_trans(0x8208);      // TX off

Da fehlen noch zwei Dummy Bytes. Der RFM12 hat einen 16 Bit breiten 
FIFO,du schaltest den Sender aus, aber es können noch Daten im FIFO 
sein, die noch nicht gesendet sind.

daher:
1
    for (i=0; i<number; i++) {
2
    rf12_ready();
3
        rf12_trans(0xB800|(*data++));
4
    }
5
    rf12_ready();
6
    rf12_trans(0xB800); // Dummy 1
7
    rf12_ready();
8
    rf12_trans(0xB800); // Dummy 2
9
    rf12_ready();
10
    rf12_trans(0x8208);      // TX off
Siehe meinen Beitrag hier: 
Beitrag "Re: Checksumme RFM12"


Was passiert denn wenn du zuerst B abfragst, und dann A.
Vielleicht schaltet B nicht schnell genug wieder in den Empfangsmodus 
um, nach dem es die Nachricht von A bekommen hat, die nicht für ihn 
bestimmt war.

: Bearbeitet durch User
von Marian S. (ramsem2)


Lesenswert?

Schönen Dank,

habe die Änderung so wie vorgeschlagen gemacht. Keine Veränderung.

Dass zuerst B und dann A senden ist egal, ich merke ja dass etwas 
ankommt.

Überhaupt geht mittlerweile etwas nicht.

Zur Zeit ist es so, dass ich bei der Empfängerplatine genau einmal etwas 
empfange und es ist dass, was es sein soll. Ab dem zweiten mal 
empfangen, bekomme ich zwar etwas, aber wenn ich es dann mit dem Soll 
vergleiche, stimmt es nicht!

Irgendwo muss da ja ein größerer Fehler liegen. Bitte um Mithilfe!

von Michael U. (amiga)


Lesenswert?

Hallo,

Christian K. schrieb:
> Da fehlen noch zwei Dummy Bytes. Der RFM12 hat einen 16 Bit breiten
> FIFO,du schaltest den Sender aus, aber es können noch Daten im FIFO
> sein, die noch nicht gesendet sind.

es hat sich zwar mit den Dummy Bytes irgendwie eingebürgert, richtig 
wäre aber, abzufragen, ob der Sender fertig ist, müßte Bit 6 im 
Statusbyte sein, FIFO Empty.

Gruß aus Berlin
Michael

von Christian K. (the_kirsch)


Lesenswert?

Michael U. schrieb:
> es hat sich zwar mit den Dummy Bytes irgendwie eingebürgert, richtig
> wäre aber, abzufragen, ob der Sender fertig ist, müßte Bit 6 im
> Statusbyte sein, FIFO Empty.

Und genau das habe ich in meinem verlinkten Beitrag auch erwähnt.

von Marian S. (ramsem2)


Lesenswert?

Ich meine, den schuldigen gefunden zu haben.

Die Empfängerplatine dürfte an einem Defekt leiden. Diese ist etwas 
anders aufgebaut, sie hat weitere Anschlüsse. Unter anderem an eine 
serielle Schnittstelle.

Danke für die Hilfe

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.