PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RFM12 433 Mhz und Atmega 8 funktioniert nur halbwegs



seseb
30.10.2012, 11:49
Hallo Leute!

Vor einiger Zeit hab ich mir 2 RFM12 Sende-/Empfangsmodule von Pollin besorgt. Nun bin ich dabei diese richtig zum Laufen zu bringen.

Hierzu benutze ich die codes von http://kanal35.npage.de/funkmodul.html den ich etwas
abgewandelt habe. Da der Empfänger nichts empfieng, spielte ich n bisschen am code, sodass es jetzt halbwegs funktioniert: ich habe eine kleine
Wartezeit eingebaut.
Aber der empfänger empfängt nur jedes zweite übertragene byte, statt 0123456789A nur 124679 :confused: ...

Kann mir jemand helfen ?

Hier erstmal die codes:

Sender:

'+++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++
'
' RFM12 Senden (TX) 434
' By DO1MAD
'+++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++
$regfile = "m8def.dat" 'ATMega16
$hwstack = 40
$swstack = 40
$framesize = 40
$crystal = 8000000 'Interner Quartz (8MHz)
$baud = 19200
'----------------------Variablen setzen-----------------------------------------
Dim Tx_word As Word
Dim Tx_l As Byte At Tx_word Overlay
Dim Tx_h As Byte At Tx_word + 1 Overlay
Dim Rx_word As Word
Dim Rx_l As Byte At Rx_word Overlay
Dim Rx_h As Byte At Rx_word + 1 Overlay
Dim Z As Byte
Dim Sendepuffer(18) As Byte

'--------------Aliasse und Richtungen für den RFM12 setzen----------------------

Cs Alias Portb.2 : Config Cs = Output : Set Cs
Sdi Alias Portb.3 : Config Sdi = Output
Sdo Alias Pinb.4 : Config Sdo = Input
Sck Alias Portb.5 : Config Sck = Output
'--------------------32,768kHz Uhrenquarz aktivieren----------------------------
Enable Interrupts

'----------------------------LED's aktivieren-----------------------------------
'Config Portb.2 = Output 'Grüne LED
Config Portb.0 = Output 'Rote LED
'------------------------LED's beim Programmstart testen------------------------
Set Portb.0
Wait 1
Reset Portb.0


Print "start"

'-----------------------SPI Port Configuration----------------------------------
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , _
Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 1
Spiinit
'-------------------------------------------------------------------------------
Waitms 300 'Auf Bereitschaft des RFM12 warten!
'-------------------------------------------------------------------------------
Gosub Initialisation 'Zur Initialisation springen
'---------------------------Sendepuffer füllen----------------------------------
Sendepuffer(1) = &HAA 'Preamble an Modul übertragen
Sendepuffer(2) = &HAA 'Preamble an Modul übertragen
Sendepuffer(3) = &HAA 'Preamble an Modul übertragen
'--------------------
Sendepuffer(4) = &H2D 'HI Byte für die Frame-Erkennung
Sendepuffer(5) = &HD4 'LO Byte für die Frame-Erkennung
'--------------------
Sendepuffer(6) = "0" 'Nutzdaten Byte's
Sendepuffer(7) = "1"
Sendepuffer(8) = "2"
Sendepuffer(9) = "3"
Sendepuffer(10) = "4"
Sendepuffer(11) = "5"
Sendepuffer(12) = "6"
Sendepuffer(13) = "7"
Sendepuffer(14) = "8"
Sendepuffer(15) = "9"
Sendepuffer(16) = "A"
'--------------------
Sendepuffer(17) = 0 'Kann man als String in der Empfangs-Software nutzen
'--------------------
Sendepuffer(18) = &HFF 'Dummy Byte
'-------------------------------------------------------------------------------
'-------------------------------Hauptschleife-----------------------------------
Do
Wait 1 'Ein Durchlauf pro Sekunde
Gosub Sender_an 'Senderendstufe einschalten
Set Portb.0 'Rote LED einschalten
Gosub Bereit 'Auf Bereitschaft warten
For Z = 1 To 18 'Sendepuffer 1 bis 18 abarbeiten
Tx_word = &HB800 + Sendepuffer(z) 'Sendekomando B800 und Pufferinhalt zusammenführen
Gosub Bereit 'Auf bereitschaft warten


Waitms 1


Gosub Rfmwrite '1 Sendepuffer Byte übergeben
Next Z 'Nächsten Schleifendurchlauf
Reset Portb.0 'Rote LED ausschalten
Waitms 5 'Dem RFM12 zeit zum senden lassen
Gosub Sender_aus 'Senderendstufe abschalten

Print " Auf 434,000Mhz gesendet!"
Loop
'-------------------------------------------------------------------------------
'--------------------------------SUB's------------------------------------------
Bereit:
Reset Cs 'RFM auswählen
Bitwait Sdo , Set 'Auf Highpegel warten
Return
'-------------------------------------------------------------------------------
Rfmwrite:
Reset Cs 'RFM auswählen
Rx_h = Spimove(tx_h) 'Sendet und empfängt das HI Byte
Rx_l = Spimove(tx_l) 'Sendet und empfängt das LO Byte
Set Cs 'RFM abwählen
Return
'-------------------------------------------------------------------------------
Initialisation: 'Initialisationsdaten zum RFM12 senden
Restore Initialisationsdaten
For Z = 1 To 14 'Alle 14 Kommando's abarbeiten
Read Tx_word
Gosub Rfmwrite 'Daten an RFM12 senden
Waitms 30 'Zeit zum ausführen der einzelnen Commando's geben
Next '14x 30ms = 420ms Gesamtzeit
Return
'-------------------------------------------------------------------------------
Initialisationsdaten: 'Daten gemäß RFM12 Command Calculator
'-------------------------------------------------------------------------------
Data &H80D7% 'Configurations Settings Command
Data &H8239% 'Power Management Command
Data &HA668% 'Frequency Setting Command (HA668 = 434MHz)
Data &HC647% 'Data Rate Command
Data &H94A0% 'Receiver Control Command
Data &HC2AD% 'Data Filter Command
Data &HCA81% 'FIFO und Reset Mode Command
Data &HCED4% 'Synchron Pattern Command
Data &HC400% 'Automatic Frequecy Control Command
Data &H9854% 'TX Control Command
Data &HCC17% 'PLL Settings Command
Data &HE000% 'Wake-Up Timer Command
Data &HC800% 'Low Duty-Cycle Command
Data &HC000% 'Low Battery Detect & µC CLK Command
'-------------------------------------------------------------------------------
Sender_an:
Restore Sender_an_daten
Read Tx_word
Gosub Rfmwrite 'Daten an RFM12 senden
Waitms 30 'Zeit zum ausführen der einzelnen Commando's geben
Return
'-------------------------------------------------------------------------------
Sender_an_daten: 'Daten gemäß RFM12 Command Calculator
'-------------------------------------------------------------------------------
Data &H8239% 'Power Management Command 'Low Battery Detect & µC CLK Command
'-------------------------------------------------------------------------------
Sender_aus:
Restore Sender_aus_daten
Read Tx_word
Gosub Rfmwrite 'Daten an RFM12 senden
Waitms 30 'Zeit zum ausführen der einzelnen Commando's geben
Return
'-------------------------------------------------------------------------------
Sender_aus_daten: 'Daten gemäß RFM12 Command Calculator
'-------------------------------------------------------------------------------
Data &H8201% 'Power Management Command 'Low Battery Detect & µC CLK Command
'-------------------------------------------------------------------------------
'+++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++
' Programm Ende
'+++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++

' Der ISM Bereich für 70cm: 433,05 bis 434,79 MHz

Empfänger:

'+++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++
'
' RFM12 Empfangen (RX) 434
' By DO1MAD
'+++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++
$regfile = "m8def.dat" 'ATMega16
$hwstack = 40
$swstack = 40
$framesize = 40
$crystal = 8000000 'Interner Quartz (8MHz)
$baud = 19200
'-------------------------Variablen setzen--------------------------------------
Dim Tx_word As Word
Dim Tx_l As Byte At Tx_word Overlay
Dim Tx_h As Byte At Tx_word + 1 Overlay
Dim Rx_word As Word
Dim Rx_l As Byte At Rx_word Overlay
Dim Rx_h As Byte At Rx_word + 1 Overlay
Dim Z As Byte
Dim Rxpuffer(18) As Byte At &H7E 'Puffer in einen anderen Speicherbereich setzen
Dim Rxdaten As String * 18 At Rxpuffer(1) Overlay
'--------------Aliasse und Richtungen für den RFM12 setzen----------------------
Ffit Alias Pinb.1 : Config Ffit = Input : Set Portb.1
Cs Alias Portb.2 : Config Cs = Output : Set Cs
Sdi Alias Portb.3 : Config Sdi = Output
Sdo Alias Pinb.4 : Config Sdo = Input : Set Portb.4
Sck Alias Portb.5 : Config Sck = Output
'--------------------32,768kHz Uhrenquarz aktivieren----------------------------
Enable Interrupts

'----------------------------LED's aktivieren-----------------------------------
'Config Portb.2 = Output 'Grüne LED
Config Portb.0 = Output 'Rote LED
'------------------------LED's beim Programmstart testen------------------------
Set Portb.0
Wait 1
Reset Portb.0
Print "start"


'--------------------ISP Schnittstelle konfigurieren----------------------------
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , _
Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 1
Spiinit
'-------------------Auf Bereitschaft des RFM12 warten---------------------------
Waitms 300
'-------------------------RFM12 Initialisieren----------------------------------
Gosub Initialisation
Gosub Rfm12_bereit
Print "Ich bin jetzt auf Empfamg (434MHz)"
Goto 10 'Es wird einmal beim Start der FIFO ausgelesen!
'-----------------------------Hauptschleife-------------------------------------
Do
If Ffit = 1 Then
'Prüfen ob Daten im FIFO anliegen
Set Portb.0 'Rote LED einschalten
10: 'Starteinsprungspunkt
Tx_word = &HB000 'FIFO Auslesebefehl B000 in's TX-Word schreiben
Gosub Rfmwrite 'FIFO Auselesebefehl zum RFM12 senden
Incr Z 'Z um 1 erhöhen
Rxpuffer(z) = Rx_l

'Die Daten vom FIFO in den Puffer übertragen
If Rx_l = 0 Then '0 ist das letzte Byte nach den Nutzdaten
Z = 0 'Z für die nächste Übertragung zurücksetzten
Print Rxdaten 'Das empfangene Datenwort auf RS232 ausgeben
Rxdaten = "" 'Nutzdaten nach dem Senden rücksetzten
Gosub Rfm12_bereit 'Den Rfm12 für den Empfang wieder bereit machen
Reset Portb.0 'Rote LED ausschalten
End If


End If
Loop


'----------------------------Zum Chip schreiben---------------------------------
Rfmwrite:
Reset Cs
Rx_h = Spimove(tx_h)
Rx_l = Spimove(tx_l)
Set Cs
Return
'----------------------------Zum Empfang bereit machen--------------------------
Rfm12_bereit:
Tx_word = &HCA81 'FIFO Initialisieren
Gosub Rfmwrite
Tx_word = &HCA83 'FIFO Aktivieren
Gosub Rfmwrite
Return
'----------------Alle 14 Initialisationsdaten dem RFM12 übergeben---------------
Initialisation:
Restore Initialisationsdaten
For Z = 1 To 14
Read Tx_word
Gosub Rfmwrite
Waitms 30
Next
Return
'-------------------------------------------------------------------------------
Initialisationsdaten: 'Daten gemäß RFM12 Command Calculator
'-------------------------------------------------------------------------------
Data &H80D7% 'Configurations Settings Command
Data &H8299% 'Power Management Command
Data &HA668% 'Frequency Setting Command (HA668 = 434MHz)
Data &HC647% 'Data Rate Command
Data &H94A0% 'Receiver Control Command
Data &HC2AD% 'Data Filter Command
Data &HCA81% 'FIFO und Reset Mode Command
Data &HCED4% 'Synchron Pattern Command
Data &HC400% 'Automatic Frequecy Control Command
Data &H9854% 'TX Control Command
Data &HCC17% 'PLL Settings Command
Data &HE000% 'Wake-Up Timer Command
Data &HC800% 'Low Duty-Cycle Command
Data &HC000% 'Low Battery Detect & µC CLK Command
'-------------------------------------------------------------------------------
'+++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++
' Programm Ende
'+++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++

' Der ISM Bereich für 70cm: 433,05 bis 434,79 MHz


Schonmal danke im vorraus ;)

seseb
08.12.2012, 09:45
hat vielleicht jemand n anderen code den er empfehlen kann?

Dirk
08.12.2012, 11:06
Bau doch mal in die Sendeschleife eine kleine Pause ein:

For Z = 1 To 18 'Sendepuffer 1 bis 18 abarbeiten
Tx_word = &HB800 + Sendepuffer(z) 'Sendekomando B800 und Pufferinhalt zusammenführen
Gosub Bereit 'Auf bereitschaft warten
Waitms 1
Gosub Rfmwrite '1 Sendepuffer Byte übergeben
Waitms 10
Next Z 'Nächsten Schleifendurchlauf

... und passe die 10 ms so lange an, bis jedes Zeichen sicher empfangen wird.

seseb
29.10.2013, 17:47
Ja stimmt ;)

mit einer kleinen warteroutine gehts:



Reset Cs 'RFM auswählen
Timeout = 0
Do
Incr Timeout
Loop Until Sdo = 1 Or Timeout = 65535
Return


des muss dahinn wo das label "bereit" war

natürlich muss dann die Wartezeit weggelassen werden

Unregistriert
21.11.2014, 11:28
Sehr guter tipp, danke!!!!!