- 12V Akku mit 280 Ah bauen         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 28

Thema: Funkmodule und Atmels

  1. #11
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.08.2006
    Beiträge
    118
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Wenn Du die Frequenz nicht verändert hast sollte im Fernseher
    auf Kanal 21-22( Mischfreq.) beim Senden das Rausche aufhören


    Wigbert

  2. #12
    Benutzer Stammmitglied
    Registriert seit
    28.06.2007
    Ort
    Blaustein
    Alter
    57
    Beiträge
    36
    Guten Abend,

    ich habe auch meinen Empfänger am Laufen. Doch leider etwas Ernüchterung. Es wird nichts übertragen, nein falsch, es wird schon was übertragen, ist aber lauter Müll.

    Ich bin mir absolut sicher, das der Sender etwas sendet. Das Spiel mit dem Fernseher funktioniert und wenn ich am Empfänger RFM12-Modul an den VD-Ausgang eine LED dran hänge, blinkt die sauber im 1-Sekunden Takt. Der Sender ist so eingestellt, das er alle Sekunde den Text wiederholt.

    Nun ja, ich denke, der Empfänger bleibt in der RF12_ready-Schleife hängen und kommt nicht mehr raus. Der Spi-sdo-Ausgang (MISO-Pin) geht auch nie auf 0. Seltsam.

    Hier mal der abgeänderte Code.

    Vom Sender :
    Code:
    ' Atmega8
    ' VDD -> VCC
    ' GND -> GND
    ' SDI -> MOSI (PB3, Pin 17)
    ' SDO -> MISO (PB4, Pin 18)
    ' SCK -> SCK (PB5, Pin 19)
    ' nSel -> SS (PB2, Pin 16)
    ' Fsk - > R 10k nach VDD
    
    ' Atmega16
    ' VDD -> VCC
    ' GND -> GND
    ' SDI -> MOSI (PB5, Pin 6)
    ' SDO -> MISO (PB6, Pin 7)
    ' SCK -> SCK (PB7, Pin 8)
    ' nSel -> SS (PB4, Pin 5)
    ' Fsk - > R 10k nach VDD
    
    $regfile = "m8def.dat"
    $crystal = 1000000                                                              '
    $hwstack = 32
    $swstack = 32
    $framesize = 40
    
    Declare Sub Rf12_init
    Declare Function Rf12_trans(byval Wert As Word) As Word
    Declare Sub Rf12_setfreq(byval Freq As Single)
    Declare Sub Rf12_setbandwith(byval Bandwith As Byte , Byval Gain As Byte , Byval Drssi As Byte)
    Declare Sub Rf12_setbaud(byval Rfbaud As Long)
    Declare Sub Rf12_setpower(byval Outpower As Byte , Byval Fskmod As Byte)
    Declare Sub Rf12_ready
    Declare Sub Rf12_readys
    Declare Sub Rf12_txdata(byval Maxchar As Byte)
    Declare Sub Rf12_rxdata(byval Maxchar As Byte)
    Declare Sub Senden
    Declare Sub Empfangen
    
    Const Rf12freq = 433.92
    Const Rf12baud = 19200
    Const Maxchar = 32
    
    Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
    Config Lcd = 16 * 2 , Chipset = Dogm162v3
    
    Cursor Off Noblink
    Cls
    
    ' config the SPI in master mode.The clock must be a quarter of the slave cpu
    ' Hier ggf. den SoftSPI reinmachen
    Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 128 , Noss = 1
    Config Portb.1 = Output                                                         ' LED zur Schleifenkontrolle
    
    ' werden benötigt für rf12_ready
    Spi_cs Alias Portb.2                                                            ' SS-Pin
    Config Spi_cs = Output
    Spi_sdo Alias Pinb.4                                                            ' MISO-PIN
    Set Spi_cs
    
    ' init the spi pins
    Spiinit
    
    Dim Count As Byte
    Dim Temp As Word
    Dim Rfdata(32) As Byte
    Dim Text As String * Maxchar At Rfdata Overlay
    Dim S As String * 10
    
    Locate 1 , 1 : Lcd "Init RFM12      "
    Waitms 100
    Call Rf12_init                                                                  ' ein paar Register setzen (z.B. CLK auf 10MHz)
    Locate 1 , 1 : Lcd "Set Frequenz    "
    Waitms 100
    Call Rf12_setfreq(rf12freq)                                                     ' Sende/Empfangsfrequenz auf 433,92MHz einstellen
    Locate 1 , 1 : Lcd "Set Bandwith    "
    Waitms 100
    Call Rf12_setbandwith(4 , 1 , 4)                                                ' 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm
    Locate 1 , 1 : Lcd "Set Baudrate    "
    Waitms 100
    Call Rf12_setbaud(rf12baud)                                                     ' 19200 baud
    Locate 1 , 1 : Lcd "Set Tx-Power    "
    Waitms 100
    Call Rf12_setpower(0 , 6)                                                       ' 1mW Ausgangangsleistung, 120kHz Frequenzshift
    
    Text = "Dies ist ein 433MHz Test !!!!!{013}{010}"
    
    ' Je nachdem ob Sender oder Empfänger die entsprechenden Zeilen aktivieren
    
    Do                                                                              ' Ewigschleife
       Pulseout Portb , 1 , 500                                                     ' Schleifenkontrolle
       Senden
       Locate 1 , 1 : Lcd "Ready           "
       Wait 1
    Loop
    
    End
    
    ' ########################################################################
    ' ####### Tranceiverroutinen
    ' ########################################################################
    
    Sub Empfangen
       Locate 2 , 1 : Lcd "Empfange        "
       Waitms 100
       Call Rf12_rxdata(maxchar)
       Locate 2 , 1
       For Count = 1 To Maxchar
          Lcd Chr(rfdata(count)) ;
          Waitms 100
       Next Count
    End Sub
    
    Sub Senden
       Locate 1 , 1 : Lcd "Sende           "
       Waitms 100
       Call Rf12_txdata(maxchar)
       Waitms 10
    End Sub
    
    ' ########################################################################
    ' ###### Unterroutinen
    ' ########################################################################
    
    Sub Rf12_init:
       Waitms 150
       Temp = Rf12_trans(&Hc0e0)
       Temp = Rf12_trans(&H80d7)
       Temp = Rf12_trans(&Hc2ab)
       Temp = Rf12_trans(&Hca81)
       Temp = Rf12_trans(&He000)
       Temp = Rf12_trans(&Hc800)
       Temp = Rf12_trans(&Hc4f7)
    End Sub
    
    Sub Rf12_setfreq(byval Freq As Single)
       Freq = Freq - 430.00
       Temp = Freq / 0.0025
       If Temp < 96 Then
          Temp = 96
       Elseif Temp > 3903 Then
          Temp = 3903
       End If
       Temp = Temp + &HA000
       Temp = Rf12_trans(temp)
    End Sub
    
    Sub Rf12_setbandwith(byval Bandwith As Byte , Byval Gain As Byte , Byval Drssi As Byte)
       Drssi = Drssi And 7
       Gain = Gain And 3
       Temp = Bandwith And 7
       Shift Temp , Left , 2
       Temp = Temp + Gain
       Shift Temp , Left , 3
       Temp = Temp + Drssi
       Temp = Temp + &H9400
       Temp = Rf12_trans(temp)
    End Sub
    
    
    Sub Rf12_setbaud(byval Rfbaud As Long )
       Local Ltemp As Long
       If Rfbaud < 663 Then Exit Sub
       If Rfbaud < 5400 Then
          Temp = 43104 / Rfbaud
          Temp = Temp + &HC680
       Else
          Ltemp = 344828 / Rfbaud
          Temp = Ltemp
          Temp = Temp + &HC600
       End If
       Decr Temp
       Temp = Rf12_trans(temp)
    End Sub
    
    Sub Rf12_setpower(byval Outpower As Byte , Byval Fskmod As Byte)
       Outpower = Outpower And 7
       Temp = Fskmod And 15
       Shift Temp , Left , 4
       Temp = Temp + Outpower
       Temp = Temp + &H9800
       Temp = Rf12_trans(temp)
    End Sub
    
    Sub Rf12_txdata(byval Maxchar As Byte)
       Temp = Rf12_trans(&H8238)
       Rf12_ready
       Temp = Rf12_trans(&Hb8aa)
       Rf12_ready
       Temp = Rf12_trans(&Hb8aa)
       Rf12_ready
       Temp = Rf12_trans(&Hb8aa)
       Rf12_ready
       Temp = Rf12_trans(&Hb82d)
       Rf12_ready
       Temp = Rf12_trans(&Hb8d4)
       Rf12_ready
       For Count = 1 To Maxchar
          Rf12_ready
          Temp = &HB800 + Rfdata(count)
          Temp = Rf12_trans(temp)
       Next Count
       Rf12_ready
       Temp = Rf12_trans(&H8208)
    End Sub
    
    Sub Rf12_rxdata(byval Maxchar As Byte)
       Temp = Rf12_trans(&H82c8)
       Temp = Rf12_trans(&Hca81)
       Temp = Rf12_trans(&Hca83)
       For Count = 1 To Maxchar
          Rf12_ready
          Temp = Rf12_trans(&Hb000)
          Rfdata(count) = Temp
       Next Count
       Temp = Rf12_trans(&H8208)
    End Sub
    
    Function Rf12_trans(byval Wert As Word) As Word
       Local Lowbyte As Byte
       Local Highbyte As Byte
       Lowbyte = Wert And 255
       Shift Wert , Right , 8
       Reset Spi_cs
       Highbyte = Spimove(wert)
       Lowbyte = Spimove(lowbyte)
       Set Spi_cs
       Temp = Highbyte * 256
       Temp = Temp + Lowbyte
       Rf12_trans = Temp
    End Function
    
    Sub Rf12_ready                                                                  ' ready Senden
       Reset Spi_cs
       While Spi_sdo = 0
       Wend
    End Sub
    und vom Empfänger :
    Code:
    ' Atmega8
    ' VDD -> VCC
    ' GND -> GND
    ' SDI -> MOSI (PB3, Pin 17)
    ' SDO -> MISO (PB4, Pin 18)
    ' SCK -> SCK (PB5, Pin 19)
    ' nSel -> SS (PB2, Pin 16)
    ' Fsk - > R 10k
    
    ' Atmega16
    ' VDD -> VCC
    ' GND -> GND
    ' SDI -> MOSI (PB5, Pin 6)
    ' SDO -> MISO (PB6, Pin 7)
    ' SCK -> SCK (PB7, Pin 8)
    ' nSel -> SS (PB4, Pin 5)
    ' Fsk - > R 10k
    
    $regfile = "m16def.dat"
    $crystal = 1000000                                                              '
    $hwstack = 32
    $swstack = 32
    $framesize = 40
    
    Declare Sub Rf12_init
    Declare Function Rf12_trans(byval Wert As Word) As Word
    Declare Sub Rf12_setfreq(byval Freq As Single)
    Declare Sub Rf12_setbandwith(byval Bandwith As Byte , Byval Gain As Byte , Byval Drssi As Byte)
    Declare Sub Rf12_setbaud(byval Rfbaud As Long)
    Declare Sub Rf12_setpower(byval Outpower As Byte , Byval Fskmod As Byte)
    Declare Sub Rf12_ready
    Declare Sub Rf12_readys
    Declare Sub Rf12_txdata(byval Maxchar As Byte)
    Declare Sub Rf12_rxdata(byval Maxchar As Byte)
    Declare Sub Senden
    Declare Sub Empfangen
    
    Const Rf12freq = 433.92
    Const Rf12baud = 19200
    Const Maxchar = 32
    
    Config Lcdpin = Pin , Db4 = Porta.7 , Db5 = Porta.6 , Db6 = Porta.5 , Db7 = Porta.4 , E = Portc.1 , Rs = Portc.0
    Config Lcd = 16 * 2 , Chipset = Dogm162v3
    
    Cursor Off Noblink
    Cls
    
    ' config the SPI in master mode.The clock must be a quarter of the slave cpu
    ' Hier ggf. den SoftSPI reinmachen
    Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 128 , Noss = 1
    Config Portd.7 = Output                                                         ' LED zur Schleifenkontrolle
    
    
    ' werden benötigt für rf12_ready
    Spi_cs Alias Portb.4                                                            ' SS-Pin
    Config Spi_cs = Output
    Spi_sdo Alias Pinb.6                                                            ' MISO-PIN
    Set Spi_cs
    
    ' init the spi pins
    Spiinit
    
    Dim Count As Byte
    Dim Temp As Word
    Dim Rfdata(32) As Byte
    Dim Text As String * Maxchar At Rfdata Overlay
    Dim S As String * 10
    
    Locate 1 , 1 : Lcd "Init RFM12      "
    Waitms 100
    Call Rf12_init                                                                  ' ein paar Register setzen (z.B. CLK auf 10MHz)
    Locate 1 , 1 : Lcd "Set Frequenz    "
    Waitms 100
    Call Rf12_setfreq(rf12freq)                                                     ' Sende/Empfangsfrequenz auf 433,92MHz einstellen
    Locate 1 , 1 : Lcd "Set Bandwith    "
    Waitms 100
    Call Rf12_setbandwith(4 , 1 , 4)                                                ' 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm
    Locate 1 , 1 : Lcd "Set Baudrate    "
    Waitms 100
    Call Rf12_setbaud(rf12baud)                                                     ' 19200 baud
    Locate 1 , 1 : Lcd "Set Tx-Power    "
    Waitms 100
    Call Rf12_setpower(0 , 6)                                                       ' 1mW Ausgangangsleistung, 120kHz Frequenzshift
    
    
    Text = "Dies ist ein 433MHz Test !!!!!{013}{010}"
    
    ' Je nachdem ob Sender oder Empfänger die entsprechenden Zeilen aktivieren
    
    Do                                                                              ' Ewigschleife
       Empfangen
       Pulseout Portd , 7 , 500                                                     ' Schleifenkontrolle
       Locate 1 , 1 : Lcd "Ready           "
       Wait 1
    Loop
    
    End
    
    ' ########################################################################
    ' ####### Tranceiverroutinen
    ' ########################################################################
    
    Sub Empfangen
       Locate 1 , 1 : Lcd "Empfange        "
       Waitms 100
       Call Rf12_rxdata(maxchar)
       Locate 2 , 1
       For Count = 1 To Maxchar
          Lcd Chr(rfdata(count)) ;
          Waitms 100
       Next Count
    End Sub
    
    Sub Senden
       Locate 1 , 1 : Lcd "Sende           "
       Waitms 100
       Call Rf12_txdata(maxchar)
       Waitms 10
    End Sub
    
    ' ########################################################################
    ' ###### Unterroutinen
    ' ########################################################################
    
    Sub Rf12_init:
       Waitms 150
       Temp = Rf12_trans(&Hc0e0)
       Temp = Rf12_trans(&H80d7)
       Temp = Rf12_trans(&Hc2ab)
       Temp = Rf12_trans(&Hca81)
       Temp = Rf12_trans(&He000)
       Temp = Rf12_trans(&Hc800)
       Temp = Rf12_trans(&Hc4f7)
    End Sub
    
    Sub Rf12_setfreq(byval Freq As Single)
       Freq = Freq - 430.00
       Temp = Freq / 0.0025
       If Temp < 96 Then
          Temp = 96
       Elseif Temp > 3903 Then
          Temp = 3903
       End If
       Temp = Temp + &HA000
       Temp = Rf12_trans(temp)
    End Sub
    
    Sub Rf12_setbandwith(byval Bandwith As Byte , Byval Gain As Byte , Byval Drssi As Byte)
       Drssi = Drssi And 7
       Gain = Gain And 3
       Temp = Bandwith And 7
       Shift Temp , Left , 2
       Temp = Temp + Gain
       Shift Temp , Left , 3
       Temp = Temp + Drssi
       Temp = Temp + &H9400
       Temp = Rf12_trans(temp)
    End Sub
    
    
    Sub Rf12_setbaud(byval Rfbaud As Long )
       Local Ltemp As Long
       If Rfbaud < 663 Then Exit Sub
       If Rfbaud < 5400 Then
          Temp = 43104 / Rfbaud
          Temp = Temp + &HC680
       Else
          Ltemp = 344828 / Rfbaud
          Temp = Ltemp
          Temp = Temp + &HC600
       End If
       Decr Temp
       Temp = Rf12_trans(temp)
    End Sub
    
    Sub Rf12_setpower(byval Outpower As Byte , Byval Fskmod As Byte)
       Outpower = Outpower And 7
       Temp = Fskmod And 15
       Shift Temp , Left , 4
       Temp = Temp + Outpower
       Temp = Temp + &H9800
       Temp = Rf12_trans(temp)
    End Sub
    
    Sub Rf12_txdata(byval Maxchar As Byte)
       Temp = Rf12_trans(&H8238)
       Rf12_ready
       Temp = Rf12_trans(&Hb8aa)
       Rf12_ready
       Temp = Rf12_trans(&Hb8aa)
       Rf12_ready
       Temp = Rf12_trans(&Hb8aa)
       Rf12_ready
       Temp = Rf12_trans(&Hb82d)
       Rf12_ready
       Temp = Rf12_trans(&Hb8d4)
       Rf12_ready
       For Count = 1 To Maxchar
          Rf12_ready
          Temp = &HB800 + Rfdata(count)
          Temp = Rf12_trans(temp)
       Next Count
       Rf12_ready
       Temp = Rf12_trans(&H8208)
    End Sub
    
    Sub Rf12_rxdata(byval Maxchar As Byte)
       Temp = Rf12_trans(&H82c8)
       Temp = Rf12_trans(&Hca81)
       Temp = Rf12_trans(&Hca83)
       For Count = 1 To Maxchar
          Rf12_ready
          Temp = Rf12_trans(&Hb000)
          Rfdata(count) = Temp
       Next Count
       Temp = Rf12_trans(&H8208)
    End Sub
    
    Function Rf12_trans(byval Wert As Word) As Word
       Local Lowbyte As Byte
       Local Highbyte As Byte
       Lowbyte = Wert And 255
       Shift Wert , Right , 8
       Reset Spi_cs
       Highbyte = Spimove(wert)
       Lowbyte = Spimove(lowbyte)
       Set Spi_cs
       Temp = Highbyte * 256
       Temp = Temp + Lowbyte
       Rf12_trans = Temp
    End Function
    
    Sub Rf12_ready
       Reset Spi_cs
       While Spi_sdo = 0
       Wend
    End Sub
    Wie man unschwer erkennen kann, verwende ich für den Sender ein Atmega8L und für den Empfänger ein Atmega16L mit einem DOG-M Display zur Ausgabe. Ich benutze beides Mal den internen Quarz mit 1,0MHz. Liegts daran ? Senden tu ich eigentlich immer nur den Text ""Dies ist ein 433MHz Test !!!!!{013}{010}" jede Sekunde.

    Das kann noch nicht mehr viel sein, jetzt hats bis hierher so gut geklappt

    Thomas
    New Millenium Observatory
    Der Sternhimmel über Ulm
    http://www.sternhimmel-ueber-ulm.de

  3. #13
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.08.2006
    Beiträge
    118
    Hallo Knickohr,
    wenn Du "Müll "überträgst bist Du schon weiter als viele Andere.
    1 Mhz und Baudrate hat grosse Fehler.
    Stell doch ein Gerät auf senden, und lese mit einen Terminalprogramm
    erst mal aus.
    Versuch es mal mit intern 8 Mhz mach ich auch immer.


    Wigbert

  4. #14
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.08.2006
    Beiträge
    118
    Hallo Knickohr


    Beim Empfang Dein Wait 1 aus der Schleife raus.Wie soll er was empfangen wenn er wartet.
    konnte die Sub Schleifenkontrolle nicht sehen.

    Wigbert

  5. #15
    Benutzer Stammmitglied
    Registriert seit
    28.06.2007
    Ort
    Blaustein
    Alter
    57
    Beiträge
    36
    Hallo

    Es funktioniert !!! \/ \/ \/

    Habe die Dinger zum Laufen gebracht. Ich habe einfach die Baudrate auf 1200 Baud gesetzt und seit dem kommts auch an. Zwar ist immer noch des letzte übertragene Zeichen Müll, aber das ist eine Kleinigkeit. Seltsamerweise setzt die erste Übertragung auch nicht an der ersten Stelle auf, sondern irgendwo mittendrin. Es sind immer ein paar Blanks am Anfang. Naja, halt beim ersten Mal senden.

    OK, hab Programm noch ein wenig angepaßt.

    Sender:
    Code:
    ' Atmega8
    ' VDD -> VCC
    ' GND -> GND
    ' SDI -> MOSI (PB3, Pin 17)
    ' SDO -> MISO (PB4, Pin 18)
    ' SCK -> SCK (PB5, Pin 19)
    ' nSel -> SS (PB2, Pin 16)
    ' Fsk - > R 10k nach VDD
    
    ' Atmega16
    ' VDD -> VCC
    ' GND -> GND
    ' SDI -> MOSI (PB5, Pin 6)
    ' SDO -> MISO (PB6, Pin 7)
    ' SCK -> SCK (PB7, Pin 8)
    ' nSel -> SS (PB4, Pin 5)
    ' Fsk - > R 10k nach VDD
    
    $regfile = "m8def.dat"
    $crystal = 1000000                                                              '
    $hwstack = 32
    $swstack = 32
    $framesize = 40
    
    Declare Sub Rf12_init
    Declare Function Rf12_trans(byval Wert As Word) As Word
    Declare Sub Rf12_setfreq(byval Freq As Single)
    Declare Sub Rf12_setbandwith(byval Bandwith As Byte , Byval Gain As Byte , Byval Drssi As Byte)
    Declare Sub Rf12_setbaud(byval Rfbaud As Long)
    Declare Sub Rf12_setpower(byval Outpower As Byte , Byval Fskmod As Byte)
    Declare Sub Rf12_ready
    Declare Sub Rf12_readys
    Declare Sub Rf12_txdata(byval Maxchar As Byte)
    Declare Sub Rf12_rxdata(byval Maxchar As Byte)
    Declare Sub Senden
    Declare Sub Empfangen
    
    Const Rf12freq = 433.92
    Const Rf12baud = 1200
    Const Maxchar = 16
    
    Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
    Config Lcd = 16 * 2 , Chipset = Dogm162v3
    
    Cursor Off Noblink
    Cls
    
    ' config the SPI in master mode.The clock must be a quarter of the slave cpu
    ' Hier ggf. den SoftSPI reinmachen
    Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 128 , Noss = 1
    Config Portb.1 = Output                                                         ' LED zur Schleifenkontrolle
    
    ' werden benötigt für rf12_ready
    Spi_cs Alias Portb.2                                                            ' SS-Pin
    Config Spi_cs = Output
    Spi_sdo Alias Pinb.4                                                            ' MISO-PIN
    Set Spi_cs
    
    ' init the spi pins
    Spiinit
    
    Dim Count As Byte
    Dim Temp As Word
    Dim Rfdata(32) As Byte
    Dim Text As String * Maxchar At Rfdata Overlay
    Dim J As Byte
    
    Locate 1 , 1 : Lcd "Init RFM12      "
    Waitms 100
    Call Rf12_init                                                                  ' ein paar Register setzen (z.B. CLK auf 10MHz)
    Locate 1 , 1 : Lcd "Set Frequenz    "
    Waitms 100
    Call Rf12_setfreq(rf12freq)                                                     ' Sende/Empfangsfrequenz auf 433,92MHz einstellen
    Locate 1 , 1 : Lcd "Set Bandwith    "
    Waitms 100
    Call Rf12_setbandwith(4 , 1 , 4)                                                ' 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm
    Locate 1 , 1 : Lcd "Set Baudrate    "
    Waitms 100
    Call Rf12_setbaud(rf12baud)                                                     ' 19200 baud
    Locate 1 , 1 : Lcd "Set Tx-Power    "
    Waitms 100
    Call Rf12_setpower(0 , 6)                                                       ' 1mW Ausgangangsleistung, 120kHz Frequenzshift
    
    'Text = "Dies ist ein 433MHz Test !!!!!{013}{010}"
    
    ' Je nachdem ob Sender oder Empfänger die entsprechenden Zeilen aktivieren
    
    Do                                                                              ' Ewigschleife
       Pulseout Portb , 1 , 500                                                     ' Schleifenkontrolle
       Text = "433MHz Test #" + Str(j)
       Senden
       Locate 1 , 1 : Lcd "Ready           "
       Incr J
       Wait 3
    Loop
    
    End
    
    ' ########################################################################
    ' ####### Tranceiverroutinen
    ' ########################################################################
    
    Sub Empfangen
       Locate 2 , 1 : Lcd "Empfange        "
       Waitms 100
       Call Rf12_rxdata(maxchar)
       Locate 2 , 1 : Lcd "                "
       Locate 2 , 1
       For Count = 1 To Maxchar
          Lcd Chr(rfdata(count)) ;
          Waitms 100
       Next Count
    End Sub
    
    Sub Senden
       Locate 1 , 1 : Lcd "Sende           "
       Waitms 100
       Call Rf12_txdata(maxchar)
       Waitms 10
    End Sub
    
    ' ########################################################################
    ' ###### Unterroutinen
    ' ########################################################################
    
    Sub Rf12_init:
       Waitms 150
       Temp = Rf12_trans(&Hc0e0)
       Temp = Rf12_trans(&H80d7)
       Temp = Rf12_trans(&Hc2ab)
       Temp = Rf12_trans(&Hca81)
       Temp = Rf12_trans(&He000)
       Temp = Rf12_trans(&Hc800)
       Temp = Rf12_trans(&Hc4f7)
    End Sub
    
    Sub Rf12_setfreq(byval Freq As Single)
       Freq = Freq - 430.00
       Temp = Freq / 0.0025
       If Temp < 96 Then
          Temp = 96
       Elseif Temp > 3903 Then
          Temp = 3903
       End If
       Temp = Temp + &HA000
       Temp = Rf12_trans(temp)
    End Sub
    
    Sub Rf12_setbandwith(byval Bandwith As Byte , Byval Gain As Byte , Byval Drssi As Byte)
       Drssi = Drssi And 7
       Gain = Gain And 3
       Temp = Bandwith And 7
       Shift Temp , Left , 2
       Temp = Temp + Gain
       Shift Temp , Left , 3
       Temp = Temp + Drssi
       Temp = Temp + &H9400
       Temp = Rf12_trans(temp)
    End Sub
    
    Sub Rf12_setbaud(byval Rfbaud As Long )
       Local Ltemp As Long
       If Rfbaud < 663 Then Exit Sub
       If Rfbaud < 5400 Then
          Temp = 43104 / Rfbaud
          Temp = Temp + &HC680
       Else
          Ltemp = 344828 / Rfbaud
          Temp = Ltemp
          Temp = Temp + &HC600
       End If
       Decr Temp
       Temp = Rf12_trans(temp)
    End Sub
    
    Sub Rf12_setpower(byval Outpower As Byte , Byval Fskmod As Byte)
       Outpower = Outpower And 7
       Temp = Fskmod And 15
       Shift Temp , Left , 4
       Temp = Temp + Outpower
       Temp = Temp + &H9800
       Temp = Rf12_trans(temp)
    End Sub
    
    Sub Rf12_txdata(byval Maxchar As Byte)
       Temp = Rf12_trans(&H8238)
       Rf12_ready
       Temp = Rf12_trans(&Hb8aa)
       Rf12_ready
       Temp = Rf12_trans(&Hb8aa)
       Rf12_ready
       Temp = Rf12_trans(&Hb8aa)
       Rf12_ready
       Temp = Rf12_trans(&Hb82d)
       Rf12_ready
       Temp = Rf12_trans(&Hb8d4)
       Rf12_ready
       For Count = 1 To Maxchar
          Rf12_ready
          Temp = &HB800 + Rfdata(count)
          Temp = Rf12_trans(temp)
       Next Count
       Rf12_ready
       Temp = Rf12_trans(&H8208)
    End Sub
    
    Sub Rf12_rxdata(byval Maxchar As Byte)
       Temp = Rf12_trans(&H82c8)
       Temp = Rf12_trans(&Hca81)
       Temp = Rf12_trans(&Hca83)
       For Count = 1 To Maxchar
          Rf12_ready
          Temp = Rf12_trans(&Hb000)
          Rfdata(count) = Temp
       Next Count
       Temp = Rf12_trans(&H8208)
    End Sub
    
    Function Rf12_trans(byval Wert As Word) As Word
       Local Lowbyte As Byte
       Local Highbyte As Byte
       Lowbyte = Wert And 255
       Shift Wert , Right , 8
       Reset Spi_cs
       Highbyte = Spimove(wert)
       Lowbyte = Spimove(lowbyte)
       Set Spi_cs
       Temp = Highbyte * 256
       Temp = Temp + Lowbyte
       Rf12_trans = Temp
    End Function
    
    Sub Rf12_ready
       Local I As Word
       Reset Spi_cs
       For I = 1 To 65000
          If Spi_sdo = 1 Then Exit For
       Next
    End Sub
    Empfänger:
    Code:
    ' Atmega8
    ' VDD -> VCC
    ' GND -> GND
    ' SDI -> MOSI (PB3, Pin 17)
    ' SDO -> MISO (PB4, Pin 18)
    ' SCK -> SCK (PB5, Pin 19)
    ' nSel -> SS (PB2, Pin 16)
    ' Fsk - > R 10k
    
    ' Atmega16
    ' VDD -> VCC
    ' GND -> GND
    ' SDI -> MOSI (PB5, Pin 6)
    ' SDO -> MISO (PB6, Pin 7)
    ' SCK -> SCK (PB7, Pin 8)
    ' nSel -> SS (PB4, Pin 5)
    ' Fsk - > R 10k
    
    $regfile = "m16def.dat"
    $crystal = 1000000                                                              '
    $hwstack = 32
    $swstack = 32
    $framesize = 40
    
    Declare Sub Rf12_init
    Declare Function Rf12_trans(byval Wert As Word) As Word
    Declare Sub Rf12_setfreq(byval Freq As Single)
    Declare Sub Rf12_setbandwith(byval Bandwith As Byte , Byval Gain As Byte , Byval Drssi As Byte)
    Declare Sub Rf12_setbaud(byval Rfbaud As Long)
    Declare Sub Rf12_setpower(byval Outpower As Byte , Byval Fskmod As Byte)
    Declare Sub Rf12_ready
    Declare Sub Rf12_readys
    Declare Sub Rf12_txdata(byval Maxchar As Byte)
    Declare Sub Rf12_rxdata(byval Maxchar As Byte)
    Declare Sub Senden
    Declare Sub Empfangen
    
    Const Rf12freq = 433.92
    Const Rf12baud = 1200
    Const Maxchar = 16
    
    Config Lcdpin = Pin , Db4 = Porta.7 , Db5 = Porta.6 , Db6 = Porta.5 , Db7 = Porta.4 , E = Portc.1 , Rs = Portc.0
    Config Lcd = 16 * 2 , Chipset = Dogm162v3
    
    Cursor Off Noblink
    Cls
    
    ' config the SPI in master mode.The clock must be a quarter of the slave cpu
    ' Hier ggf. den SoftSPI reinmachen
    Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 128 , Noss = 1
    Config Portd.7 = Output                                                         ' LED zur Schleifenkontrolle
    
    
    ' werden benötigt für rf12_ready
    Spi_cs Alias Portb.4                                                            ' SS-Pin
    Config Spi_cs = Output
    Spi_sdo Alias Pinb.6                                                            ' MISO-PIN
    Set Spi_cs
    
    ' init the spi pins
    Spiinit
    
    Dim Count As Byte
    Dim Temp As Word
    Dim Rfdata(32) As Byte
    Dim Text As String * Maxchar At Rfdata Overlay
    'Dim J As Byte
    
    Locate 1 , 1 : Lcd "Init RFM12      "
    Waitms 100
    Call Rf12_init                                                                  ' ein paar Register setzen (z.B. CLK auf 10MHz)
    Locate 1 , 1 : Lcd "Set Frequenz    "
    Waitms 100
    Call Rf12_setfreq(rf12freq)                                                     ' Sende/Empfangsfrequenz auf 433,92MHz einstellen
    Locate 1 , 1 : Lcd "Set Bandwith    "
    Waitms 100
    Call Rf12_setbandwith(4 , 1 , 4)                                                ' 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm
    Locate 1 , 1 : Lcd "Set Baudrate    "
    Waitms 100
    Call Rf12_setbaud(rf12baud)                                                     ' 19200 baud
    Locate 1 , 1 : Lcd "Set Tx-Power    "
    Waitms 100
    Call Rf12_setpower(0 , 6)                                                       ' 1mW Ausgangangsleistung, 120kHz Frequenzshift
    
    
    'Text = "Dies ist ein 433MHz Test !!!!!{013}{010}"
    'Text = "433MHz Test #" + J
    
    ' Je nachdem ob Sender oder Empfänger die entsprechenden Zeilen aktivieren
    
    Do                                                                              ' Ewigschleife
       Empfangen
       Pulseout Portd , 7 , 500                                                     ' Schleifenkontrolle
       Locate 1 , 1 : Lcd "Ready           "
       Wait 1
    Loop
    
    End
    
    ' ########################################################################
    ' ####### Tranceiverroutinen
    ' ########################################################################
    
    Sub Empfangen
       Locate 1 , 1 : Lcd "Empfange        "
       Waitms 100
       Locate 2 , 1 : Lcd "                "
       Locate 2 , 1
       Call Rf12_rxdata(maxchar)
       For Count = 1 To Maxchar
          Lcd Chr(rfdata(count)) ;
          Waitms 100
       Next Count
    End Sub
    
    Sub Senden
       Locate 1 , 1 : Lcd "Sende           "
       Waitms 100
       Call Rf12_txdata(maxchar)
       Waitms 10
    End Sub
    
    ' ########################################################################
    ' ###### Unterroutinen
    ' ########################################################################
    
    Sub Rf12_init:
       Waitms 150
       Temp = Rf12_trans(&Hc0e0)
       Temp = Rf12_trans(&H80d7)
       Temp = Rf12_trans(&Hc2ab)
       Temp = Rf12_trans(&Hca81)
       Temp = Rf12_trans(&He000)
       Temp = Rf12_trans(&Hc800)
       Temp = Rf12_trans(&Hc4f7)
    End Sub
    
    Sub Rf12_setfreq(byval Freq As Single)
       Freq = Freq - 430.00
       Temp = Freq / 0.0025
       If Temp < 96 Then
          Temp = 96
       Elseif Temp > 3903 Then
          Temp = 3903
       End If
       Temp = Temp + &HA000
       Temp = Rf12_trans(temp)
    End Sub
    
    Sub Rf12_setbandwith(byval Bandwith As Byte , Byval Gain As Byte , Byval Drssi As Byte)
       Drssi = Drssi And 7
       Gain = Gain And 3
       Temp = Bandwith And 7
       Shift Temp , Left , 2
       Temp = Temp + Gain
       Shift Temp , Left , 3
       Temp = Temp + Drssi
       Temp = Temp + &H9400
       Temp = Rf12_trans(temp)
    End Sub
    
    Sub Rf12_setbaud(byval Rfbaud As Long )
       Local Ltemp As Long
       If Rfbaud < 663 Then Exit Sub
       If Rfbaud < 5400 Then
          Temp = 43104 / Rfbaud
          Temp = Temp + &HC680
       Else
          Ltemp = 344828 / Rfbaud
          Temp = Ltemp
          Temp = Temp + &HC600
       End If
       Decr Temp
       Temp = Rf12_trans(temp)
    End Sub
    
    Sub Rf12_setpower(byval Outpower As Byte , Byval Fskmod As Byte)
       Outpower = Outpower And 7
       Temp = Fskmod And 15
       Shift Temp , Left , 4
       Temp = Temp + Outpower
       Temp = Temp + &H9800
       Temp = Rf12_trans(temp)
    End Sub
    
    Sub Rf12_txdata(byval Maxchar As Byte)
       Temp = Rf12_trans(&H8238)
       Rf12_ready
       Temp = Rf12_trans(&Hb8aa)
       Rf12_ready
       Temp = Rf12_trans(&Hb8aa)
       Rf12_ready
       Temp = Rf12_trans(&Hb8aa)
       Rf12_ready
       Temp = Rf12_trans(&Hb82d)
       Rf12_ready
       Temp = Rf12_trans(&Hb8d4)
       Rf12_ready
       For Count = 1 To Maxchar
          Rf12_ready
          Temp = &HB800 + Rfdata(count)
          Temp = Rf12_trans(temp)
       Next Count
       Rf12_ready
       Temp = Rf12_trans(&H8208)
    End Sub
    
    Sub Rf12_rxdata(byval Maxchar As Byte)
       Temp = Rf12_trans(&H82c8)
       Temp = Rf12_trans(&Hca81)
       Temp = Rf12_trans(&Hca83)
       For Count = 1 To Maxchar
          Rf12_ready
          Temp = Rf12_trans(&Hb000)
          Rfdata(count) = Temp
       Next Count
       Temp = Rf12_trans(&H8208)
    End Sub
    
    Function Rf12_trans(byval Wert As Word) As Word
       Local Lowbyte As Byte
       Local Highbyte As Byte
       Lowbyte = Wert And 255
       Shift Wert , Right , 8
       Reset Spi_cs
       Highbyte = Spimove(wert)
       Lowbyte = Spimove(lowbyte)
       Set Spi_cs
       Temp = Highbyte * 256
       Temp = Temp + Lowbyte
       Rf12_trans = Temp
    End Function
    
    Sub Rf12_ready
       Local I As Word
       Reset Spi_cs
       For I = 1 To 65000
          If Spi_sdo = 1 Then Exit For
       Next
    End Sub
    @Wigbert:
    Die 1 Sekunde Warten war offensichtlich kein Problem. Ja OK, wenn während der Zeit was gesendet wurde gings natürlich ins Nirwana.

    Ist da eigentlich ein Schreibfehler ?
    Sub Rf12_setbaud(byval Rfbaud As Long )
    Local Ltemp As Long
    If Rfbaud < 663 Then Exit Sub
    If Rfbaud < 5400 Then
    Temp = 43104 / Rfbaud
    Temp = Temp + &HC680
    Else
    Ltemp = 344828 / Rfbaud
    Temp = Ltemp
    Temp = Temp + &HC600
    Decr Temp
    Temp = Rf12_trans(temp)
    End Sub

    Das rot markierte meine ich. Das würde zumindest bei mir den Fehler mit der herunter gesetzten Baudrate erklären.

    Thomas
    New Millenium Observatory
    Der Sternhimmel über Ulm
    http://www.sternhimmel-ueber-ulm.de

  6. #16
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.08.2006
    Beiträge
    118
    Der Code sieht ok aus.
    Die Baudrate sollte er selbsständig berechnen.
    Was Oben als constant steht wird im RFM12 eingetragen.
    bis 4,8K sollte bei 1MHz möglich sein.
    danach ist ein zu hoher Baudratenfehler.

    Dein Display ist schnell genug?


    Wigbert

  7. #17
    Benutzer Stammmitglied
    Registriert seit
    28.06.2007
    Ort
    Blaustein
    Alter
    57
    Beiträge
    36
    Sodale,

    jetzt habe ich auch eine 2-Wege-Verbindung zu Stande gebracht. Der Empfänger sendet einfach den empfangenen String wieder zurücck. Funktioniert richtig gut, habe auch mal die Reichweite getestet. Mit den beiden Stückchen 15cm Draht funktioniert es im ganzen 3-Familienhaus selbst bis in den Keller problemlos. Bis in einer Entfernung von 25 Meter um das Haus auch. Wohlgemerkt, der Sender ist immer noch im Haus ! Ab so ca. 30 bis 50 Meter kommen dann die ersten einzelnen Übertragungsfehler. Und ab 50 Meter setzt die Verbindung dann vereinzelt komplett aus. Aber selbst mit über 100 Meter Entfernung konnte ich hin und wieder verkrüppelte Daten empfangen, teilweise sogar vollständig.

    Ich denke, man kann die Reichweite durch die Abstimmung der beiden Antennen noch etwas verbessern. Vermutlich bring auch eine kleinere Baudrate eine sauberere Übertragung. Wie weit kann man eigentlich mit der Baudrate runter ? Kann man die Leistung der Sender noch softwaremäßig erhöhen ?

    Die Dinger sind richtig gut, wenn sie mal laufen. Jetzt muß ich irgendwie noch eine Fehlerkorrektur einbauen und vielleicht die Übertragung mit einer Identifikation versehen, damit die Übertragung eindeutig wird. Ich denke da an so was wie ID-Byte und Acknowledge.

    @Wigbert:
    Das DOG-M ist eigentlich recht schnell für ein LCD. Die meiste Zeit geht mir in den waitms verloren. Senden, Empfangen, das empfangene zurücksenden und wieder vom Sender empfangen, und die Anzeige im Display (mit den Statustexten) dauert zusammen weniger als 1 Sekunde.

    \/ \/ \/ \/ \/

    Thomas
    New Millenium Observatory
    Der Sternhimmel über Ulm
    http://www.sternhimmel-ueber-ulm.de

  8. #18
    Benutzer Stammmitglied
    Registriert seit
    27.05.2007
    Beiträge
    67
    Hi Knickohr

    Hast du überhaupt noch Zeit, bei der Massenproduktion, die du da machst

    Respekt.
    Grüße Eisbaeeer

  9. #19
    Benutzer Stammmitglied
    Registriert seit
    28.06.2007
    Ort
    Blaustein
    Alter
    57
    Beiträge
    36
    Hallo Eisbär,

    nein eigentlich nicht. Aber momentan ist meine Lötstation kaputt und die neue noch nicht da. Also hatte ich freies Wochenende

    Genau die richtige Zeit für eine Weiterentwicklung.

    Werde aber trotzdem heute ein paar Timer mir einem alten "Bunsenbrenner" zusammen basteln.

    Thomas
    New Millenium Observatory
    Der Sternhimmel über Ulm
    http://www.sternhimmel-ueber-ulm.de

  10. #20
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hallo Knickohr,

    Seltsamerweise setzt die erste Übertragung auch nicht an der ersten Stelle auf, sondern irgendwo mittendrin. Es sind immer ein paar Blanks am Anfang. Naja, halt beim ersten Mal senden.
    Ich kenne die RF12-Module nicht aus eigener Erfahrung, aber das beschriebene Phänomen dürfte an der fehlenden Präambel liegen, wenn die Module nur die reinen Daten senden und kein Protokoll.
    Vor der eigentlichen Datenübertragung braucht der Empfänger etwas Zeit, um sich mit dem Sender zu synchroniseren und die Komparatoren zu stabiliseren.
    Um das zu erreichen, kann man einige (z.B. 6) Bytes mit einem 0/1-Bitwechsel (z.B. binär 01010101) immer beim ersten Senden vorwegschicken. Den Beginn der Übertragung der Datenbytes könnte man z.B. mit Hex 00-00-FF beginnen, danach folgen die Daten.
    Die Fehlerprüfung im Empfänger würde dann die letzten 6 Bytes (also die Hälfte der 01-Bytes und 00-00-FF bewerten:
    Die müßten dann binär so aussehen:
    01010101-01010101-01010101-00000000-00000000-11111111
    Dann ist die Sendung erfolgreich gestartet worden.
    Am Ende der Daten kann man nochmal 00-00-FF senden, auch das kann im Empfänger benutzt werden, um die Intaktheit aller Daten zu kennzeichnen.

    Wenn die Daten vor dem Senden vollständig bekannt sind, kann man natürlich auch eine Prüfsumme über alle Daten errechnen und z.B. am Ende mit verschicken. Auch die Bytezahl könnte man dann mit verschicken, z.B. vor der Ende-Markierung:
    Daten-00-00-FF-PP-PP-ZZ-ZZ-00-00-FF
    (P=Prüfsumme, Z=Bytezahl)

    Da ist Phantasie gefragt, wie man seine Daten absichern will. Natürlich kostet das auch Sendezeit, so dass man abwägen muss.

    Gruß Dirk

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test