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
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
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/
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.