Forum: Mikrocontroller und Digitale Elektronik RFM69 - RSSI Messung


von Hannes (Gast)


Lesenswert?

Hallo zusammen,

ich habe mal eine Frage zu den RFM69 Modulen bezüglich der RSSI Messung.
Wie kann man prinzipiell den RSSI Wert während einer Datenübertragung
auslesen? Ich kann zwar den Echtzeitwert abfragen. Aber um ein Indiz für
die Empfangsstärke zu erhalten ist das nicht wirklich brauchbar. Kann 
der Wert, bei dem ein RSSI Interrupt ausgelöst wird im Modul 
zwischengespeichert werden und nach erfolgreichem Auslesen des FIFO 
nachträglich abgefragt werden?

Vielen Dank für eure Antworten, ihr würdet mir sehr weiterhelfen.
Hannes

von rfm69 (Gast)


Lesenswert?

https://github.com/LowPowerLab/RFM69
Nach dem Empfang einfach den Wert abrufen. Geht gut.

von Hannes (Gast)


Lesenswert?

Ich schätze dann mache ich irgendetwas falsch. Der RSSI Wert wird nach 
diesem Aufruf einfach auf ein LCD Display geschrieben. Ich erhalte 
unmittelbar nach dem Auslesen des FIFOs Werte zwischen -110 - -115dB. 
Das sind dann schon die halbierten Werte. Dafür, dass die Module direkt 
nebeneinander sind, erscheint mir das einfach zu viel.
Steckt in meiner Ausleseroutine vielleicht ein Fehler?

uint8_t RSSI_value;
uint8_t Verzoegerung = 20;  // Timeout nach 20ms

//******** RSSI Wert abfragen ******
  RFM69_spi(0x2301 | 0x8000);     //RSSI Messung auslösen

  while(RFM69_spi(0x2300) & 0x02 && Verzoegerung != 0)
              // RSSI beendet wenn 1 - solange warten
  {
    _delay_ms(1);
    Verzoegerung--;
  }

  RSSI_value = RFM69_spi(0x2400);   //RSSI Wert auslesen

von Hannes (Gast)


Lesenswert?

Hat hier vielleicht noch jemand eine Idee?

von Wolfgang (Gast)


Lesenswert?

Hannes schrieb:
> Hat hier vielleicht noch jemand eine Idee?

In diesem Post wird der RSSI laufend ausgelesen, um die Sendeleistung zu 
steuern. Da sollte sich doch was abgucken lassen ;-)
https://lowpowerlab.com/2015/11/11/rfm69_atc-automatic-transmission-control/

von Morri (Gast)


Lesenswert?

Ich benutze den RFM69CW mit einem MSP430G2553. Sobald ich per Interrupt 
eine korrekte Sync-Adresse gemeldet bekomme, sende ich das Kommando zum 
Starten der RSSI-Messung. Dann warte ich auf das Ende der Messung und 
lese den Wert aus.
1
interrupt (PORT2_VECTOR) wakeup port2_interrupt(void)
2
{
3
  unsigned char rssi;
4
5
  P2IFG = 0;
6
  eint();
7
  // Während des Empfangs RSSI aufnehmen
8
  RFM69_WRITE(RFM_REGRSSICONFIG, RFM_RSSICONFIG_START);
9
  while ((RFM69_READ(RFM_REGRSSICONFIG) & RFM_RSSICONFIG_DONE) == 0) {
10
  }
11
  rssi = RFM69_READ(RFM_REGRSSIVALUE);
12
  // Warten bis Nachricht vollständig empfangen wurde
13
  while ((RFM69_READ(RFM_REGIRQFLAGS2) & RFM_IRQFLAGS2_PAYLOADREADY) != RFM_IRQFLAGS2_PAYLOADREADY) {
14
  }
15
.....

Das Ergebnis passt sehr gut zur Erwartung bei unterschiedlichen 
Entfernungen zwischen Sender und Empfänger. Auch die optimale 
Antennenlänge läßt sich gut ermitteln.

von robs (Gast)


Lesenswert?

Hol doch einfach direkt vor dem Auslesen des FIFO's den Wert aus dem 
Register, aber ohne Triggerung einer erneuten Messung. Das sollte 
nämlich der RFM bei Empfang der Preambel selbst schon gemacht haben, um 
AGC und AFC korrekt einstellen zu können.

Eine RSSI-Triggerung nach Auslesen des FIFO's ist zu spät. Da ist das 
Paket schon durch und du misst nur den RSSI auf Noise-Level.

von Lehrer (Gast)


Lesenswert?

robs schrieb:
> Hol doch einfach direkt vor dem Auslesen des FIFO's den Wert aus dem
> Register

Is schon wieder gut zwei Wochen her ..... ob das noch interessiert?

Für "FIFO's" gibt es eine tolle Seite zum Nachlesen:

http://www.deppenapostroph.info

von robs (Gast)


Lesenswert?

Wow! Ein (Be-) Lehrer!

von Tsmeey (Gast)


Lesenswert?

... mich ja!

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.