-         

Seite 1 von 5 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 45

Thema: rfm12 ausgabestring verarbeiten

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    06.01.2007
    Beiträge
    52

    rfm12 ausgabestring verarbeiten

    Anzeige

    Guten Morgen,
    habe das Funkmodul RFM12 von Pollin und mit hilfe des Sourcecodes von Picht (http://home.arcor.de/dirk.milewski/R...Tranceiver.bas) erfolgreich eine Funkstrecke ans Laufen gebracht meine einzige abänderungen waren Maxchar, weil ich soviele Zeichen einfach nicht brauche, da ich hauptsächlich Befehle übertragen möchte und die Bindestriche in der Ausgabe habe ich entfernt.
    Nun meine Frage auf dem Terminal erscheint halt der Text mit dem Befehel "Print Chr(rfdat(count)) ;" . Ich gehe also davon aus das der Character für Character an das Terminal übergibt oder? Nun mein Problem ich muss den String ja irgendwie so ändern das ich damit weiter arbeiten kann, sprich in If Bedingungen vergleichen kann etc.
    Aber ich komm einfach nicht weiter. Aus den meisten String Funktionen wie mid usw. resultiert ja auch immer ein String und bringt mich nicht weiter.

    Durch die Suche bin ich leider auch nciht zu einem Ergebniss gekommen.

    Im Vorraus vielen Danke

    Hier noch der Relevante Code:


    Code:
    Sub Empfangen
    '  Print "Empfange"
      Call Rf12_rxdata(maxchar)
      For Count = 1 To Maxchar
        Print Chr(rfdata(count)) ;
      Next Count
      Print
      Goto Zuruck
    End Sub

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    06.01.2007
    Beiträge
    52
    Kann mir denn keiner Helfen oder zumindest nen Tipp geben in welche richtung ich gehen muss. Komm sonst echt nicht weiter.
    Bitte helft mir !

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.08.2006
    Beiträge
    118
    Hallo Bastian 07,

    na gut ich antworte mal.

    ich nehme mal an mein Master-Slave "Modell" hilft Dir auch nicht
    weiter.

    Welchen String willst Du denn vergleichen?

    Wigbert

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    06.01.2007
    Beiträge
    52
    Danke ! =)
    Muss klar dazu sagen das ich kein Profi bin aber ich bin selber auf eine Lösungsansatz gestoßen.
    (1):
    Im endeffekt will ich ja nen Befehl über das RFM12 Modul vom Computer aus zu meinem Robotor senden und umgekehrt Infos vom Robotor zum Computer senden. Die Boards dafür hab ich alle fertig.
    Das hier ist ja die Ausgabe Routine:
    Code:
    Sub Empfangen
    '  Print "Empfange"   
      Call Rf12_rxdata(maxchar)
      For Count = 1 To Maxchar
    '    Print Chr(rfdata(count)) ;
        A$ = Chr(rfdata(count)) ;
      If A$ = "b" Then
       Print "hallo"
      End If
    Normal gibt der ja zeichen für zeichen aus und da wusste ich nicht direkt weiter und wie man oben sehen kann hab ich als Lösung halt anstatt das ganze mit dem Print-befehl auszugeben einfach in einen String geschrieben den ich dann weiter verarbeitet. Funktioniert auch alles soweit sobald in dem gesendeten Wort ein "b" enthalten ist gibt der ans Terminal "hallo" aus. Das ganze soll dann noch ein kleines Protokoll kriegen, Sprich Startzeichen, Stopzeichen etc.
    Scheint mir doch ne gute Lösung zu sein oder gibts da bessere?

    (2):
    Und ein weiteres Problem das eine Board (main_board_Robo) klappt in beide Richtungen nur das andere (schnitstelle_computer) kann nur emfganen und wenn ich senden will bleibt der immer in
    Code:
    Sub Rf12_readys                                             'ready Senden
      Reset Spi_cs
      nop
      While Spi_sdo = 0
      Wend
    End Sub
    hängen und geht nicht weiter. Ich kann im Schaltplan, sowohl auf der Platine keinen Fehler sehen vielleicht sieht ja jemand anders den Fehler, manchmal sieht man ja den Wald vor lauter Bäumen nicht mehr.

    Schönen Danke und schönen Gruß

    Sebastian

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.08.2006
    Beiträge
    118
    Hi,
    hast Du ein Oszi, der SS Pin muss auf Hi gehen,
    (String im Buffer vorhanden)

    Wigbert

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    06.01.2007
    Beiträge
    52
    hatte eben vergessen die Schaltüläne anzuhängen.
    Wenn ich das ans Oszi hänge und dem Board saft gebe hab ich kurz 5 V und dann nicht mehr weil der hier bei dem ersten print "stop1" hängen bleibt also kein print "Stop2" mehr ausgibt:
    Code:
    Sub Rf12_txdata(byval Maxchar As Byte)
    Print "stop1"
      Temp = Rf12_trans(&H8238)
      Rf12_readys
    Print "stop2"
      Temp = Rf12_trans(&Hb8aa)
      Rf12_readys
      Temp = Rf12_trans(&Hb8aa)
      Rf12_readys
      Temp = Rf12_trans(&Hb8aa)
      Rf12_readys
      Temp = Rf12_trans(&Hb82d)
      Rf12_readys
      Temp = Rf12_trans(&Hb8d4)
      Rf12_readys
      For Count = 1 To Maxchar
        Rf12_readys
        Temp = &HB800 + Rfdata(count)
        Temp = Rf12_trans(temp)
      Next Count
      Rf12_readys
      Temp = Rf12_trans(&H8208)
    End Sub
    Daraus folger ich das das irgendwas mit der Routine:
    Code:
    Sub Rf12_readys                                             'ready Senden
      Reset Spi_cs
      nop
      While Spi_sdo = 0
      Wend
    End Sub
    zu tuen haben muss sprich mit dem MISO pin, da wenn ich mit dem dipschalter(siehe schaltplan) die Leitung unterbreche, gibt der fortlaufend "Stop1" und "stop2" aus. der bleibt ja so lange in der schleife wie auf dem pin GND liegt. bei unterbrochener Leitung ist auf dem MISO pin allerdings +5V.
    Bin am verzweifeln.

    gruß Sebastian
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken main_board_robo.jpg   schnitstelle_computer.jpg  

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.08.2006
    Beiträge
    118
    Hi,

    es würde hilfreich sein, den ganzen Code zu haben,
    dann könnte ich ihn bei mir aufspielen, um Codeprobleme
    auszuschliessen.
    Die Schaltungen sehe ich mir an.

    Wigbert

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.08.2006
    Beiträge
    118
    Ich noch mal,

    bei mir geht es von Subd.2 nach Tout
    und Subd.3 nach Rin am Max 232
    oder benutzt Du ein "Spezialkabel"?
    Die Jumper 6 ist doch gesetzt?

    Wigbert

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    06.01.2007
    Beiträge
    52
    Das ist der Code, am Computer läuft ein atmega 8 und auf dem Roboter ein atmega32. Der Code ist derseleb nur jeweils mit kleinen abwandlungen.

    Code:
    ' generated. Take care that the chip supports all fuse bytes.' ########################################################################
    ' ### RF12-Test in Bascom
    ' ### Basiert auf Code von Benedikt K.
    ' ### Joachim Fossie Bär Reiter 04/2007
    ' ########################################################################
    
    
    $regfile = "m8def.dat"
    $hwstack = 32                                               ' default use 32 for the hardware stack
    $swstack = 10                                               'default use 10 for the SW stack
    $framesize = 40
    
    '$PROG &HFF,&HFF,&HD9,&H00' generated. Take care that the chip supports all fuse bytes.
    
    $crystal = 11059200
    $baud = 19200
    Baud = 19200
    
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7
    Config Lcdbus = 4
    Cursor Off Noblink
    Cls
    
    
    
    
    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_readys
    Declare Sub Rf12_ready
    Declare Sub Rf12_txdata(byval Maxchar As Byte)
    Declare Sub Rf12_rxdata(byval Maxchar As Byte)
    
    Const Rf12freq = 433.92
    Const Rf12baud = 19200
    Const Maxchar = 32
    
    '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
    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
    
    ' was so gebraucht wird
    Dim Count As Byte
    Dim Temp As Word
    Dim Rfdata(32) As Byte
    Dim Text As String * Maxchar At Rfdata Overlay
    Dim S As Byte
    Dim A$ As String * 1
    Dim A As Byte
    
    Print "Init"
    Call Rf12_init                                              ' ein paar Register setzen (z.B. CLK auf 10MHz)
    Print "Set Frequenz"
    Call Rf12_setfreq(rf12freq)                                 '  Sende/Empfangsfrequenz auf 433,92MHz einstellen
    Print "Set Bandwith"
    Call Rf12_setbandwith(4 , 1 , 4)                            '  200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm
    Print "Set Baudrate"
    Call Rf12_setbaud(rf12baud)                                 '  19200 baud
    Print "Set Power"
    Call Rf12_setpower(0 , 6)                                   '  1mW Ausgangangsleistung, 120kHz Frequenzshift
    
    
    ' ########################################################################
    ' ###### Hauptproggi
    ' ########################################################################
    
    Portd.7 = 1
    Text = "bt"
    
    ' Je nachdem ob Sender oder Empfänger die entsprechenden Zeilen aktivieren
    Do                                                          'Ewigschleife
    
    
    
    ' Hier ist die Senderoutine
    '  Print "Sende"
     Locate 1 , 1                                               'Cursor auf 1 Zeile, 1 Spalte
     Lcd Text
    
    
      Call Rf12_txdata(maxchar)                                 'senden
    
    Wait 1
    
    
    
    ' Hier ist die Empfangsroutine
    '  Print "Empfange"
    '  Call Rf12_rxdata(maxchar)
    '  For Count = 1 To Maxchar
    '   A$ = Chr(rfdata(count)) ;
    '  If A$ = "e" Then
    '   A$ = ""
    '    Print "a"
    '  End If
    '  Next Count
    '  Print
    Schleife:
    
    'Locate 2 , 1
    'Lcd A$
    
    Loop
    
    
    End                                                         'end program
    
    
    ' ########################################################################
    ' ###### 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)
    Print "stop1"
      Rf12_readys
    Print "stop2"
      Temp = Rf12_trans(&Hb8aa)
      Rf12_readys
      Temp = Rf12_trans(&Hb8aa)
      Rf12_readys
      Temp = Rf12_trans(&Hb8aa)
      Rf12_readys
      Temp = Rf12_trans(&Hb82d)
      Rf12_readys
      Temp = Rf12_trans(&Hb8d4)
      Rf12_readys
      For Count = 1 To Maxchar
        Rf12_readys
        Temp = &HB800 + Rfdata(count)
        Temp = Rf12_trans(temp)
    
      Next Count
      Rf12_readys
      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_readys
      Reset Spi_cs
      nop
      While Spi_sdo = 0
      Wend
    End Sub
    
    Sub Rf12_ready                                              'ready Empfangen
      Reset Spi_cs
      While Spi_sdo = 0
       If Len(s) > 0 Then                                       'Wenn ein string eingelesen
        Temp = Rf12_trans(&Hca81)                               'Fifo deaktivieren
        Temp = Rf12_trans(&H8208)                               'Empf. ausschalten
        Goto Schleife                                           'Springe zum hauptprogramm
       Else                                                     'sonst warte weiter auf Empfangsdaten
       Wend
      End If
    End Sub

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    06.01.2007
    Beiträge
    52
    Zum max 232 da haste recht da hab ich dummerweise ein Fehler im Layout der platine habs aber wieder vertauscht, sodas es wieder standart ist. Die kommunikation max232-->Terminal programm funktioniert in beide richtungen einwanfrei. Der Jumper ist gesetzt ja hab ich auch schon kontrolliert.

    Gruß
    Sebastian

Seite 1 von 5 123 ... LetzteLetzte

Berechtigungen

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