Software zum SNAP-Protokoll

www.comwebnet.de
Verfügbare Informationen zu "Software zum SNAP-Protokoll"

  • Qualität des Beitrags: 0 Sterne
  • Beteiligte Poster: Kurzschluss - avrnix - radebeul
  • Forum: www.comwebnet.de
  • Forenbeschreibung: AVR Mikrocontroller und Elektronik - Forum - www.comwebnet.de
  • aus dem Unterforum: SNAP-Protokoll für RFM12 - Sven Härtig
  • Antworten: 6
  • Forum gestartet am: Mittwoch 25.10.2006
  • Sprache: deutsch
  • Link zum Originaltopic: Software zum SNAP-Protokoll
  • Letzte Antwort: vor 15 Jahren, 1 Monat, 27 Tagen, 10 Stunden, 19 Minuten
  • Alle Beiträge und Antworten zu "Software zum SNAP-Protokoll"

    Re: Software zum SNAP-Protokoll

    Kurzschluss - 11.11.2007, 00:35

    Software zum SNAP-Protokoll
    Hallo....
    Hier werde ich die Quelldateien zum SNAP-RFM12 Projekt reinstellen

    @AVRNIX: Danke für das neue Brett...

    Zu Hintergrundwissen zum Thema SNAP:
    siehe hier: www.hth.com/snap

    Noch als HINWEIS: weil da schon Fragen dazu kamen
    Da das Protokoll frei skalierbar ist, kann man auch mit festen
    Datenlängen arbeiten oder ne andere CRC-Methode nehmen ...usw.


    Hier der Testslave mit M32 auf dem Pollinboard

    Im mainloop könnte der AVR noch andere Aufgaben bekommen...

    Nur wenn Daten im FIFO vom RF12 liegen,
    werde diese per ISR eingelesen.
    In der Interruptroutine wird dann auf das Startzeichen (SYNC-Byte)
    synchronisiert und nach Auswertung der Nutzbyteanzahl das gesamte
    Datenpaket reingeholt. Danach wird der RF12 abgeschaltet und der Interrupt gesperrt.

    per RF_RXD Flag wird im Mainloop die Auswertung des SNAP-Frames
    ausgelöst. Hier wird dann der Frame mit ACK/NACK-Info den Master zurückgesendet.

    Wenn die Verarbeitung Abgeschlossen ist wird per:
    gosub RF12_RXD_ON der Empfänger wird scharf gemacht


    Code:
    '#######################################
    'Testempfänger SNAP-Protokoll über RF12
    'info about SNAP-Protokoll:         www.hth.com/snap
    'info about RF12 Transceiver:       www.hoprf.com or www.integration.com
    'info about using RF12 with Bascom: www.comwebnet.de
    'Version: v1.02
    'Author:  Kurzschluss
    '#######################################
    ' The packet structure is defined in the received packets first two
    ' bytes (HDB2 and HDB1). The following packet structure is used.
    '
    ' DD=01     - 1 Byte destination address
    ' SS=01     - 1 Byte source address
    ' PP=00     - No protocol specific flags
    ' AA=01     - Acknowledge is required
    ' D=0       - No Command Mode
    ' Overview of header definition bytes (HDB2 and HDB1)
    '
    '         HDB2             HDB1
    ' +-----------------+-----------------+
    ' | D D S S P P A A | D E E E N N N N |
    ' +-----------------+-----------------+
    '$regfile   = "m8def.dat"
    $regfile   = "m32def.dat"
    $hwstack   = 128
    $swstack   = 128
    $framesize = 128
    $PROG &HFF,&HFF,&H99,&H00   ' für Mega32
    $crystal =  8000000
    '$crystal = 10000000                                         '
    $baud = 19200
    Baud  = 19200

    Const Rf12freq = 433.92   'Kanal-Einstellung
    Const Rf12baud = 19200    'Baudrate
    Const MyAdress = 20       'Nodeadresse vom Teilnehmer
    Const SNAP_SYNC= &H54     'Synczeichen SNAP-Protokoll
    Const Maxchar  = 32

    Dim lv As Byte
    Dim Temp As Word
    Dim RF12_data (40) As Byte  ,RF12_S As String * Maxchar At RF12_data Overlay
    Dim RF_RXD as Bit, RF_SYNC as Bit
    Dim NDB  as Byte , Framelength as  Byte ,crc as Byte
    Dim ByteAnzahl  as Byte 'Anzahl Sendebytes
    Dim S As String * 10
    SYNC Alias RF12_data(1)
    HDB2 Alias RF12_data(2)    'Achtung HDB2 liegt in unterem Byte
    HDB1 Alias RF12_data(3)
    DAB1 Alias RF12_data(4)
    SAB1 Alias RF12_data(5)

    '----------[Hardwaresetup für Pollin Funkboard]---------------------------------------------
    'PortD.3-->INT1 an FFIT --Interrupt(High) wenn FiFO-Buffer voll (ef-Bit set)
    LED1 Alias Portd.6   :  Config Portd.6 = Output
    LED2 Alias Portd.5   :  Config Portd.5 = Output
    '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
    ' werden benötigt für rf12_ready
    ' Achtung je nach µC anpassen !!!
    ' für M8:  Spi_cs Alias Portb.2 :   Spi_sdo Alias Pinb.4          ' SS-Pin
    'M32:
    Spi_cs  Alias Portb.4 :  DDRB.4=1      'Config Spi_cs = Output  chipselect
    Spi_sdo Alias Pinb.6                   ' MISO-PIN
    Set Spi_cs
    Spiinit   'init the spi pins
    goto Startup

    $include "inc_RF12-Treiber.bas"        'RF12 Treiber einbinden

    '--------[Initialisierung]------------------------------------------------
    Startup:
    Config Int1 = Rising
    On Int1 FFIT_ISR:
    On Urxc RXD_ISR:                                          'Interrupt Empfange String von RXD
    Enable Urxc                                               'Einschalten
    Enable Interrupts                                           'Zulassen

    set LED2
    Print "Init RF12 ..."
    Call Rf12_init                                              '  ein paar Register setzen (z.B. CLK auf 10MHz)
    Call Rf12_setfreq(rf12freq)                                 '  Sende/Empfangsfrequenz auf 433,92MHz einstellen
    Call Rf12_setbandwith(4 , 1 , 4)                            '  200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm
    Call Rf12_setbaud(rf12baud)                                 '  19200 baud
    Call Rf12_setpower(0 , 6)                                   '  1mW Ausgangangsleistung, 120kHz Frequenzshift
    Print "Init RF12 Done"
    reset LED2

    '----------[Mainloop]------------------------------------------------------
    RF12_S =""
    gosub RF12_RXD_ON

    Do

      if  RF_RXD=1 then
          print "RX ready, Framelength: "; Framelength
          gosub Framehandler
          gosub RF12_RXD_ON
          end IF
     'do anything....
      print "neuer Mainloop"
      waitms 250
    Loop
    End

    '----------[Frameverarbeitung SNAP-Protokoll]------------------------------------
    Framehandler:
     set LED1
     Print "Frame: ";                                                   'Debugausgabe
     For lv = 1 To Framelength
          Print hex(RF12_data(lv)) ;" ";
          Next lv
     print
     if SYNC= SNAP_SYNC then                                              'sync.Zeichen IO?
        if HDB2= &H50 then                                                '1Byte Adressierung?
           'if HDB2= NDB then                                             '0..32 Datenbyte
               if DAB1= MyAdress then                                     'Adresse prüfen
                  print "Das war für mich!...von Nr.:";RF12_data(5)       'Datenverarbeitung
                  crc=Framelength-2 'nur temporär Länge für crc-Check
                  crc=crc8(RF12_data(2),crc)
                  'Achtung!!! erst nach crc Adressen swapen!!! sonst ist die crc falsch
                  swap DAB1,SAB1                                          'Adressen umdrehen für Rücksenden
                  if crc=RF12_data(Framelength) then                            'CRC OK?
                     print "CRC OK! => ";hex(crc)
                     ' Send ACK (i.e tell master that packet was OK)
                     Hdb2 = Hdb2 Or &B00000010                      ' Set ACKs bit in HDB2 (xxxxxx10)
                     Hdb2 = Hdb2 And &B11111110
                     'do ...
                     gosub SENDEN                                    'Anwortframe senden--> nur als Slave
                     gosub CMD_HANDLER
                     'RF12_data(2 <--- ackno machen
                     else
                     print "CRC Bad => ";hex(crc)
                     ' Send NAK (i.e tell master that packet was bad)
                     ' Set ACK bits in HDB2 (xxxxxx11)
                     Hdb2 = Hdb2 Or &B00000011
                     gosub SENDEN                                    'Anwortframe senden--> nur als Slave
                     end IF
                  else
                  print "geht mich nix an!...von Nr.:";RF12_data(5)
                  end IF
            'else
              'print "Framelength NIO!!!"
              'end IF
           else
           print "no 1Byte Adress!!! : ";hex(HDB2)
           end IF
        else
        print "no Syncbyte!!! : ";hex(SYNC)

        end IF
      waitms 10
      reset LED1
    return



    '------[CMD-Interpreter]-------------------------------------
    CMD_handler:              'Auswertung der Nutzdaten.... nur als Denkhilfe :)
    '(
    select case RF12_data(7)
           case  0 :
           case  1 :  gosub Rolloaufmachen
           case  2 :  gosub Rollozumachen
           case 10 :  gosub HoleTemperatur
           end SELECT
    ')
    for lv=1 to 20
        Toggle LED2                                 'mache was...
        waitms 100
        next lv
    return




    '----------[RF12 Empfänger einschalten]---------------------------
    RF12_RXD_ON:
       lv=1
       RF_SYNC=0 'sync-Flag
       RF_RXD=0
       RF12_S=""
       Framelength=6                       'erst mit 3.Byte kann die Framelänge berechnet werden
       Temp = Rf12_trans(&H82c8)           'Power CMD: Empfänger an, Quarz-clk läuft weiter
       Temp = Rf12_trans(&Hca81)           'FIFO&Reset CMD: sensitiver Reset aus (Brownout)
       Temp = Rf12_trans(&Hca83)           'FIFO&Reset CMD: Synchroner Zeichenemfang (warte auf Startzeichen: 2DD4)
       Enable Int1
    return

    '----------[RF12 Daten Senden]-------------------------------------
    Senden:
      set LED2
      ' Waitms 1
      Print "Sende: "
      For lv = 1 To Framelength
          Print hex(RF12_data(lv)) ;" ";
          Next lv
      print
      Call Rf12_txdata(Framelength)
      Waitms 10
      reset LED2
    return

    '----------[Uart ISR(Daten vom PC)]--------------------------------
    RXD_ISR:
      S = S + Chr(udr)
    Return

    '----------[INT1 ISR(Daten vom RF12)]--------------------------------
    FFIT_ISR:
     Temp = Rf12_trans(&Hb000)
     Temp = Temp and &H00FF
     if temp = &H54 and RF_SYNC=0 then             'Synchronzeichen empfangen-->an 1 Stelle
        RF_SYNC=1
        lv=1
        end IF
     RF12_data(lv) = Temp                          'Empfangsbyte in Buffer legen
     if lv=3 then                                  'ermitteln der Anzahl Datenbytes (SNAP)
        NDB =  Temp and &H0F                       'unteres Nipple von HDB1 enthält Datenlänge
        select case NDB                            '6Byte<=sync+HDB2+HDB1+DAB+SAB+CRC
               case 0 to 8: Framelength=6+NDB      '6-14 (0--8 Datebyte)
               case 9     : Framelength=6+16       '22   (16 Datenbyte)
               case 10    : Framelength=6+32       '38   (32 Datenbyte)
               end SELECT
        end IF
     If lv>=Framelength Then                       'alles eingetroffen
        RF_RXD=1                                   'Flag setzen und Empfänger abschalten
        Temp = Rf12_trans(&H8208)                  'Power_CMD: Empfänger aus, Quarz-clk läuft weiter
        disable INT1
        End If
     incr lv                                       'Zeiger incr
    Return



    Bitte Hinweise und Tipps hier reinstellen....

    Achtung!!!!: das hier ist alles noch Alpha-Stadium...
    wer Fehler findet Bitte im Forum mitteilen


    Viel Spass und Erfolge beim Testen

    Kurzschluss

    PS.: hab bemerkt, wenn man unter Optionen:
    HTML in diesem Beitrag deaktivieren setzt
    wird der Codeabschnitt nicht verstümmelt, was neulich pasiert ist....



    Re: Software zum SNAP-Protokoll

    avrnix - 11.11.2007, 11:01


    hallo Kurzschluss,

    Danke erstmal für dein Projekt, bitte erstelle noch paar Topics
    für Hardware und Fehlermeldunge, damit man schnell was finden kann.
    Und nicht alles durcheinander in der Rubrick ist.

    Natürlich kannst du auch mehr Unterverzeichnisse erstellen, z.B Diskussion über Hardware etc.

    So noch viel erfolg und rege Teinahme :P



    Re: Software zum SNAP-Protokoll

    Kurzschluss - 22.11.2007, 23:32


    Hi @ all

    hier nochmal komplett mein Testsender
    der läuft auf der dem dem hier vorgestellten Test-Board:

    http://www.comwebnet,de Projekt RMF12 Modul Tranceiver 433 MHz
    von Wigbert Picht und Dirk Milewski


    Code:
    '#######################################
    'Testsender SNAP-Protokoll über RF12  Ansteuerung Rollo zumachen, aufmachen, Temperatur abfragen....
    'info about SNAP-Protokoll:         www.hth.com/snap
    'info about RF12 Transceiver:       www.hoprf.com or www.integration.com
    'info about using RF12 with Bascom: www.comwebnet.de
    'Version: v2.00
    'Author:  Kurzschluss
    '#######################################
    ' The packet structure is defined in the received packets first two
    ' bytes (HDB2 and HDB1). The following packet structure is used.
    '
    ' DD=01     - 1 Byte destination address
    ' SS=01     - 1 Byte source address
    ' PP=00     - No protocol specific flags
    ' AA=01     - Acknowledge is required
    ' D=0       - No Command Mode
    ' EEE=100   - 16-bit CRC-CCITT
    ' NNNN=0010 - 2 Byte data
    '
    ' Overview of header definition bytes (HDB2 and HDB1)
    '
    '         HDB2             HDB1
    ' +-----------------+-----------------+
    ' | D D S S P P A A | D E E E N N N N |
    ' +-----------------+-----------------+
    '
    'only  TX-Test!!!!!!!!!!!!!!!!!!
    $regfile    = "m8def.dat"
    '$regfile   = "m32def.dat"
    $hwstack    = 128
    $swstack    = 128
    $framesize  = 64
    '$PROG &HFF,&HFF,&H99,&H00   ' für Mega32
    $PROG &HFF,&HE4,&HD9,&H00    ' Mega8 mit internen 8MHz
    $crystal =  8000000
    '$crystal = 10000000                                         '
    $baud = 19200
    Const Rf12freq = 433.92   'Kanal-Einstellung
    Const Rf12baud = 19200    'Baudrate
    Const MyAdress = 10       'NodeAdress
    Const SNAP_SYNC= &H54     'Synczeichen SNAP-Protokoll
    'RF-Variablen
    Dim lv As Byte
    Dim Temp As Word
    Dim RF12_data(40) As Byte , RF12_S As String * 40 At RF12_data Overlay
    Dim ByteAnzahl    As Byte , Framelength as Byte ,crclength as Byte 'Anzahl Sendebytes
    'Uart-Variablen
    Dim RX_Data as Byte,   N as Byte, Rxd_ready as Bit
    Dim Buffer(40) as Byte,s_buffer as String * 40 At buffer overlay

    '--------------[Hardwaresetup für Pollin Funkboard]-----------------------------------
    'PortD.3-->INT1 an FFIT --Interrupt(High) wenn FiFO-Buffer voll (ef-Bit set)
    LED1 Alias Portd.5
    LED2 Alias Portd.6
    Config Portd.5 = Output
    Config Portd.6 = Output

    'config the SPI in master mode.The clock must be a quarter of the slave cpu
    Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 128 , Noss = 1
    ' werden benötigt für rf12_ready
    ' Achtung je nach µC Port/Pins anpassen !!!
    ' M8:
    Spi_cs Alias Portb.2 :   DDRB.2=1
    Spi_sdo Alias Pinb.4      ' SS-Pin
    'M32:
    'Spi_cs  Alias Portb.4 :  DDRB.4=1
    'Spi_sdo Alias Pinb.6
    Set Spi_cs
    Spiinit               'init the spi pins
    goto Startup
    $include "inc_RF12-Treiber.bas"    'Treiber einbinden


    Startup:

    On Urxc RXD_ISR                                              'Interrupt Empfange String von RXD
    'Enable Urxc                                                 'Einschalten
    'Enable Interrupts                                           'Zulassen

    set LED2
    Print "Init"
    Call Rf12_init                                              ' ein paar Register setzen (z.B. CLK auf 10MHz)
    Call Rf12_setfreq(rf12freq)                                 '  Sende/Empfangsfrequenz auf 433,92MHz einstellen
    Call Rf12_setbandwith(4 , 1 , 4)                            '  200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm
    Call Rf12_setbaud(rf12baud)                                 '  19200 baud
    Call Rf12_setpower(0 , 6)                                   '  1mW Ausgangangsleistung, 120kHz Frequenzshift
    reset LED2
    for lv=1 to 40
         RF12_data(lv)=8 'lv+20        'Testdaten füllen
         next
    'TXS =""

    '--------[mainloop]------------------------------------------------------
    Do
      'if Rxd_ready=1 then.....     'evtl....Daten von Uart(PC) in RFTX schieben
      ByteAnzahl= rnd(10)           'zum Test zufällige Nutzdatenlänge 0...32Byte
      rf12_err=0                                                'Error Flag löschen
      gosub SendSnapFrame
      if rf12_err=1 then
         print "Timeout beim Senden aufgetreten"                'DebugInfo: Problem beim senden
         end IF
      wait  5
    Loop

    End 'end program


    '------[Send Frame over RF12]---------------------------------
    SendSnapFrame:
    'Header aufbereiten (SNAP)
      RF12_data(1) = SNAP_SYNC
      RF12_data(2) = &H50                         'HDB2  1Byte-Adressen
      RF12_data(3) = ByteAnzahl                   'HDB1  0..32DatenByteInfo
      RF12_data(4) = 20                           'Zieladresse
      RF12_data(5) = MyAdress                     'Senderadresse
      'ab 6.Stelle <--0...32 Datenbyte rein
      select case ByteAnzahl                    '6Byte<=sync+HDB2+HDB1+DAB+SAB+CRC
               case 0 to 8:                     '6-14 (0--8 Datebyte)
               case 9     : ByteAnzahl=16       '22   (16 Datenbyte)
               case 10    : ByteAnzahl=32       '38   (32 Datenbyte)
               end SELECT
      Framelength = ByteAnzahl +6
      crclength   = Framelength-2
      RF12_data(10) = ByteAnzahl                                  'Datenlänge in DB mitsenden
      RF12_data(Framelength)= crc8(RF12_data(2),crclength)        'CRC Anhängen und raus senden
      Print "Sende Frame"
      Call Rf12_txdata(Framelength)                               'Senden
      Waitms 10
    return


    '------[Uart ISR]----------------------------------------------
    Rxd_isr:                                               '
     Rx_data = Udr                                         'Zeichen aus Uart holen
     Incr N                                                'Pointer hochzählen
     If Rx_data = 123 Then N = 1                           ' { -- synchronisation Vorzeichen in der ersten Stelle
     If Rx_data = 125 or n>10 Then Rxd_ready = 1           ' } -- Wenn Endekennung eingetroffen --> CMD-Frameende eingetroffen
     Buffer(n) = Rx_data                                   'Byte in Buffer
    Return




    Die Sendehäufigkeit ist hier nur durch die Wait-Anweisung im mainloop begrenzt.
    Ansonsten erfolgt eine endlos Wiederholung mit ständig anderer Datenbyteanzahl,
    wodurch die Framelänge und die CRC bei jedem Sende-Paket variiert.


    Grüsse
    Kurzschluss



    Re: Software zum SNAP-Protokoll

    Kurzschluss - 02.12.2007, 16:01


    Hallo

    für alle die die Rollosteuerung bauen wollen (siehe Hardware)...
    mein aktueller Softwarestand


    Code:

    ' #######################################################################
    ' #  SlaveNode RolloModul
    ' #  zur Ansteuerung eines Rollomotors
    ' #  Taste1 & Taste2 zur Handsteuerung, per RF12 Zentralansteuerung
    ' #  Zentrale kann die jeweilige Raumtemperatur auslesen (LM75)
    ' #  info about SNAP-Protokoll:         www.hth.com/snap
    ' #  info about RF12 Transceiver:       www.hoprf.com or www.integration.com
    ' #  info about using RF12 with Bascom: www.comwebnet.de
    ' #  Version: v1.03
    ' #  Author:  Kurzschluss
    ' ########################################################################
    ' DD=01     - 1 Byte destination address
    ' SS=01     - 1 Byte source address
    ' PP=00     - No protocol specific flags
    ' AA=01     - Acknowledge is required
    ' D=0       - No Command Mode
    ' EEE=011   - 8-bit CRC-CCITT
    ' NNNN=0100 - 4 Byte data (Steuerbyte, Reservebyte, Messdaten-LSB, Messdaten-MSB
    ' Overview of header definition bytes (HDB2 and HDB1)
    '         HDB2             HDB1
    ' +-----------------+-----------------+
    ' | D D S S P P A A | D E E E N N N N |
    ' +-----------------+-----------------+

    $regfile   = "m8def.dat"
    $PROG &HFF,&HC4,&HD9,&H00  ' Mega mit intern 8MHz
    $hwstack   = 96
    $swstack   = 96
    $framesize = 96

    $crystal =  8000000
    '$crystal = 10000000                                         '
    $baud = 19200
    Baud  = 19200

    Const Rf12freq = 433.92   'Kanal-Einstellung
    Const Rf12baud = 19200    'Baudrate
    Const MyAdress = 20       'Nodeadresse vom Teilnehmer
    Const SNAP_SYNC= &H54     'Synczeichen SNAP-Protokoll
    Const T2reload = 178
    Const Lm75slavewrite = &H9D
    Const Lm75slaveread  = &H9F

    Dim lv As Byte
    Dim Timeout As Word , Ticks As Byte, Sec_flag as Bit
    Dim Temp As Word
    Dim RF12_data (40) As Byte
    Dim RF12_S As String * 40 At RF12_data Overlay
    Dim RF_RXD as Bit, RF_SYNC as Bit
    Dim NDB as Byte , Framelength as  Byte ,crc as Byte
    Dim ByteAnzahl  as Byte    'Anzahl Sendebytes
    Dim Rx_data as Byte, N as Byte , Rxd_ready as Bit
    Dim Buffer (20) As Byte
    Dim Auf_Flag as Bit, Zu_Flag as Bit
    Dim Lm75high As Byte, Lm75low  As Byte
    Dim Temperatur As Integer , X As Word
    Dim Nachkommastelle(10) As Byte
    Dim Mess_flag as Bit       'Task-Flag Temperaturmessen
    Dim W As Word , Channel As Byte, S As Byte , I As Byte
    SYNC Alias RF12_data(1)
    HDB2 Alias RF12_data(2)    ' HDB2 liegt in unterem Byte
    HDB1 Alias RF12_data(3)
    DAB1 Alias RF12_data(4)
    SAB1 Alias RF12_data(5)
    CMD  Alias RF12_data(6)


    '------[Hardwaresetup]---------------------------------------------
    'PortD.3-->INT1 an FFIT --Interrupt(High) wenn FiFO-Buffer voll (ef-Bit set)
    LED1     Alias Portd.2
    LED2     Alias Portd.4
    LED3     Alias Portd.5
    Relais1  Alias Portd.6
    Relais2  Alias Portd.7
    DDRD=&b1111_0111        'PD3-INT1
    Taste0   Alias Pinc.0                                         'Rolloschalter Taste1
    Taste1   Alias Pinc.1                                         'Rolloschalter Taste2
    '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
    ' ############ Achtung je nach µC anpassen !!!' werden benötigt für rf12_ready #############
    ' für M8:
    Spi_cs  Alias Portb.2 :  DDRB.2=1
    Spi_sdo Alias Pinb.4
    'M32:
    'Spi_cs  Alias Portb.4 :  DDRB.4=1      'Config Spi_cs = Output  chipselect
    'Spi_sdo Alias Pinb.6                   ' MISO-PIN
    Set Spi_cs
    Spiinit   'init the spi pins
    Config Scl     = Portb.4
    Config Sda     = Portb.5
    config Timer2  =Timer,Prescale=1024
    Config Int1    = Rising
    On Timer2  Timer2_isr                                       'systemticks
    On Int1    FFIT_ISR
    On Urxc    RXD_ISR                                         'Interrupt Empfange String von RXD

    goto Startup
    $include "inc_RF12-Treiber.bas"                            'RF12 Treiber einbinden

    '------[Initialisierung]------------------------------------------------
    Startup:
    Enable Timer2
    Enable Urxc                                                 'Einschalten
    Enable Interrupts                                           'Zulassen

    set LED1
    Print "Init RF12 ..."
    Call Rf12_init                                              '  ein paar Register setzen (z.B. CLK auf 10MHz)
    Call Rf12_setfreq(rf12freq)                                 '  Sende/Empfangsfrequenz auf 433,92MHz einstellen
    Call Rf12_setbandwith(4 , 1 , 4)                            '  200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm
    Call Rf12_setbaud(rf12baud)                                 '  19200 baud
    Call Rf12_setpower(0 , 6)                                   '  1mW Ausgangangsleistung, 120kHz Frequenzshift
    Print "Init RF12 Done"
    reset LED1
    Start Timer2

    '------[Mainloop]------------------------------------------------------
    gosub RF12_RXD_ON                                           'Empfänger einschalten

    Do
      'Wippentaster checken(Handbedienung des Fensterrollos)
      If Taste0 = 0 And Taste1 = 1 then Auf_Flag=1
      If Taste0 = 1 And Taste1 = 0 then Zu_Flag=1
      'Datenempfang checken
      if  RF_RXD=1 then
          'set LED2
          'print "RX ready, Framelength: "; Framelength
          gosub Framehandler
          gosub RF12_RXD_ON
          'reset LED2
          end IF
      If Auf_Flag =1 Then Gosub Rolloaufmachen    'Task aufmachen
      If Zu_Flag  =1 Then Gosub Rollozumachen     'Task zumachen
      If Mess_flag=1 Then Gosub HoleTemperatur    'Task Temperatur messen
      waitms 50
      toggle LED3                                 'Loop-LED  Debughilfe
    Loop
    End


    '------[Rollo senken]------------------------------------------------------
    Rollozumachen:                                              '20sec Motor an runterfahren
    Zu_Flag=0
    print"close roller blind"
    Timeout = 2000                                              '20sec
    Relais1 = 1 : Relais2 = 0
    Bitwait Taste0 , Set : Waitms 300
    Do                                                          'Warte Zeit oder Abbruch durch User
    Loop Until Timeout = 0 Or Taste0 = 0 Or Taste1 = 0
    Relais1 = 0 : Relais2 = 0
    Bitwait Taste0 , Set
    Bitwait Taste1 , Set
    print"Ready"
    Waitms 200
    Return

    '------[Rollo heben]------------------------------------------------------
    Rolloaufmachen:                                             '20sec Motor an hochfahren
    Auf_Flag=0
    print"open roller blind"
    Timeout = 2000                                              '20sec
    Relais1 = 0 : Relais2 = 1
    Bitwait Taste1 , Set : Waitms 300
    Do                                                          'Warte Zeit oder Abbruch durch User
    Loop Until Timeout = 0 Or Taste0 = 0 Or Taste1 = 0
    Relais1 = 0 : Relais2 = 0
    Bitwait Taste0 , Set
    Bitwait Taste1 , Set
    print"Ready"
    Waitms 200
    Return


    '------[aktuelle Temperatur holen]------------------------------------------
    HoleTemperatur:
       Mess_flag=0
       I2cstart
       I2cwbyte Lm75slaveread
       I2crbyte Lm75high , Ack
       I2crbyte Lm75low , Nack
       I2cstop
       If Lm75high > 127 Then
          Temperatur = Lm75high And 127
          Temperatur = Not Temperatur
          Incr Temperatur
          Else
          Temperatur = Lm75high
          End If
       Lm75low = Lm75low And 128
       If Lm75low > 0 Then
          Nachkommastelle(s) = 5
          Else
          Nachkommastelle(s) = 0
          End If
       'GMW über 10 Stützstellen
       Incr S : If S > 10 Then S = 1
       X = 0
       For I = 1 To 10
           X = X + Nachkommastelle(i)
           Next I
       X = X / 10
    return


    '------[Frameverarbeitung SNAP-Protokoll]------------------------------------
    Framehandler:
     'set LED1
     Print "Frame: ";
     For lv = 1 To Framelength
          Print hex(RF12_data(lv)) ;" ";
          Next lv
     print
     if SYNC= SNAP_SYNC then                                              'sync.Zeichen IO?
        if HDB2= &H50 then                                                '1Byte Adressierung?
           'if HDB2= NDB then                                             '0..32 Datenbyte
               if DAB1= MyAdress then                                     'Adresse prüfen
                  print "Adresse IO...von Nr.:";RF12_data(5)       'Datenverarbeitung
                  crc=Framelength-2 'nur temporär Länge für crc-Check
                  crc=crc8(RF12_data(2),crc)
                   'Achtung!!! erst nach crc Adressen swapen!!! sonst ist die crc falsch
                  swap DAB1,SAB1                                          'Adressen umdrehen für Rücksenden
                  if crc=RF12_data(Framelength) then                  'CRC OK?
                     print "CRC OK! => ";hex(crc)
                     ' Send ACK ( OK)
                     ' Set ACKs bit in HDB2 (xxxxxx10)
                     Hdb2 = Hdb2 Or &B00000010
                     Hdb2 = Hdb2 And &B11111110
                     gosub CMD_HANDLER                               'Kommandausführung
                     gosub SENDEN                                    'Anwortframe senden
                     else                                            'bei CRC --> NIO keine Verarbeitung
                     print "CRC Bad => ";hex(crc)                    'nur Antwort mit NAK zum Master
                     ' Send NAK (NIO)
                     ' Set ACK bits in HDB2 (xxxxxx11)
                     Hdb2 = Hdb2 Or &B00000011
                     gosub SENDEN
                     end IF
                  else
                  print "geht mich nix an!...von Nr.:";RF12_data(5)
                  end IF
            'else
              'print "Framelength NIO!!!"
              'end IF
           else
           print "no 1Byte Adress!!! : ";hex(HDB2)
           end IF
        else
        print "no Syncbyte!!! : ";hex(SYNC)
        end IF
      waitms 10
      'reset LED1
    return
    '------[CMD-Interpreter]-------------------------------------
    CMD_handler:
    select case CMD
           case  0 :  Print "NodeTest over RFM12"
           case  1 :  Auf_Flag=1
           case  2 :  Zu_Flag =1
           case 10 :  'Temperaturwert in Datenbytes packen....
                      RF12_data(8)=low(X)
                      RF12_data(9)=high(x)
           case else: print "unkown instruction"
           end SELECT
    return


    '------[RF12 Empfänger einschalten]---------------------------
    RF12_RXD_ON:
       lv=1
       RF_SYNC=0 'Flags rücksetzen und alten Datenframe löschen
       RF_RXD=0
       RF12_S=""
       Framelength=6                       'erst mit 3.Byte kann die Framelänge berechnet werden
       Temp = Rf12_trans(&H82c8)           'Power CMD: Empfänger an, Quarz-clk läuft weiter
       Temp = Rf12_trans(&Hca81)           'FIFO&Reset CMD: sensitiver Reset aus (Brownout)
       Temp = Rf12_trans(&Hca83)           'FIFO&Reset CMD: Synchroner Zeichenemfang (warte auf Startzeichen: 2DD4)
       Enable Int1
    return

    '------[RF12 Daten Senden]-------------------------------------
    Senden:
      crc=Framelength-2                                  'nur temporär Länge für crc-Check
      RF12_data(Framelength)= crc8(RF12_data(2),crc)     'CRC berechnen und ans FrameEnde anhängen
      'Print "Sende Frame" ;RF12_S
      Call Rf12_txdata(Framelength)                      'Snapframe senden
      Waitms 10
    return

    '------[INT1 ISR(Daten vom RF12)]-------------------------------
    FFIT_ISR:
     Temp = Rf12_trans(&Hb000)
     Temp = Temp and &H00FF
     if temp = &H54 and RF_SYNC=0 then             'Synchronzeichen empfangen-->an 1 Stelle
        RF_SYNC=1
        lv=1
        end IF
     if lv=3 then                                  'ermitteln der Anzahl Datenbytes (SNAP)
        NDB = Temp and &H0F                        'unteres Nipple von HDB1 enthält Datenlänge
        select case NDB                            '6Byte<=sync+HDB2+HDB1+DAB+SAB+....+CRC
               case 0 to 8: Framelength=6+NDB      '6-14 (0--8 Datebyte)
               case 9     : Framelength=6+16       '22   (16 Datenbyte)
               case 10    : Framelength=6+32       '38   (32 Datenbyte)
               end SELECT
        end IF
     If lv>=Framelength Then                       'alles eingetroffen
        RF_RXD=1                                   'Flag setzen und Empfänger abschalten
        Temp = Rf12_trans(&H8208)                  'Power CMD: Empfänger aus, Quarz-clk läuft weiter
        disable INT1
        End If
     RF12_data(lv) = Temp                          'Empfangsbyte in Buffer holen
     incr lv                                       'Zeiger incr
     toggle LED3
    Return

    '------[Timer2 ISR]------------------------------------------
    Timer2_isr:
     Timer2 = T2reload                                          'reloadvalue for 10msec @ 8MHz clock

     If Timeout > 0 Then Decr Timeout                           'Timeout alle 10ms runterzählen
     If Ticks > 0 Then
        Decr Ticks
        Else
        Ticks = 100
        Sec_flag = 1                                            'setze Sec-flag
        Mess_flag=1
        toggle LED1
        End If
     If Ticks = 90 Then Sec_flag = 0                            'nach 100ms secflag löschen
    Return

    '------[Uart ISR(Daten vom PC z.Z. nicht verwendet!!)]-------
    Rxd_isr:
     Rx_data = Udr                                         'Zeichen aus Uart holen
     Incr N                                                'Pointer hochzählen
     If Rx_data = 123 Then N = 1                           ' { -- synchronisation Vorzeichen in der ersten Stelle
     If Rx_data = 125 or n>10 Then Rxd_ready = 1           ' } -- Wenn Endekennung eingetroffen --> CMD-Frameende eingetroffen
     Buffer(n) = Rx_data                                   'Byte in Buffer
    Return


    Der Rollo ist weiterhin über die vorhandenen Wippenschalter handbedienbar und kann per Funk ferngesteuert werden.

    z.Z. ist mein Master nur das Pollinboard mit Laptop dran...

    Also falls schon jemand eine Mastersteuerung mit RF12
    für die Hausautomation hat oder plant...hier rein und mitmachen :wink:


    mfg
    Kurzschluss



    Re: Software zum SNAP-Protokoll

    radebeul - 30.01.2008, 12:50


    Hallo
    Ich teste das SNAP-Programm mit 2 x Pollin-Board (RFM12). Der Master M32 sendet im Takt von 1 Sekunde einen Frame von 10 Byte (4 Nutzbyte) an den Slave M16. Der Slave schickt den kompletten Frame an den Master zurück. Fehlerrate 20 - 50%. RF12-Statusabfrage brachte keine Verbesserung.
    Jetzt will ich ein weiteres Pollin-Board nur mithören lassen, um festzustellen, ob Master falsch sendet oder Slave falsch empfängt. Wer kann mir helfen?

    radebeul



    Re: Software zum SNAP-Protokoll

    avrnix - 30.01.2008, 13:08


    Das Forum ist alt es gibt ein neues und ist aktueller.
    -> http://www.comwebnet.de -> Forum

    ->:!: Bitte nur das neue Forum benutzen :!: <-

    Dort kannst du dich anmelden und zum Thema ein Beitrag schreiben.

    ohne Werbung !

    thx :!:



    Mit folgendem Code, können Sie den Beitrag ganz bequem auf ihrer Homepage verlinken



    Weitere Beiträge aus dem Forum www.comwebnet.de

    Messtechnik - gepostet von avrnix am Sonntag 04.11.2007
    Grundschaltung zu Schaltnetzteilen - gepostet von avrnix am Dienstag 13.02.2007
    Linux - TCP over ttyS0 Thema - gepostet von avrnix am Samstag 03.03.2007
    Protkoll für die Vernetzung von RFM12,01,02 Modulen - gepostet von avrnix am Sonntag 19.08.2007
    Tochpanel für S65 Display ? - gepostet von Kay am Mittwoch 02.05.2007



    Ähnliche Beiträge wie "Software zum SNAP-Protokoll"

    protokoll 6.6 - GenosseFloyd (Donnerstag 07.06.2007)
    Protokoll: 1. Ausgabe - Lissi (Samstag 25.11.2006)
    Software de jeda braucht - Jule (Donnerstag 01.03.2007)
    Spiel gegen Oesterweg - hillary (Montag 11.10.2010)
    VT-Software - müller (Donnerstag 29.07.2004)
    Anleitung für PC-Adapter und Software gesucht - Logo1965 (Dienstag 01.05.2007)
    Überblick über Standards - jtelieps (Mittwoch 15.02.2012)
    Protokoll des 1. Treffens der East London-Gruppe, 30.01.05 - Mäggie (Samstag 05.02.2005)
    übelstes PROtokoll von gestern, also thorids geburtstag - bommel (Donnerstag 26.04.2007)
    Linux und wie man Software installiert - sledge (Donnerstag 28.07.2005)