- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 28 von 28

Thema: Funkmodule und Atmels

  1. #21
    Benutzer Stammmitglied
    Registriert seit
    28.06.2007
    Ort
    Blaustein
    Alter
    57
    Beiträge
    36
    Anzeige

    Praxistest und DIY Projekte
    Hallo Dirk,

    das ist genau das, was ich schon verzweifelt Suche !

    Für die Daten und eine Adresse würden mir jeweils ein Byte reichen. Würde dann nach Deinem Vorschlag ungefähr so aussehen :

    AA-AA-AA-00-00-FF-Adressbyte-Datenbyte-00-00-FF-PP-PP-ZZ-ZZ-FF

    Wären genau 16 Bytes, was ich für eine saubere und gesicherte Übertragung als vollkommen angemessen finde. Die Daten und Adressen sind genau bekannt. Wie wird die Prüfsumme gebildet ? Nur über die Daten- und Adress-Bytes oder über die gesamte Übertragung ? Wie kann ich das anstellen ?

    Wie geschrieben, ich brauche im Prinzip nur eine Handvoll Befehle im Datenbyte und ein Byte Adressen reichen auch vollkommen aus.

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

  2. #22
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803

    Protokoll

    Hallo Knickohr,

    du hast ja schon die Erfahrung gemacht, wie viele Bytes am Anfang einer Sendung meistens "Müll" sind. Nehmen wir an, es sind maximal 3 Bytes, die am Anfang unsicher empfangen werden.
    Dann müßtest du ja zur Sicherheit 4 Bytes zur Synchronisierung an den Anfang stellen. Danach würde ich noch einmal 4 Bytes stellen, danach die Abfolge 00-00-FF. Dann folgen die beiden Datenbytes.

    Das ganze Protokoll:
    AA-AA-AA-AA-[highlight=red:927fd02520]AA-AA-AA-AA-00-00-FF[/highlight:927fd02520]-Daten(2 Bytes)-00-00-FF-PP-00-00-FF

    Das wären dann 20 Byte.
    Wenn du fest nur 2 Datenbytes überträgst, brauchst du ja die Bytezahl nicht zu übertragen. Es bleibt die Prüfsumme (PP). Man kann sie z.B. durch Addition von Datenbyte 1 und 2 bilden (Byte-Überlauf ist egal!).

    Im Empfänger prüft man dann (nach korrektem Eintreffen des 1. 00-00-FF) auch die letzten 4 Bytes davor (AA-AA-AA-AA, d.h. die 2. Hälfte der AAs) auf Unversehrtheit (also insgesamt die roten Bytes oben). Die 4 AAs ganz am Anfang werden natürlich nicht gestestet, denn da ist ja der Müll drin.

    Der Empfänger setzt je nach Ergebnis ein Error-Flag, das er z.B. als erneute Datenanforderung zum Sender zurückschickt. Dieses Error-Flag wird auch gesetzt, wenn am Ende die Prüfsumme oder die übertragene Bytezahl nicht stimmt.
    Wenn der Sender eine solche Datenanforderung bekommt, wiederholt er z.B. die Datensendung. Bekommt er ein OK vom Empfänger, wird nicht wiederholt.

    Auch hier kann man die Sicherheit weiter erhöhen. Zusätzlich zur Datenanforderung nach einem Fehler kann der Empfänger auch die Daten selbst wieder zurück schicken. Erkennt der Sender, dass die Daten identisch mit seinen gesendeten Daten sind, gibt er das letzte OK an den Empfänger, der dann die Aktion (Bild machen o.ä.) ausführt.
    Dazu braucht man noch ein "Kontroll-Protokoll".
    Z.B.:
    AA-...-AA-00-00-FF-(Error-Flag/Sendeanforderung)-00-00-FF-Empfangene Daten(2 Bytes)-00-00-FF-PP-00-00-FF

    Wie gesagt: Die Sicherheit läßt sich erhöhen, wenn man das braucht! Man kann das alles voll automatisieren, so dass man im Idealfall gar nicht mehr mitbekommt, ob z.B. eine Sendung verloren ging.

    Gruß Dirk

  3. #23
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    14.11.2003
    Beiträge
    813
    Hallo

    Was bedeuten genau diese Zeilen:

    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

    Kennt jemand den Hersteller dieser Module ?
    MFG

  4. #24
    Benutzer Stammmitglied
    Registriert seit
    28.06.2007
    Ort
    Blaustein
    Alter
    57
    Beiträge
    36
    Hallo,

    wenn das auch wissen tät, was die Zeilen da genau machen. Ist irgendeine Initialisierungsroutine. Hab auch schon gesucht, was für "Schalter" da im Funkmodul gesetzt werden.

    Der Hersteller ist Hope RF
    http://www.hoperf.com

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

  5. #25
    Benutzer Stammmitglied
    Registriert seit
    27.05.2007
    Beiträge
    67

    Init RFM12

    Zitat Zitat von Knickohr
    Hallo,

    wenn das auch wissen tät, was die Zeilen da genau machen. Ist irgendeine Initialisierungsroutine. Hab auch schon gesucht, was für "Schalter" da im Funkmodul gesetzt werden.

    Der Hersteller ist Hope RF
    http://www.hoperf.com

    Thomas
    Im Datenblatt ist es beschrieben. Ich hab mal dahinterkommentiert, was ich auf die Schnelle gefunden hab. Den rest müsst ihr Euch selbst raussuchen.

    Temp = Rf12_trans(&Hc0e0)
    Temp = Rf12_trans(&H80d7) 'EL, EF, 433 MHZ Band, 12.0 pF
    Temp = Rf12_trans(&Hc2ab)
    Temp = Rf12_trans(&Hca81) 'FIFO8, Sync, !ff, DR
    Temp = Rf12_trans(&He000) 'NOT USE
    Temp = Rf12_trans(&Hc800) 'NOT USE
    Temp = Rf12_trans(&Hc4f7)

    Es wäre schön, mehr kommentierten Source zu lesen. Schade eigentlich.
    Das ganze ist unter Init beschrieben. Mit Flussdiagramm. Die PDF Datei heisst RF12_code.pdf.
    Beginnt auf der Seite 1 Unterpunkt 2. --> Configuration Setting Command

    Ein Tip. Rechnet mal Hex in Binär um. Dann seht ihr, welches Bit gesetzt ist und welches nicht.
    Hoffe ich konnte helfen.

    Grüße Eisbaeeer

  6. #26
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.02.2005
    Beiträge
    175
    Hallo Leute,

    ja, ich habe auch eine ganze Weile in detektivischer Kleinarbeit geforscht - das Ergebnis deckt sich mit Eisbaeeeers Feststellungen.

    Sollte aber auch kein Problem sein, die Init-Werte als Bitmuster statt im Hex-Code zu übergeben, dann würde es etwas eindeutiger.

    Ich stehe grade am Anfang meiner Forschungen mit den Funkmodulen, bei Bedarf werde ich gerne berichten.
    Der gesamte Code hier basiert wohl auf Bastelbär´s Grundlagen, die er im Paralleluniversum gepostet hat. Klar, ein paar mehr Comments wären schön, aber wollen wir mal froh sein, dass wir überhaupt was haben... \/

    Grüße

    Torsten

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

    Nach ein paar Wochen auch mal wieder was von mir. Hab die letzten beiden Tage damit verbracht, den Code durchzuflöhen und mir ein paar Antworten zu den abgesetzten Befehlen geholt.

    Die genaue Beschreibung der Register gibt es hier : http://www.hoperf.com/pdf/RF12_code.pdf

    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)
    
    Const Rf12freq = 433.92                                                         ' Sende-/Empfangsfrequenz in 0,0025MHz-Schritten
    Const Rf12baud = 700                                                            ' Baudrate (>663)
    Const Maxchar = 17                                                              ' Anzahl der übertragenen Zeichen
    
    '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
    
    Spiinit
    
    Dim Count As Byte
    Dim Temp As Word
    Dim Rfdata(32) As Byte
    Dim Text As String * Maxchar At Rfdata Overlay
    
    'Locate 1 , 1 : Lcd "Init RFM12      "
    'Waitms 100
    Call Rf12_init                                                                  ' ein paar Register setzen
    'Locate 1 , 1 : Lcd "Set Frequenz    "
    'Waitms 100
    Call Rf12_setfreq(rf12freq)                                                     ' Sende/Empfangsfrequenz einstellen
    'Locate 1 , 1 : Lcd "Set Bandwith    "
    'Waitms 100
    Call Rf12_setbandwith(4 , 0 , 4)                                                ' 200kHz Bandbreite, 0dB Verstärkung, DRSSI threshold: -79dBm
    'Locate 1 , 1 : Lcd "Set Baudrate    "
    'Waitms 100
    Call Rf12_setbaud(rf12baud)                                                     ' Setzt Baud
    'Locate 1 , 1 : Lcd "Set Tx-Power    "
    'Waitms 100
    Call Rf12_setpower(0 , 6)                                                       ' 0dBm Ausgangangsleistung, 105kHz 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
    '   Locate 1 , 1 : Lcd "Empfange        "
    '   Locate 2 , 1 : Lcd "                "
       Call Rf12_rxdata(maxchar)
    '   Locate 2 , 1 : Lcd Text
       Waitms 25
    '   Pulseout Portb , 1 , 500                                                    ' Schleifenkontrolle
    '   Locate 1 , 1 : Lcd "Sende           "
       Call Rf12_txdata(maxchar)
    '   Locate 1 , 1 : Lcd "Ready           "
    '   Waitms 100
    Loop
    
    End
    
    ' ########################################################################
    ' ###### Unterroutinen
    ' ########################################################################
    
    Sub Rf12_init:
       Waitms 150
       Temp = Rf12_trans(&Hc0e0)                                                    ' Low Battery Detector and Microcontroller Clock Divider Command
       Temp = Rf12_trans(&H80d7)                                                    ' Configuration Setting Command
       Temp = Rf12_trans(&Hc2ab)                                                    ' Data Filter Command
       Temp = Rf12_trans(&Hca81)                                                    ' Output and FIFO mode Command
       Temp = Rf12_trans(&He000)                                                    ' Wake-Up Timer Command
       Temp = Rf12_trans(&Hc800)                                                    ' Low Duty-Cycle Command
       Temp = Rf12_trans(&Hc4f7)                                                    ' AFC Command Part 1
    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                                                         ' Frequency Setting Command
       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                                                         ' Receiver Control Command, VDI Output
       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                                                      ' Data Rate Command
       Else
          Ltemp = 344828 / Rfbaud
          Temp = Ltemp
          Temp = Temp + &HC600                                                      ' Data Rate Command
       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                                                         ' AFC Command Part 2
       Temp = Rf12_trans(temp)
    End Sub
    
    Sub Rf12_txdata(byval Maxchar As Byte)
       Temp = Rf12_trans(&H8238)                                                    ' Power Management Command, Sender einschalten
       Rf12_ready
       Temp = Rf12_trans(&Hb8aa)                                                    ' Transmit Register Write Command (sendet AA zur Synchronisation)
       Rf12_ready
       Temp = Rf12_trans(&Hb8aa)                                                    ' Transmit Register Write Command (sendet AA zur Synchronisation)
       Rf12_ready
       Temp = Rf12_trans(&Hb8aa)                                                    ' Transmit Register Write Command (sendet AA zur Synchronisation)
       Rf12_ready
       Temp = Rf12_trans(&Hb82d)                                                    ' Transmit Register Write Command (sendet 2D für was auch immer)
       Rf12_ready
       Temp = Rf12_trans(&Hb8d4)                                                    ' Transmit Register Write Command (sendet D4 für was auch immer)
       Rf12_ready
       For Count = 1 To Maxchar
          Rf12_ready
          Temp = &HB800 + Rfdata(count)                                             ' Transmit Register Write Command (sendet Daten)
          Temp = Rf12_trans(temp)
       Next Count
       Rf12_ready
       Temp = Rf12_trans(&H8208)                                                    ' Power Management Command, Sender + Empfänger ausschalten
    End Sub
    
    Sub Rf12_rxdata(byval Maxchar As Byte)
       Temp = Rf12_trans(&H82c8)                                                    ' Power Mangement Command, Empfänger einschalten
       Temp = Rf12_trans(&Hca81)                                                    ' Output and FIFO Mode Command
       Temp = Rf12_trans(&Hca83)                                                    ' Output and FIFO Mode Command
       For Count = 1 To Maxchar
          Rf12_ready
          Temp = Rf12_trans(&Hb000)                                                 ' Receiver FIFO Read Command
          Rfdata(count) = Temp
       Next Count
       Temp = Rf12_trans(&H8208)                                                    ' Power Management Command, Sender + Empfänger ausschalten
    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
       Do
       Loop Until Spi_sdo = 1
    End Sub
    Hab den Code ein wenig dokumentiert. Jetzt sollte es eigentlich jedem möglich sein, raus zu finden was das Programm macht. Ein paar Fragen sind aber trotzdem noch offen. Warum muß man in der Senderoutine noch ein paar Daten vorher senden ???

    Sub Rf12_txdata(byval Maxchar As Byte)
    Temp = Rf12_trans(&H823 ' Power Management Command, Sender einschalten
    Rf12_ready
    Temp = Rf12_trans(&Hb8aa) ' Transmit Register Write Command (sendet AA zur Synchronisation)
    Rf12_ready
    Temp = Rf12_trans(&Hb8aa) ' Transmit Register Write Command (sendet AA zur Synchronisation)
    Rf12_ready
    Temp = Rf12_trans(&Hb8aa) ' Transmit Register Write Command (sendet AA zur Synchronisation)
    Rf12_ready
    Temp = Rf12_trans(&Hb82d) ' Transmit Register Write Command (sendet 2D für was auch immer)
    Rf12_ready
    Temp = Rf12_trans(&Hb8d4) ' Transmit Register Write Command (sendet D4 für was auch immer)
    Rf12_ready
    For Count = 1 To Maxchar
    Rf12_ready
    Temp = &HB800 + Rfdata(count) ' Transmit Register Write Command (sendet Daten)
    Temp = Rf12_trans(temp)
    Next Count
    Rf12_ready
    Temp = Rf12_trans(&H820 ' Power Management Command, Sender + Empfänger ausschalten
    End Sub

    Und was macht DRSSI threshold ? Wofür braucht man das ?

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

  8. #28
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.08.2006
    Beiträge
    118

    RFM Ubertragungsprotokoll

    Hallo Leute,
    hab in Vorbereitung einer Master-Slave RFM12 Kommunikation
    unter

    http://www.iphpbb.com/board/ftopic-1...x63949-87.html

    lauffähige Bascom Testcode (Master/Slave) fürs Datenprotokoll hinterlegt.
    Downloadlink sollte auch da zu finden sein.

    Die Code werden nach und nach vervollständigt.

    Wigbert

Seite 3 von 3 ErsteErste 123

Berechtigungen

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

Labornetzteil AliExpress