-         

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 24

Thema: Gepuffertes Senden mit RFM12

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705

    Gepuffertes Senden mit RFM12

    Anzeige

    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!!

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    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

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    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:
    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
    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?

    Weiß irgendjemand, wo mein Fehler liegt??

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.05.2007
    Beiträge
    329
    Hallo Sauerbruch,

    guck mal hier:

    http://www.gerold-online.de/cms/whee...elemetrie.html

    Günter

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    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

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.05.2007
    Beiträge
    329
    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

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    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

  8. #8
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.05.2007
    Beiträge
    329
    und daß standardmäßig byref übergeben wird, also die Variablen in der Haupschleife verändert werden können.

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    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:

    und daß standardmäßig byref übergeben wird, also die Variablen in der Haupschleife verändert werden können.
    [grübel]
    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]

  10. #10
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.05.2007
    Beiträge
    329
    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!

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •