Guten Tag,
Ich bin aktuell an einem Punkt wo ich nicht weiterkomme und hoffe ihr
könnt mir helfen.
Folgende Ausgangssituation: Ich möchte in Zukunft ein paar Projekte
umsetzen in denen ich Daten über Funk senden möchte. Daher habe ich mich
in den letzten Wochen damit auseinandergesetzt und habe mir vor ca einem
Monat RFM12B Module gekauft
(https://www.amazon.de/gp/product/B00BTCUMP6/ref=ppx_yo_dt_b_asin_title_o09_s00?ie=UTF8&psc=1).
Genau genommen die 868 Mhz Version.
Dazu folgende Antenne, da die Module keine eigene haben, wenn ich das
richtig festgestellt habe?! Vielleicht könnte mich jemand bei diesem
Punkt noch bestätigen oder widerlegen?
(https://www.amazon.de/gp/product/B07DLR2BN2/ref=ppx_yo_dt_b_asin_title_o02_s03?ie=UTF8&psc=1)
Als Mikrocontroller dient mir momentan ein Elegoo Uno R3 und ich
programmiere zum testen aktuell mittels Arduino IDE.
Jetzt bin ich seit ca 2,5 Wochen daran die Module dazu zu bringen Daten
zu übertragen. Ich habe beide aktuell an den selben Mikrocontroller
angeschlossen und nutze keine Hardware SPI.
Angeschlossen habe ich sie wie hier
(https://lowpowerlab.com/2012/12/28/rfm12b-arduino-library/) im zweiten
Schema zu sehen, also die Version mit den 4.7k Widerständen. In meinem
Fall benutze ich jedoch 5.1k da ich nichts näheres hier hatte. Die 10k
Widerstände sind bei mir auch 10k.
Generell habe ich versucht so viele Beispiele zu finden wie ich konnte
und habe mich bisher auch glaube ich ganz gut daran heranarbeiten
können.
Jetzt bin ich jedoch seit einigen Tagen an einem Punkt angekommen an dem
ich keine Fortschritte mehr mache.
Nach dem was ich als Feedback (IRQ und SDO) bekomme, denke ich auch dass
ich soweit fast alles richtig gemacht habe.
Der Sender scheint im Sendemodus zu sein. IRQ geht auf low sobald ich
die Nachricht geschickt habe auf senden zu schalten und bleibt dort.
Der Receiver hat IRQ durchgehend auf HIGH.
Nun versuche ich mittels 0xB8 Befehl Daten zu senden. Mit einigen 0xAA
zu Beginn oder ohne. Dann das Synchronisationsbyte 0xD4, auch mit einem
0x2D davor, wie ich es ab und zu gesehen habe, dann ein paar zufällige
Bytes als Nachricht und dann mit oder ohne ein Dummy Byte 0x00.
Zum einen geht während dessen der IRQ vom sender niemals auf HIGH. Nach
meiner Recherche sollte er auf HIGH gehen während er sendet und wieder
auf LOW sobald er bereit ist neue Daten zu senden, richtig?
Der Receiver ist ebenfalls unberührt von der ganzen Sache. IRQ bleibt
bei ihm HIGH und wenn ich einfach versuche Datena us dem FIFO zu lesen,
kommt dann halt auch nur immer 0 bei rum.
Die Status words der beiden bringen mich auch nicht weiter. Hier meine
Referenz
(https://www.mikrocontroller.net/articles/RFM12#Status_lesen_.28Status_Read_0000.29).
Der Sender hat das Flag 15 RGIT gesetzt, sowie 13 RGUR. Was ja im
Endeffekt bedeutet dass ich Daten nachschieben kann bzw. soll.
Zudem ist Flag 8 ATS gesetzt. Hier werde ich nicht schlau raus?! Klingt
für mich aber eher positiv?
Beim Receiver siehts folgendermaßen aus:
Bit 9 FFEM, bedeutet FIFO Empty, also keine empfangen Daten?!
Bit 8 RSSI, beduetet die Signalstärke ist über dem eingstellten Limit.
Klingt ja grundsätzlich nicht so toll. Ich habe versucht bei der
Initialisierung des Empfängers mit dem Code 9xxx zu spielen. Und mal auf
0x90 85 gestellt. Hat aber nichts genützt. Generell kann ich hierzu auch
leider keine weiteren Infos finden.
Bit 7 DQD, bedeutet data quality detector. Keine Ahnung ob das gut oder
schlecht ist?
Bit 6 CRL, bedeutet clock recovery locked. Auch hier keine Ahnung ob das
gut oder schlecht ist!?
Generell sollte noch gesagt sein: Ich bin leider kein Elektrotechniker
oder ähnliches. Mein Wissen ist eine Mischung aus Physik in der
Mittelstufe und Hobbymäßig mit Mikrocontrollern basteln. Also bitte
lyncht mich nicht wenn ich möglicherweise ziemlich simple Dinge nicht
verstehe oder übersehe.
Ich bin aber gerne bereit neues zu lernen, darum mach ich das ja!
Also falls möglich bitte immer lieber die Variante für Dummies ;)
Hier mein Code:
Florian S. schrieb:> Dazu folgende Antenne, da die Module keine eigene haben, wenn ich das> richtig festgestellt habe?! Vielleicht könnte mich jemand bei diesem> Punkt noch bestätigen oder widerlegen?
Kann ich einerseits bestätigen (die Module haben keine eigene Antenne),
andererseits: man braucht auch echt keine kaufen. Ein paar Zentimeter
stinknormaler Schaltdraht sind Antenne genug. Damit kann man Reichweiten
von 100m und mehr erzielen...
> Als Mikrocontroller dient mir momentan ein Elegoo Uno R3 und ich> programmiere zum testen aktuell mittels Arduino IDE.
Das ist der primäre Fehler.
> Jetzt bin ich seit ca 2,5 Wochen daran die Module dazu zu bringen Daten> zu übertragen.
Du hättest die Zeit besser genutzt, indem du erstmal eine zuverlässige
Kommunikation zwischen µC und RFM etabliert hättest.
> Nach dem was ich als Feedback (IRQ und SDO) bekomme, denke ich auch dass> ich soweit fast alles richtig gemacht habe.
Nö, mit an Sicherheit grenzender Wahrscheinlichkeit nicht.
> Zum einen geht während dessen der IRQ vom sender niemals auf HIGH.
OMG. Einmal, wirklich nur einmal: DB lesen hätte dir diese Peinlichkeit
von Aussage erspart...
Um dir das mal in einfachen Worten klarzumachen: der IRQ der RFM ist
erstens Low-aktiv und zweitens ein "Level-IRQ". D.h.: dein RFM ist
dauerhaft unzufrieden mit seiner Ansteuerung. Du hast auf irgendeine
IRQ-Anforderung (der RFM hat MEHRERE, aber nur einen IRQ-Ausgang)
nicht korrekt reagiert. Deswegen geht der Pegel niemals wieder auf High
(also in den INAKTIVEN Zustand). Und deswegen kannst du auf weitere
Änderungen seines Zustands garnicht mehr reagieren, weil er schon nicht
mehr in der Lage ist, sie dir überhaupt zu signalisieren, denn sein
Interrupt-Ausgang ist ja schon lange LOW also AKTIV, bloß du
Dumpfbacke hast das bisher nicht korrekt behandelt...
Fazit: Typischer Arduidiot, der niemals ein Datenblatt auch nur zum
Arschabwischen benutzt, geschweige denn, dass er es lesen würde...
Hallo,
c-hater schrieb:> azit: Typischer Arduidiot, der niemals ein Datenblatt auch nur zum> Arschabwischen benutzt, geschweige denn, dass er es lesen würde...
ein typischer Trottel, der unbedingt schlau sein will und sich mal
wieder nicht benehmen kann oder was???
Man kann den RFM12 problemlos komplett ohne Interrupt per Polling
bedienen.
Bitbanging ist für die Ansteuerung auch durchaus sinnvoll, ich weiß zwar
nicht, ob die aktuellen RFM12B sich besser benehmen, die alten
RFM01/02/12 machten damals mit Hardware-SPI gern seltsame Probleme.
Ich habe aus alten Zeiten nur noch eine Empangsroutine rumliegen, die
ich mal in die ArduinoIDE getragen hatte:
Die RFM12.c
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/pgmspace.h>
4
#include "global.h"
5
#include "RFM12.h"
6
7
void RFM12_send_cmd(unsigned int command)
8
{
9
unsigned char i;
10
RFM12_PORT &= ~(1<<RFM12_CS); // CS auf L
11
12
for (i=0; i<16; i++)
13
{
14
if (command & 0x8000)
15
{
16
RFM12_PORT |= (1<<RFM12_SDI); // DATA auf H
17
}
18
else
19
{
20
RFM12_PORT &= ~(1<<RFM12_SDI); // DATA auf L
21
}
22
asm("nop");
23
RFM12_PORT |= (1<<RFM12_SCK); // CLK auf H
24
asm("nop");
25
asm("nop");
26
RFM12_PORT &= ~(1<<RFM12_SCK); // CLK auf L
27
command = (command << 1); // nächstes Bit nach oben
28
}
29
RFM12_PORT |= (1<<RFM12_CS); // CS auf H
30
}
31
32
void RFM12_init(void)
33
{
34
RFM12_PORT = (1<<RFM12_CS); // PullUp ein / Ausgang H
Michael U. schrieb:> Man kann den RFM12 problemlos komplett ohne Interrupt per Polling> bedienen.
Das kann man tatsächlich.
Nur hat es der TO halt nicht getan, wie jeder Nichtvollidiot anhand des
OT sofort spielend leicht erkennen kann. Du hast es wohl nicht erkannt
und bist damit vollkommen am Thema vorbei...
Das war nicht: wie mache ich das mit dümmlichen und
resourcenverschwendendem Polling, sondern clever per Interrupt. Nunja:
die Antwort ist (wie immer): mach' es einfach richtig. Und um es richtig
machen zu können, muss man nunmal einfach wissen, wie sich das Teil
verhält, was man da benutzen möchte, und dazu ist nunmal eine Lektüre
des DB unverzichtbar, capisce?
Hallo,
die speziellen Eigenheiten des RFM12 sind mir momentan nicht mehr
gegenwärtig. Vor Jahren habe ich mal eines dieser Beispiele
durchexerziert und konnte damit Daten übertragen, wenn auch immer mal
wieder etwas klemmte nach längerem Testen. Aber grundsätzlich
funktioniert es. Sogar eine Fehlerkorrektur ist dabei. Wenn Du alles
liest, findest Du eine ausgereifte Version und kannst dort den Ablauf
abschauen.
Bei meinem Aufbau habe ich ebenfalls den AVR auf 5 V laufen und das
RFM12 über 2,2 kOhm an SPI angeschlossen. Ging bei mir auch ohne die 10k
sehr gut.
Beitrag "bidirektionale RS232 Funkbrücke mit RFM12"
mfG
Hallo,
c-hater schrieb:> Nur hat es der TO halt nicht getan, wie jeder Nichtvollidiot anhand des> OT sofort spielend leicht erkennen kann. Du hast es wohl nicht erkannt> und bist damit vollkommen am Thema vorbei...
ok. Dann fange ich mal an: ich würde nicht freiwillg versuchen, 2
RFM-Module als Empfänger/Sender an einen AVR zu packen, schon garnicht
im Interrupt, wenn ich nicht genau weiß, was ich da mache.
Das weiß der TO wohl nicht, da stimme ich Dir zu.
Es ist 10 jahre her, daß ich mit mit den Teilen befasst habe, da waren
die Unterlagen von HopeRF mehr als fragwürdig und die Verwandtschaft zu
den SiLabs Si4xxx hatte sich noch nicht rumgesprochen.
Das Zeug läuft huer heute noch, es macht aber vermutlich wenig Sinn, ihm
die alten AVR-ASM-Sourcen vorzuwerfen.
Christian S. schrieb:> Bei meinem Aufbau habe ich ebenfalls den AVR auf 5 V laufen und das> RFM12 über 2,2 kOhm an SPI angeschlossen. Ging bei mir auch ohne die 10k> sehr gut.
Die alten waren bis 5V, die neueren B-Typen nur noch 3,6V max.
Bei den alten brauchte man garnichts zum 5V AVR.
Gruß aus Berlin
Michael
Michael U. schrieb:> ok. Dann fange ich mal an: ich würde nicht freiwillg versuchen, 2> RFM-Module als Empfänger/Sender an einen AVR zu packen
Warum nicht? SPI ist ein Bus. Der funktioniert mit einem RFM12 genauso
wie mit zweien. Natürlich braucht man (bei Interruptsteuerung) zwei Pins
mehr für zwei. Einen SlaveSelect und einen IRQ. Ansonsten gibt es keinen
Unterschied, ob man nun nur einen oder zwei verwendet. Entweder man
weiss, was man tut, oder man weiss es halt nicht. Dagegen hilft nur
eins: LERNEN. Und das fängt an mit der Lektüre des DB.
> Das weiß der TO wohl nicht, da stimme ich Dir zu.
Das ist sehr offensichtlich so. Genau das war meine Kritik.
Hi,
danke für die Antworten. Ich habe es gerade eben endlich geschafft. Das
Modul funktioniert wie ich es möchte, es werden alle bytes übertragen.
Am Ende war es dann vor allem dieser Beitrag
(https://gobotronics.wordpress.com/2010/10/07/rfm12-programming/) der
mir geholfen hat meine restlichen Fehler zu entdecken.
Problem war hauptsächlich das ich nicht verstanden hatte, dass ich den
Transmitter für jedes Packet neu an und ausschalten musste.
Außerdem hat mir tatsächlich geholfen beide Module über einen seperaten
Mikrocontroller anzusteuern.
Hier jetzt einmal mein Code mit dem ich erfolgreich war:
Sender:
Dann würde ich gerne noch was zu Herrn c-hater sagen:
Zum einen verstehe ich diese Abneigung gegenüber Arduino nicht. Klar ist
das nicht das gleiche wie wenn man mit C oder Assembler programmiert und
sehr stark vereinfacht. Aber genau dass ist ja das schöne jeder kann
damit was machen, egal wie sehr er sich mit der Materie auskennt.
Wie ich auch geschrieben habe, benutze ich Arduino auch nur zum testen.
Wenn ich dann final die Projekte umsetze entwickle ich meistens in C,
bei kleinen Projekten spaßeshalber mit Assembler.
Das schöne an Arduino ist einfach dass man mit wenig Aufwand viel
erreichen kann. Und vor allem zum testen und ausprobieren möchte ich
nicht viel Aufwand betreiben.
Allein das ich mit einer Zeile meine Serial Monitor ansprechen kann und
Text übertragen kann, ist hier schon große Hilfe.
Wer Arduino nicht mag schön und gut, aber bitte urteile nicht über
andere die eine andere Meinung hierzu haben.
Zum Thema Datenblatt lesen. Wie ich bereits geschrieben hatte, bin ich
halt kein Elektrotechniker oder ähnliches. Ich HABE die Datenblätter
gelesen und dies nicht nur einmal, wie gesagt, habe ich jetzt fast einen
Monat gebraucht um die Module zum laufen zu bekommen und ich habe fast
20 Lesezeichen zum Thema im Firefox abgelegt.
Als "Laie" ist es für mich halt nicht immer so einfach alles zu
verstehen und es ist oft viel kompakte Info die in den Datenblättern
steht, ohne viel Kontextwissen.
Also wenn du aus dem Datenblatt direkt alles verstehst und es umsetzen
kannst, freut mich das für dich. Aber ich kann es nicht.
Ich habe diesen Forenbeitrag auch nur eröffnet, weil ich eine Woche lang
nicht mehr weitergekommen bin, OBWOHL ich weiter recherchiert habe und
keine neuen Informationen entdeckt habe.
Und am Ende waren es jetzt keine großen Veränderungen mehr, also hatte
ich es tatsächlich geschafft einiges richtig zu machen, ohne Hilfe von
anderen sondern nur mittels Lektüre. Also sei ein wenig konstruktiver
und stelle andere nicht in Frage sondern versuche ihnen zu helfen auf
die richtige Spur zu kommen. Es haben halt nicht alle den gleichen
Wissensstand wie du.
So wie in deinem erstem Beitrag der Part mit den einfachen Worten. Der
hat mir tatsächlich geholfen. Ein wenig netter formuliert und ich wäre
dir wirklich dankbar dafür gewesen.
Mit freundlichen Grüßen
Florian