- LiTime Speicher und Akkus         
Ergebnis 1 bis 5 von 5

Thema: RFM12 Elektor Code funktioniert nicht mit RFM12S 868MHz

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    19.05.2011
    Beiträge
    18

    RFM12 Elektor Code funktioniert nicht mit RFM12S 868MHz

    Anzeige

    Praxistest und DIY Projekte
    Hallo Zusammen,

    ich möchte mir, wie viele hier, eine Funkstrecke zur Ser. Datenübertragung via RFM12S aufbauen. Als Test kam mir die "Firmware" aus der Januar Ausgabe 2009 der Zeitschrift Elektor, deren Abonent ich bin, gerade recht.Die Firmware wurde von Herrn Kainka verfasst und ich denke sie verstanden zu haben. Problem bei meinem RFM12 ist, daß es kein RFM12, sodern eine "S" - Version ist. Ich möchte auch gar keine Transceiver zu Transceiver - Strecke aufbauen, sondern nur eine Sende - Empfangsstrecke. Ich möchte gerne mal die Probleme Schildern, die ich so habe und möchte auch gerne ein wenig Code mit Pseudo Code hier herein setzen, sowie die Schaltung an sich und auch bezüglich der Hardware Fragen stellen, denn ich glaube aus dem Datenblatt von hoperf geht nicht alles hervor, was man so benötigt. Da der Quellcode bei Elektor öffentlich downloadbar ist und ich nicht behaupte, daß er von mir sei, denke ich, daß es in Ordnung geht diesen hier mit zu zitieren und zu ergänzen.
    Fange ich also mal an:

    Das RFM12 ist ein Transceiver, der mittels SPI Interface konfiguriert und mit Daten gefüttert wird. Die Konfiguration läuft über verschiedene Register im 16 Bit Format. Da die SPI nur mit 8 Bit überträgt müssen die Datenworte in 2 Bytes zerlegt werden und nacheinander übertragen werden. Dies geschieht hier, wobei hier auch noch die Konfiguration von Variablen und Ausgangszuständen des SPI zu finden sind.

    'Elektor RFM12

    $regfile = "m16def.dat"


    '$crystal = 11059200
    $crystal = 8000000
    $baud = 4800

    Nsel Alias Portb.4 'Portpins für die SPI und NSEL
    Sdi Alias Portb.5
    Sdo Alias Pinb.6
    Sck Alias Portb.7

    Dim D As Word
    Dim Data_in(10) As Byte
    Dim Data_out(10) As Byte
    Dim N As Byte
    Dim Timeout As Word
    Dim T As Word
    Dim Tt As Word
    Dim Freq As Single

    Declare Sub Send_rfm12 'Unterroutinen für verschiedene Aufgaben des RFM12
    Declare Sub Receive_rfm12
    Declare Sub Freq_rfm12
    Declare Sub Wait_rfm12
    Declare Function Spi16(byval Dout As Word) As Word ' Funktion für die serielle Byteübertragung eines 16 Bit Datenworts an die SPi

    Config Nsel = Output 'Pullups setzen
    Config Sdi = Output
    Config Sck = Output
    Config Portc = Output
    Porta = &HFF

    'Initialisierung wurde von mir mit dem Command Calculator nachgerechnet und sollte auch stimmen
    Nsel = 1
    Sck = 0

    D = Spi16(&H80e7) ' El , Ef , 11.5pf, 868 MHz band
    D = Spi16(&H82d9) '!er , !ebb , Et , Es , Ex , !eb , !ew , Dc
    D = Spi16(&Ha67c) ' 434,15 MHz / 868,3 MHz
    D = Spi16(&Hc647) ' 4.8kbps
    D = Spi16(&H94a4) ' Vdi , Fast , 134 kHz , 0db , -79dbm
    D = Spi16(&Hc2ac) ' Al , !ml , Dig , Dqd4
    D = Spi16(&Hca81) ' Fifo8 , Sync , !ff , Dr
    D = Spi16(&Hc483) ' @pwr , No Rstric , !st , !fi , Oe , En
    D = Spi16(&H9850) ' 90 kHz , power - 0 dB
    D = Spi16(&He000) '
    D = Spi16(&Hc800) '
    D = Spi16(&Hc000) ' 1 MHz , 2.2V
    Freq = 868.300 'Setzen der Frequenz
    Call Freq_rfm12
    Was nun folgt sind Testroutinen die mit GOTO angesprungen werden können um diverse Sachen zu testen, hierzu sei gesagt, daß nicht eine einzige bei mir bisher funktioniert hat, außer die Routine 5, bei der der Empfänger mir über die RS232 leider keine Daten ausgibt, was mich wundert, denn "Schrottiges Rauschen" sollte man ja immer irgendwie bekommen.
    'start transmitter, no data
    'Goto Test1:

    'transmit data
    'Goto Test2:

    'transmit key data
    'goto Test3:

    'start receiver, all data
    'Goto Test4:

    'start receiver, matched data
    'Goto Test5:
    Die darauf folgende Schleife mit Do Loop soll wohl für eine beidseitig vorgesehene Transceiverlösung eine Routine zur Synchronisierung darstellen, diese habe ich weggelassen und stattdessen mich auf die Beispiele zum Testen konzentriert.Hier trotzdem der Code:
    Do
    For N = 1 To 10
    Data_out(n) = N
    Next N
    Call Send_rfm12
    Waitms 500
    For N = 1 To 10
    Data_in(n) = 0
    Next N
    Timeout = 400 + Rnd(1000)
    Call Receive_rfm12
    For N = 1 To 10
    Print Data_in(n);
    Print " ";
    Next N
    Waitms 700
    Loop
    Was nun noch folgt sind die Unterroutinen, die für diverse Sachen gemacht sind (Senden, warten, empfangen) und die Routinen für die Tests.
    Sub Freq_rfm12
    If Freq < 800 Then Freq = Freq * 2
    Freq = Freq - 860
    D = Freq / 0.0050
    If D < 96 Then D = 96
    If D > 3903 Then D = 3903
    D = D + &HA000
    D = Spi16(d)
    End Sub


    Sub Send_rfm12
    D = Spi16(&H823
    Wait_rfm12
    D = Spi16(&Hb8aa)
    Wait_rfm12
    D = Spi16(&Hb8aa)
    Wait_rfm12
    D = Spi16(&Hb8aa)
    Wait_rfm12
    D = Spi16(&Hb82d)
    Wait_rfm12
    D = Spi16(&Hb8d4)
    For N = 1 To 10
    Wait_rfm12
    D = &HB800 + Data_out(n)
    D = Spi16(d)
    Next N
    Wait_rfm12
    D = Spi16(&Hb8aa)
    Wait_rfm12
    D = Spi16(&Hb8aa)
    Wait_rfm12
    D = Spi16(&H820
    End Sub

    Sub Wait_rfm12
    Nsel = 0
    Do
    Loop Until Sdo = 1
    End Sub


    Sub Receive_rfm12
    Tt = Timeout * 10
    D = Spi16(&H82c
    D = Spi16(&Hca83)
    For N = 1 To 10
    Nsel = 0
    T = 0
    Do
    T = T + 1
    Waitus 100
    If T > Tt Then Goto Nosignal
    Loop Until Sdo = 1
    D = Spi16(&Hb000)
    Data_in(n) = D
    Next N
    Nosignal:
    D = Spi16(&H820
    End Sub


    Function Spi16(byval Dout As Word) As Word
    Local Nspi As Integer
    Local Dspi As Integer
    Local Dsdo As Word
    Nsel = 0
    Dsdo = 0
    For Nspi = 1 To 16
    Dspi = Dout And &H8000
    If Dspi = 0 Then
    Sdi = 0
    Else
    Sdi = 1
    End If
    Dout = Dout * 2
    Dsdo = Dsdo * 2
    Dsdo = Dsdo + Sdo
    Sck = 1
    Waitus 5
    Sck = 0
    Next Nspi
    Nsel = 1
    Spi16 = Dsdo
    End Function



    'transceiver tests

    'start transmitter, no data
    Test1:
    D = Spi16(&H823
    Do
    Loop


    'transmit data
    Test2:
    D = Spi16(&H823
    Do
    Wait_rfm12
    D = Spi16(&Hb8aa)
    Loop


    'transmit key data
    Test3:
    D = Spi16(&H823
    Do
    Wait_rfm12
    D = Spi16(&Hb82d)
    Wait_rfm12
    D = Spi16(&Hb8d4)
    Loop


    'start receiver, all data
    Test4:
    D = Spi16(&H82c
    D = Spi16(&Hca87)
    For N = 1 To 100
    Wait_rfm12
    D = Spi16(&Hb000)
    Data_in(n) = D
    Print Chr(d);
    Next N
    Do
    Loop


    'start receiver, matched data
    Test5:
    D = Spi16(&H82c
    D = Spi16(&Hca83)
    For N = 1 To 100
    Wait_rfm12
    D = Spi16(&Hb000)
    Data_in(n) = D
    Print Chr(d);
    Next N
    Do
    Loop
    Da ich finde, daß man das Pferd nicht immer neu aufsatteln muß um an brauchbare Ergebnise zu kommen, dachte ich der Code wäre gut. Er ist zwar nicht ganz übersichtlich aber halbwegs verständlich. Leider bekomme ich nach der Anleitung von Elektor keine Datenverbindung zustande. Da ich ebenfalls kein Radiobauer oder Funkamateur bin habe ich hier auch keine Germanium, Schottky dioden rumliegen, geschweige denn einen Funkscanner, der mir sicherlich weitergeholfen hätte. Was mir zur Verfügung steht ist ein 2 Kanal 20MHz Oszi.

    Mein Ziel: Vorerst möchte ich 4 Bytes über den Äther schicken, diese sollen ungefiltert auf die RS232 am Empfänger ausgegeben werden.
    Wer modifiziert mit mir den Code?

    Frage zur Hardware: Ich habe natürlich schon viel gegooglest, mehrere andere Codebeispiele aus anderen Foren genutzt, jedoch hatte dies nie Erfolg. Ich habe irgendwo gelesen, daß das Modul am PinFSK mit einem Pullup 10 kOhm an 5V angeschlossen werden muß, da dort sonst auch nix geht. Wie sind Eure erfahrungen damit? Bisher habe ich nur NSEL, SCK,SDI,SDO,VCC und GND angeschlossen.
    Es scheint mir aber so zu sein, daß nach dem Initialisieren (NSEL=1 und SCK=0) nichts mehr passiert auf der SPI, das OSZI ist dafür zwar nicht gemacht um das zu beobachten, aber man sollte Aktivität auf der SPI sehen können (SDO und SDI), was nicht der Fall ist, das einzige was ich sehen kann ist ein Takt auf der SCK. Da viele von Euch die Teile zum Laufen gebracht haben will ich nicht so recht daran glauben hier eine Fehlinvestition getätigt zu haben.
    Desweiteren besitze ich auch das Pollin Board V1.2, auf dem die Module ebenfalls nicht zu laufen scheinen. Ich werde auch ohne eine Antwort hier natürlich weiterexperimentieren, vielleicht habe ich auch nur etwas übersehen.

    Helft mir, bitte, ich hab da voll Lust drauf, der Staubsauger soll endlich mal Daten senden..... Wer es schafft mich soweit zu bringen, dem spendiere ich 2 Stück der RFM12S Module gratis per Post, immerhin 10 Euro Wert...
    Geändert von JensBE (01.04.2013 um 21:59 Uhr)

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    19.05.2011
    Beiträge
    18
    Hallo,
    41 Hits, aber keine Antwort? Schade, vielleicht weiß ja doch wer was.
    Update:
    Ich habe ein merkwürdiges Verhalten feststellen können. Ich benutze nun den Code, der in der RN-Mikro Funk Doku enthalten ist, und zwar explizit das, welches den ersten Test zwischen den Modulen darstellen soll "Laden Sie den Code unverändert in beide Module". Natürlich habe ich den Code auf den Mega 16 portiert, sowie die Pinbelegung angepaßt. Das Resultat: Es funktionierte auf der Empfängerseite soweit, daß ich über die RS232 eine Ausgabe bekam. Leider ging nach einem Reset dann wieder nichts mehr. Ich bin nun soweit, daß ich sagen kann, daß der Mega16 in der Abarbeitung der INIT festhängt. Die Sub INIT nutzt ja die Funktion SPITRANSFER, dort hängt es, wurde mit RS232 geprüft. Ich kann das auch daran erkennen, daß der Ss Pin nach einem Reset zwar kurz auf High geht, dann wird ja in die INIT gesprungen, die wiederum die SPITRANSFER aufruft, in dieser wird Ss (NSEL) wieder auf low gezogen. Leider geht Ss danach nicht mehr auf High zurück, so sollte es ja sein, also wird da auch nichts vom RFM12 angenommen. Als das Gestern Abend funktionierte war das anders, NSEL schien dauerhaft auf High zu sein, aber hatte gaaaanz kurze periodische Low - Phasen. Ich denke das war in Ordnung. Warum geht das Ganze jetzt schon wieder nicht? Ich nutze die Hardwarepins des Mega16, die auch für die Hardware SPI zuständig sind. Im Code wird die SPI aber per Software angesprochen. Kann es das sein?

    Hier mal die Belegung:
    Ss Alias Portb.4
    Mosi Alias Portb.5
    Miso Alias Pinb.6
    Sck Alias Portb.7
    Config Ss = Output
    Config Mosi = Output
    Config Sck = Output

    Danke vorab.
    Geändert von JensBE (03.04.2013 um 16:37 Uhr)

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    14.11.2013
    Ort
    Home
    Beiträge
    213
    Hallo,

    kann alles nachvollziehen.

    Habe mich mehre 100 Stunden mit diesem Thema beschäftigt. Nun nehme ich an vieles gelöst zu haben. Somit schau mal im Forum RFM 12 RFM12 mit Beispielcode von Pollin, Antwort fredred.

    Mit freundlichen Grüßen
    fredred

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.07.2009
    Beiträge
    405
    Hatte Ähnliches auch mal probiert und bin gescheitert - bei mir wars wohl zu billige Hardware??

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    14.11.2013
    Ort
    Home
    Beiträge
    213
    Hallo,
    glaube ich nicht.
    Wenn du meine Hinweise im benanntem Forum umsetzt, bin ich mich sicher, du kannst Erfolg melden.
    Voraussetzung du beachtest die Hardware.


    Gruß
    fredlich

Ähnliche Themen

  1. RFM12 Module mit 868MHz und receive();
    Von Ferdinand im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 13.07.2011, 23:35
  2. RFM12 868Mhz Problem beim Empfang
    Von bytie82 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 21.11.2010, 22:50
  3. Probleme mit RFM12 868Mhz Code und Snap
    Von mat-sche im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 19
    Letzter Beitrag: 14.11.2010, 21:57
  4. Elektor RFM12 Code in UART ändern. Aber wie?
    Von Bammel im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 16.09.2009, 20:52
  5. RFM12 -> RFM01 868MHz
    Von stefan_Z im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 19.05.2008, 18:16

Berechtigungen

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

LiFePO4 Speicher Test