- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 5 von 5

Thema: RFM12 433 Mhz und Atmega 8 funktioniert nur halbwegs

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    29.05.2012
    Beiträge
    20

    RFM12 433 Mhz und Atmega 8 funktioniert nur halbwegs

    Anzeige

    E-Bike
    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 ...

    Kann mir jemand helfen ?

    Hier erstmal die codes:

    Sender:
    Code:
    '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    '
    '                            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:
    Code:
    '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    '
    '                            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

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    29.05.2012
    Beiträge
    20
    hat vielleicht jemand n anderen code den er empfehlen kann?

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Bau doch mal in die Sendeschleife eine kleine Pause ein:
    Code:
       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.
    Gruß
    Dirk

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    29.05.2012
    Beiträge
    20
    Ja stimmt

    mit einer kleinen warteroutine gehts:

    Code:
    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

  5. #5
    Unregistriert
    Gast

    Top

    Sehr guter tipp, danke!!!!!

Ähnliche Themen

  1. Habe Problem mit RFM12 und Atmega 168P
    Von Typer im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 9
    Letzter Beitrag: 02.07.2012, 22:14
  2. Jeenode -> Atmega-Platine mit RFM12 Transceiver
    Von Andree-HB im Forum AVR Hardwarethemen
    Antworten: 4
    Letzter Beitrag: 24.03.2011, 06:03
  3. Funkstrecke zwischen zwei Atmega mittels RFM12-Modulen
    Von hausi im Forum Assembler-Programmierung
    Antworten: 4
    Letzter Beitrag: 18.03.2011, 14:47
  4. Atmega8 mit RFM12 und LCD
    Von stani im Forum AVR Hardwarethemen
    Antworten: 4
    Letzter Beitrag: 29.10.2010, 18:11
  5. URXC1 Interrupt beim Atmega 128 funktioniert nicht
    Von tobuc0 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 0
    Letzter Beitrag: 24.06.2007, 10:23

Stichworte

Berechtigungen

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

Solar Speicher und Akkus Tests