Es muss zu jedem zu übertragenden Byte das Kommando 0xB8 vorher geschickt werden. Sonst weiss das RFM ja nicht, was es mit dem Byte tun soll.
Ich habe gerade eine funktionierende Funkübertragungsstrecke mit 2 RFM12 aufgebaut. Im FSK-Modus funktioniert alles bestens, ein Rechteck-Tetsignal wird einwandfrei übertragen.
Jetzt taste ich mich langsam an den Sendepuffer heran. Unklar ist trotz intensiven Studiums des Datenblattes und anderer Quellen folgende Frage:
Wenn ich per SPI mehrere Nutzbytes in den Puffer schieben möchte, muss ich dann vor jedem Byte die Sequenz &B10111000 (Transmitter Register Write Command) übertragen, oder reicht &B10111000 einmalig, gefolgt von den Nutzbytes?
Ich habe beides versucht, aber seltsamerweise bleibt der nIRQ-Pin andauernd auf 0. Irgendwann muss der Sendepuffer aber doch auch mal "satt" sein, oder? Ich habe extra eine sehr langsame Übertragungsrate gewählt (0,6 kbps), damit die SPI-Übertragung garantiert schneller geht als das "absenden" der Bytes.
Bin für Tips jeder Art dankbar!!
Es muss zu jedem zu übertragenden Byte das Kommando 0xB8 vorher geschickt werden. Sonst weiss das RFM ja nicht, was es mit dem Byte tun soll.
#ifndef MfG
#define MfG
Okay, das hatte ich vermutet, war mir aber nicht sicher. Trotzdem funktioniert irgendetwas an meinem Code nicht richtig, und ich weiß nicht was... Das Ganze soll einfach nur permanent das "Nutzbyte" 0xAA übertragen - das ist alles. nIRQ des RFM12 geht hierzu an INT0.
Hier ist mal der Code:
Das Modul geht korrekt auf Sendung und überträgt ein einziges mal die Bytes (kann man bei 0,6 kbps mit einem Empfänger hören), aber dann nichts mehr, nur noch Träger. Auch die ISR wird nicht angesprungen (zu erkennen an der LED). nIRQ bleibt auf 0, obwohl der doch 1 werden müsste, sobald die ersten 2 Bytes den internen Puffer gefüllt haben, oder?Code:$regfile = "m8def.dat" $crystal = 1000000 Ddrb.1 = 1 Portb.1 = 1 Led Alias Portb.1 Portd.2 = 1 'PullUp für INT0 Config Int0 = Falling On Int0 Tx_ready Enable Int0 Enable Interrupts Config Spi = Soft , Din = Portc.5 , Dout = Portc.2 , Clock = Portc.3 , Ss = Portc.4 Spiinit Dim A(12) As Byte Dim Flag As Bit Flag = 1 Waitms 100 '"Aufwärmpause" für RFM12 A(1) = &B10000000 '1.: Configuration Setting Command A(2) = &B10010000 A(3) = &B10000010 '2.: Power Management Command A(4) = &B00111000 A(5) = &B10100110 '3.: Frequency Setting Command (434,000 MHz) A(6) = &B01000000 A(7) = &B10011000 '10.: TX Configuration Control Command A(8) = &B00000111 ' -21dB Sendeleistung, Hub = 15 kHz A(9) = &B11000110 '4.: Data rate command (0,6 kbps) A(10) = &B10111111 A(11) = &B10111000 '11.:Transmitter Register Write Command A(12) = &B10101010 '"Nutzbyte" Spiout A(1) , 10 Do If Flag = 1 Then Spiout A(11) , 2 'Daten an Puffer übertragen Spiout A(11) , 2 Flag = 0 End If Loop Tx_ready: Toggle Portb.1 Flag = 1 Return
Weiß irgendjemand, wo mein Fehler liegt??
Hallo Sauerbruch,
guck mal hier:
http://www.gerold-online.de/cms/whee...elemetrie.html
Günter
Moin Günter,
das sieht nach einem ziemlich interssanten Link aus, den ich morgen nach dem Dienst mal genauer untrer die Lupe nehmen muss. Endlich mal was nicht in C Da auch der Schaltplan dabei ist, müssten sich eine Menge Anregungen rausziehen lassen.
Allerdings muss ich mich jetzt mal mit ´ner Frage outen, die mich schon lange beschäftigt. Man liest immer, dass "Subs" den Vorteil haben, Variablen "mitzunehmen". Da dieser Code ja voller Subs steckt, würde ich das gerne einmal richtig verstehen. Ich kann doch eigentlich an jeder beliebigen Stelle, d.h. auch in einem GOTO-Abschnitt, einer ISR oder sonstwo Variablen aus der Hauptschleife verändern - wozu muss ich sie denn "mitnehmen"?
Ansonsten erstmal vielen Dank für den Link!!
Daniel
Hallo Sauerbruch,
schau dir dazu erstmal die ByRef und ByVal Geschichte an.
Man kann Variablen in einer Sub nämlich ByRef oder ByVal übergeben.
Im Accessforum habe ich das mal so erklärt:
In deiner aufrufenden Hauptschleife ist eine Variable namens "Kiste Bier".
Wenn diese ByVal übergeben wird, wird eine Kopie dieser Kiste Bier an die Sub oder Funktion "DieDurstigenProgrammierer" übergeben.
Was die dort damit machen kann dir egal sein, dir bleibt dein Bier in der Hauptschleife.
Wenn die Kiste ByRef übergeben wird, wird nur ein Zettel übergeben mit der Beschreibung wo deine Bierkiste steht.
Was die Funktion DieDurstigenProgrammierer mit deiner Variable (Bierkiste) in der Hauptschleife anrichten kannst du dir ausmalen
Günter
Noch ein Hinweis, wenn viele Subs/Functions/übergebene Variablen verwendet werden:
Aufpassen, dass in Bascom die Werte für Softstack/HWStack/Framesize nicht zu klein sind. Sonst läuft schnell mal was über.
#ifndef MfG
#define MfG
und daß standardmäßig byref übergeben wird, also die Variablen in der Haupschleife verändert werden können.
Erstmal vielen Dank für diese handfesten Vergleiche
So ganz verstaden hab ich die Vorteile aber noch nicht. Wahrscheinlich stehe ich gerade auf der (Bier)leitung:
[grübel]und daß standardmäßig byref übergeben wird, also die Variablen in der Haupschleife verändert werden können.
Wenn ich eine Variable verändern will, die auch in der Hauptschleife verwendet wird, kann ich das in der Sub nicht einfach á la "Bierkiste = Bierkiste+1" tun? Der neue Wert müsste dann doch auch in der Hauptschleife verwendet werden, oder??
[/grübel]
Wenn du eine Variable deklarierst ist sie Public. Das heißt du kannst sie auch in der Sub verwenden, ohne sie irgendwie übergeben zu müssen. Wenn du den Wert in der Sub änderst ist er überall verändert. Das hört sich im ersten Moment cool an, jedoch birgt das große Gefahren!
Stell dir vor, im Hauptprogramm steht die Bierkiste und du rufst die Sub auf. Dort wird Code abgearbeitet und dann auf die Variable Bier zugegriffen, jedoch das Bier ist leer! Das gibts doch nicht, beim Aufruf der Sub war die doch noch voll!
Was ist passiert? Inzwischen war der Interrupt da, der ebenfalls vom Bier erfahren hat und hat es leergesoffen.
Soll heißen, du kannst nicht sicher sein, daß andere Programmteile die Variable in der Zwischenzeit nicht verändert haben. Wird der Wert aber byval an die Sub übergeben, kommt der Wert sicher so an der Sub an, wie er im Moment des Subaufrufs war. Beides hat Vorteile, man muß sich aber über die Unterschiede klar werden, sonst baut man sich ganz fiese Fehler ein!
Lesezeichen