-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Soft UART sendet, empfängt aber nicht

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    03.07.2008
    Beiträge
    10

    Frage Soft UART sendet, empfängt aber nicht

    Anzeige

    Hallo zusammen,
    und das Neue Jahr fängt nicht besser an, als das alte aufgehöhrt hat.
    Ich hoffe Euer Start ist besser als meiner.

    Problem: Mit dem RN-Minicontrol will ich am PC eingegebene Texte an das RN-Funk übergeben und gleichzeitig am PC den Empfang kontrollieren. Damit ist die RS232 für den PC erforderlich, das RN-Funk muss über eine Soft UART angesprochen werden (der Max ist beim RN-Runk entfernt).
    Auf der anderen Seite der Funkstrecke sitzt ein RNmega128 mit Easyradio on Board, der allerdings 2 UARTs hat und damit an dem 2ten PC problemlos funktioniert.
    Die Soft UART des RN-Minicontrol kann problemlos senden (es kommt alles am RN128 bzw. 2ten PC an), aber der Empfang ist mal da mal nicht, mal verstümmelt, mal genau 2 Zeichen (je nach Code Version und nicht klar reproduzierbar).
    Getestet habe ich verschiedene Ports (auch PD3 mit INT1), in zig Kombinationen mit Buffer und ohne .....
    Getestet habe ich auch eine Verbindung vom Funk (in) eine Kabelverbindung auf PD3 (--> Int1 Interrupt) was gar nicht funktioniert hat....
    Ebenso hatte ich die Empfangsabfrage im Int1 --> da kam mal was ....

    Könnt Ihr bitte mal drüber schauen --> ich bin mittlerweile betriebsblind

    Code:
    '##############################################################
    '
    'Aufgabe:
    '   Lese alle Bytes vom Funk und gebe diese auf RS232 aus
    '   Lese alle Bytes vom PC via RS232 und gebe diese auf Funk aus
    '
    '
    ' Verkabelung:
    '   JP5    --> Pin 5 (PD4) mit dem Funkmodul TTL RS232 OUT verbunden
    '          --> Pin 4 (PB4) mit dem Funkmodul TTL RS232 IN verbunden
    '
    '   RS232  --> PC Kabel
    '
    '##############################################################
    $regfile = "m168def.dat"                                    'Prozessor
    $crystal = 16000000                                         'Quarzfrequenz
    $hwstack = 32
    $framesize = 32
    $swstack = 32
    $baud = 19200                                               'Für RS232, für Funk in Soft UART angegeben
    On Int1 Int1_int                                            'Wenn PD3 den Status ändert.  Für Soft UART benötigt?
    Enable Int1
    Config Int1 = Falling                                       'Auch Rising schon getestet
    Enable Interrupts
    Dim Funkempfang As Integer
    Dim D As Integer
    Dim X As Byte
    Dim S As String * 1
    Dim Sendetext As String * 30
    Dim Empfangtext As String * 30
    Config Serialout = Buffered , Size = 100
    Config Serialin = Buffered , Size = 100
    ' ---------- Ende der Deklarationen -----------------------------------------
    Print "Warte ich boote ..."                                 ' Ausgabe am PC funktioniert gut
    Open "comd.4:19200,8,n,1" For Output As #1                  'jp5 Pin 5 linkester  bzw. außen
    Open "comb.4:19200,8,n,1" For Input As #2                   'jp5 Pin 4 zweit linkester bzw. innen
    D = 1
    Funkempfang = 0
    Wait 3
    Print "Los geht's"
    Do
       Print " Schleife = " ; D                                 'Geht auf RS232 und PC
       ' ---------- RS232 abfragen und über Funk Ausgeben ------------------------
        Sendetext = ""
        While Ischarwaiting() <> 0                              ' Wird vom RS232 gelesen
          S = Inkey()
          If S <> "0" Then
             Sendetext = Sendetext + S
          End If
        Wend
        If Len(sendetext) > 0 Then
             Print "Sende jetzt: " ; Sendetext
             Print #1 , Sendetext                               'Geht gepuffert zum Funk
             Print #1 , Len(sendetext)
         End If
       ' ---------- bis hierhin funktioniert alles ------------------------
      X = Inkey(#2)
      While X <> 0
          Print "Hurra X= " ;
          Printbin X
          Print
          X = Inkey(#2)
          If X = 0 Then
             Print "Ende"
          End If
      Wend
       D = D + 1
       Wait 3
    Loop
    End
    
    Int1_int:
    Return
    Zusatzfrage: Kann ich in das RN-Minicontrol einfach einen ATmega162 einbauen? Der hätte 2 UARTs.

    Danke.

    Gruß
    Burkhard

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Du machst nach jedem Inkey(#2) zwei ziemlich lange "PRINT" Befehle. In der Zeit ist der Empfang nicht bereit.
    Empfehlung: erst "inkey" bis X=0 , dabei die Daten sammeln, und erst dann "PRINT"
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    03.07.2008
    Beiträge
    10
    Hallo Robert,
    danke für die rasche Antwort.
    Das war einer meiner Tests --> nur ein einziges Inkey --> damit bekomme ich genau ein Zeichen, das funktioiniert (das Kabel ist also auch ok).
    Problem ist, dass da keine Schleife funktioniert, mit while X<>0 .... und permanent X=Inkey() bekomme ich genau 1 Zeichen.
    Ischarwaiting() funktioniert bei Soft UART nicht (da meckert schon der Compiler).
    Theoretisch könnte ich immer 1 Byte senden, das Echo zurück geben und dann das nächste senden, aber das Endgerät sendet mit hoher Geschwindigkeit und erwartet eine Antwort innerhalb von wenigen ms. Und was wenn ich 2 Meldungen kurz nacheinander erhalte?
    --> Ratlosigkeit

    Meine 2te Frage war, ob ich in das RN-Minicontrol einfach einen ATmega162 einbauen? Der hätte 2 UARTs.
    Kannst Du da etwas sagen?

    Gruß
    Burkhard

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Also, wenn der 162 Pinkompatibel ist (?), kannst du ihn reintun.
    versuche:
    Code:
      .......dein code etc
       ' ---------- bis hierhin funktioniert alles ------------------------
     DIM instring as string * 8
     DIM Inchar(8) as byte at instring overlay
     DIM inidx as byte
    
      inidx = 0
      do 
              incr inidx
              X = Inkey(#2)
              inchar(inidx) = X
       while  X > 0                        
    
       Print "<";Instring;">Len:";inidx
    Kann ich jetzt nicht testen, sollte aber gehen
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    03.07.2008
    Beiträge
    10
    Hallo Robert,
    habe ich probiert (do ... while geändert in while .. wend) und keinen Erfolg gehabt.
    Ob der ATmega162 pinkompatibel ist -->keine Ahnung, soweit ich gesehen habe ist er "Fuß-Anzahl-Kompatibel"
    Gruß
    Burkhard

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    mmmhh.
    Ich würde, um den Fehler einzukreisen, einmal mit $BAUD deutlich runtergehen, also 1200 oder so. Wenn der Fehler dann verschwindet, weiss man, wo man was tun muss.
    Ich seh mir mal die Bascom-Soft-Uart an, was es da mit dem Int1 auf sich hat.

    Mega162: dass die Anzahl der HAxen übereinstimmt, ist, wie man so sagt, "notwendig", aber nicht "hinreichend". Sagt auch nix, wenn sie gleich viel kosten oder im selben Laden gekauft sind *g*
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von panier Beitrag anzeigen
    Getestet habe ich verschiedene Ports (auch PD3 mit INT1), in zig Kombinationen mit Buffer und ohne .....
    Die Idee hinter ext. Int1 ist, dass man den Softuart-Empfang dort reinpackt um eine unmittelbare Reaktion auf eingehende Daten zu bekommen.
    Eine leere Int1-ISR nutzt Dir nix. Nicht vergessen zum Abschluss der ISR das INTF1 zu löschen, ist in diesem Fall notwendig.
    Nachteile einer solchen Konstruktion: Blockierung anderer ISR's während des Empfangs und andere ISR's können den Empfang behindern.

    @PicNick
    Code:
     .......dein code etc
       ' ---------- bis hierhin funktioniert alles ------------------------
     DIM instring as string * 8
     DIM Inchar(8) as byte at instring overlay
     DIM inidx as byte
    
      inidx = 0
      do 
              incr inidx
              X = Inkey(#2)
              inchar(inidx) = X
       while  X > 0                        
    
       Print "<";Instring;">Len:";inidx
    Das wird so nix, denn da müsste der PC dann senden, wenn der µC genau diese Stelle des Codes ausführt. Da wäre ein Waitkey() angebracht. Das hätte allerdings den Nachteil, dass der Code hängen bleibt, wenn nix von der Seriellen reinkommt.
    Man könnte sich für Inkey() selber etwas stricken, so in etwa:
    Code:
    Dim Time_Out As Word
      Time_Out = 10000
        While PinB.4 = 1 And Time_Out > 0
          Decr Time_Out
        Wend
      X = Inkey(#2)
    ' ...

  8. #8
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Du hast recht, wer nix weiss, soll nix reden.
    Ich weiss nämlich nicht, was Bascom bei Soft-Uart "Inkey()" genau generiert.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von PicNick Beitrag anzeigen
    Du hast recht, wer nix weiss, soll nix reden.
    Na, ich denke, Du weist schon, speziell bei Inkey() mag das jetzt nicht der Fall sein.
    Ich weiss nämlich nicht, was Bascom bei Soft-Uart "Inkey()" genau generiert.
    Muss zugeben, das wusste ich auch nicht genau, nur ergab sich aus der Hilfe:
    If there is no character waiting, a zero will be returned.
    dass Inkey() nicht-blockierend wirkt und lustig weitermacht, wenn nichts ansteht. Ob etwas ansteht, kann bei Soft-UART sowieso nur aktiv per Polling festgestellt werden (außer man verwendet Intx).

    Daraus ergab sich, dass es im Pogrammablauf sehr unwahrscheinlich ist, dass das einzelne Inkey() gerade da kommt, wenn das Startbit vom PC kommt. Es gibt ein Beispiel dazu, "open.bas" im Samples-Ordner, da wird Inkey() in 'ner Do/Loop gepollt.

    Aber um auch sagen zu können, was Inkey() tatsächlich macht, hab' ich's mir angesehen.
    Wenn der Pin auf High liegt, liefert es eine 0 zurück, wenn er auf Low liegt, wird die Soft-UART Empfangsroutine ausgeführt.

    Bei Deinem Code ist die Schleifenabbruchbedingung x = 0. Aus dem Gesagten ergibt sich, dass dies sehr wahrscheinlich gleich beim ersten Durchlauf zutrifft, die Schleife also sofort verlassen wird.

    Waitkey() hingegen würde darauf warten, dass der Pegel Low geht, blockiert aber wenn nix über die Serielle kommt den weiteren Ablauf, deswegen mein Vorschlag mit dem Timeout.
    Geändert von MagicWSmoke (02.01.2012 um 13:57 Uhr)

  10. #10
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Das Bascom-Help hat mich über die Eigenheiten bzw. Unterschiede bei HW- und Softuart nicht befriedigt.
    Bevor ich aber da mangels bessern Wissens nochmal "Lull" und "lall" erzähle, werd ich mir die diversen Soft-Uart Routinen disassemblieren und melde mich dann auf der Kampfstatt wieder *g*
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. RN-Funk sendet, empfängt aber nicht
    Von DEAF BOY im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 28.12.2011, 17:59
  2. Asuro sendet (und empfängt?) nichts
    Von Hannibal1412 im Forum Asuro
    Antworten: 13
    Letzter Beitrag: 06.02.2010, 14:28
  3. Antworten: 2
    Letzter Beitrag: 04.08.2008, 04:31
  4. 18f1320 USART sendet aber empfängt nicht
    Von stalky13 im Forum PIC Controller
    Antworten: 1
    Letzter Beitrag: 20.06.2007, 20:06
  5. UART ermöglicht Senden, aber kann nicht Empfangen
    Von batti112 im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 18.09.2004, 16:05

Stichworte

Berechtigungen

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