PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bascom RFM12 Elektor Code funktioniert nicht mit RFM12S 868MHz



JensBE
01.04.2013, 21:34
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(&H8238)
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(&H8208)
End Sub

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


Sub Receive_rfm12
Tt = Timeout * 10
D = Spi16(&H82c8)
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(&H8208)
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(&H8238)
Do
Loop


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


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


'start receiver, all data
Test4:
D = Spi16(&H82c8)
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(&H82c8)
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...

JensBE
03.04.2013, 16:03
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.

fredred
05.03.2014, 17:10
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, (https://www.roboternetz.de/community/members/threads/64308-RFM12-mit-Beispielcode-von-Pollin-Anschlussprobleme-Atmega32) Antwort fredred.

Mit freundlichen Grüßen
fredred

dussel07
05.03.2014, 17:31
Hatte Ähnliches auch mal probiert und bin gescheitert - bei mir wars wohl zu billige Hardware??

fredred
05.03.2014, 17:57
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