Den gleichen Text aus "RFM12BP Ansteuerung" jetzt hier noch einmal:
Da es mir auch nach Monaten des Experimentierens noch nicht gelungen
ist, eine Verbindung zwischen zwei RFM12BP 868MHz-modulen herzustellen,
bitte ich um Hilfe.
Ich hätte gern ein ganz einfaches Testprogramm für RFM12BP 868MHz, um
mal den Einstieg zu schaffen.
Leider sind die Beispielprogramme (z.B von Pollin, Hopfner) teilweise in
sich widersprechend.
Zunächst noch einige allg. Fragen:
1) wird mit RXEN = `H´ der Empfangsteil eingeschaltet?
2) wird mit TXEN = `H´ der Sendeteil eingeschaltet?
Was könnte bei der angehängten Datei --Ausschnitte RFM12BP.c-- falsch
sein?
Vielen Dank.
ICh habe RFM12B und RFM12BP laufen.
Folgende Effekte bei (bei einer Arduino-NANO-HW mit Ansteuerung der
RFM12BPs über SPI) habe ich festgestellt, daß diese nicht funktionieren
(kein IRQ), sobald der AVR über einen SPI-Programmierer (bei mir DIAMEX)
gerade beschrieben wurde. Abhilfe: RFM12 für einige Sekunden komplett
abklemmen, dann Prozessor RESETTEN.
Zudem ist darauf zu achten, daß RXENAB und TXENAB, sind bei HI aktiv,
einen STROM brauchen. Laut Datenblatt 3 mA. Es ist also keine
"CMOS-Logic" Ansteuerung.
Solltest Du also Spannungsteiler vorsehen, um den 5-V Prozessor auf die
3,3 V Pegel des RFM12BP zu bringen, so ist das bei RX/TXENAB nicht
brauchbar. Hier nur ggf. eine Strombegrenzungswiderstand vorzusehen. 2k2
sind ok. In Gegenrichtug, also vom RFM zum uP sollte zudem bei der nIRQ
und bei der SDO Leitung kein "Spannungsteiler" vorgesehen sein, sondern
nur ein Serien-Rm, z.B,. 2k2.
Hast Du das System mit einem "normalen" RFM12B getestet?
Ich hoffe, das hilft weiter...
Hanns-Jürgen "Yogy" Mostert schrieb:> ICh habe RFM12B und RFM12BP laufen.
Dann werde ich mich zunächst mal an Dich halten, falls nichts dagegen
spricht.
> Hast Du das System mit einem "normalen" RFM12B getestet?
Nein. Ich habe nur die RFM12BP und stehe damit "funk-und
programmiertechnisch" noch am Anfang.
> Solltest Du also Spannungsteiler vorsehen, um den 5-V Prozessor auf die> 3,3 V Pegel des RFM12BP zu bringen.....
Verwendet wird als µC ein MSP430F1611, sodass das gesamte System mit 3V
betrieben werden kann.
Leider kann ich mich aus Zeitmangel in nächster Zeit nicht mit den
RFM12BP beschäftigen und werde mich zu gegebener Zeit wieder melden.
Hanns-Jürgen "Yogy" Mostert schrieb:> okay, frage dann mal ruhig. BTW: Hast Du ein Oszilioskop? Und hat Dein> Prozessor eine HW-SPI-Schnittstelle? Ich kenn ihn nicht...
Ja, Oszi ist vorhanden
MSP430F1611 hat HW-SPI-Schnittstelle (aber nur 8?- BIT Zeichen können
damit übertragen werden)
Wie schon mal gesagt, hätte ich besonderes Interesse an einem
funktionierenden Programmschnipsel jeweils für den Sender und den
Empfänger.
Dabei würde ich zunächst Wert auf die Initialisierung und das Senden
bzw. Empfangen eines einzelnen Zeichens legen. (analog meines im ersten
Beitrag angehängtem Programmausschnitt)
SW-SPI wollte ich beibehalten, da damit 16Bit Befehle übertragen werden
können.
Die Zeile:
if (P5IN & BIT2 == BIT2)
wurde geändert in:
if ((P5IN & BIT2) == BIT2) //prüft, ob an P5.2 H anliegt
So...zur SPI-Schnittstelle.
Natürlich überträgt die byteweise. Also werden immer 2 byte übertragen.
Vor der Übertragung nSS auf Low, danach auf Hi. Das funzt wünderbar. Bei
mir clockt die SPI mit 125 kbaud, Clock low when idle, sampling on
leading edge, MSBit first. Deine SW-Emulation sieht für mich ok aus.
Für die Initialisierung der RFM-BP sind RX-Enab und TX-Enab auf low
(also abgeschaltet) (P2.2, P2.3., wie ich Deiner Schaltung entnehme.
Ich nehme auch mal an, die Antenne ist angeklemmt (8,5 cm langer
Draht)..
Ich will Deine Init und meine nicht im einzelnen vergleichen. Ich
arbeite z.Zt. mit 9600 bd und habe auch eine andere Frequenz. Bei mir
arbeiten die Module im Halbduplex:
Grundprinzip:
nach Power-Up wird das Modul initialisiert.
Anschließend wird es in den Receive Mode versetzt.
...
Soll etwas gesendet werden, wird das Modul in den Sendemodus geschaltet,
Die Daten werden ausgesendet
Anschließend wird das Mopdul wieder in den Receive-Mode versetzt.
Bei mir geschieht das alles im Interrupt, geht aber auch mit Polling des
nIRQ-Pins.
Nun mein Sourcecode (gekürzt)
Initialisierung:
1
// Die Groesse "nr" gibt die nr. des Moduls an, da ich in der ersten
2
// Testphase zwei Module am selben uP verwendet habe.
3
// Also don't care bzw. mit 0 gleichsetzen.
4
5
voidInit_RFM12B(U8nr)
6
{
7
8
9
U16iHelp=0;
10
PortRFM12&=~(1<<RFM_POWER_RXE_0);// Schalte RX- und TX Enab auf LOW
11
PortRFM12&=~(1<<RFM_POWER_TXE_0);
12
13
Write_Word_RFM12B(0x80E7,nr);// 868 Band, TX u Fifo on, Cap
14
15
Write_Word_RFM12B(0x82D9,nr);// RX ein, DCLK aus, baseband/xtal ein
@Yogy,
zunächst vielen Dank für die Programmschnipsel, welche mir sehr geholfen
haben.
Die Funkübertragung funktioniert jetzt.
Damit ist das 1.Ziel erreicht und auch der Beweis erbracht, dass die
verwendeten Funkmodule funktionstüchtig sind.
Z. Zt. gibt es bei der Funkübertragung allerdings noch Aussetzer, aber,
so hoffe ich, dass diese sich noch beseitigen lassen.
Noch eine Frage zu den Befehlen:
// Anschließend folgen die Synchronbytes:
SPI_Config_CMD_16Bit(0xB82D);
SPI_Config_CMD_16Bit(0xB8D4);
Was soll damit bewirkt werden?
MfG
wolle g. schrieb:> Noch eine Frage zu den Befehlen:> // Anschließend folgen die Synchronbytes:> SPI_Config_CMD_16Bit(0xB82D);> SPI_Config_CMD_16Bit(0xB8D4);>> Was soll damit bewirkt werden?
Die Kombination 0x2D, 0xD4 sorgt für die "Scharfschaltung" des
FIFO-Puffers im Empfänger. Erst nachdem der Empfänger dieses
Schlüsselwort gesehen hat, beginnt er, die ankommenden Daten zu
erfassen.