-
        

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

Thema: Problem mit RS232

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627

    Problem mit RS232

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hallo,
    ich versuche gerade michmit dem "input" Befehl auseinander zu setzen.
    Dabei bin ich auf ein Programm gestoßen bei dem man übef den PC Text an den µC sendet und der das auf einem LCD wiedergibt. Leider funktioniert das Programm bei mir nicht richtig.

    Das Programm ist so aufgebaut, dass der Inputbefehl wartet bis "etwas" gesendet wird. Dann werden die ersten 3 Zeichen ausgewertet in welche Zeile geschrieben werden soll: z1= Text in die 1. Zeile schreiben.

    Der 1. Durchlauf funktioniert:
    z1=Test - dann wird Test in die erste Zeile geschrieben.

    das funktioniert im Prinzip mit alle Zeilen NUR ich muss jedesmal den Resetknopf drücken sonst hängt sich der µC irgendwie auf.

    beim testen ist mir aufgefallen, dass input, I immer funktioniert - anscheinend funktioniert der Befehl zum auswerten nicht richtig (B = Left(i , 3) )

    Kann mir da jemand einen Tip geben?

    Tobias






    Code:
    '##########################################################
    '#                                                        #
    '#      SnugTerm V.1                                      #
    '#      serial terminal                                   #
    '#                                                        #
    '#      by - snug11@hotmail.com                           #
    '#      http://www.pixelklecks.de                         #
    '#      Bremen, 23.02.2007                                #
    '#                                                        #
    '#      Language : Bascom AVR                             #
    '#      Hardware : Atmega8/16Mhz, Max232, 20x4 HD44780    #
    '#      (using a "snugboard" for very easy handling)      #
    '#                                                        #
    '#      thx for the users of http://www.roboternetz.de    #
    '#                                                        #
    '#      distribution is free,                             #
    '#      but only allowed with this little header !        #
    '#                                                        #
    '##########################################################
    
    
    
    $regfile = "m8def.dat"
    $crystal = 16000000
    $baud = 19200
    
    Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.1 , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5
    Config Lcd = 20 * 4
    Initlcd
    Cursor Off
    Cls
    
    
    Config Portd = Output                                       'LED o.Ä. an Port D
    Config Portc = Input                                        'Eingänge an Port C
    Portc = &B11111111                                          'Pullups an PortC ein
    
    
    Print "connected module found !"
    Print ""
    
    
    Locate 1 , 1
    Lcd "   SnugTerm V1.0    "
    Locate 2 , 1
    Lcd "        by          "
    Locate 4 , 1
    Lcd " snug11@hotmail.com "
    
    
    Wait 1
    
    
    Print "SnugTerm V1.0"
    Print "by : snug11@hotmail.com"
    Print ""
    Print ""
    Print "Examples :"
    Print ""
    Print "to write a text in row 2 of display, send : ' z2=that is a test '"
    Print "to clear all rows,                   send : ' cls'"
    Print ""
    Print "to set led2 on/off,                  send : ' l2=1 / l2=0 '"
    Print "to set all led,                      send : ' la=1 / la=0 '"
    Print ""
    Print "to ask for installed components,     send : ' cfg '"
    Print ""
    Print "pushing ever a switch will get : tx=1"
    Print ""
    Print ""
    
    
    Print "...now waiting for input !"
    Print ""
    
    
    
    
    Config Timer1 = Timer , Prescale = 64                       'Interrupt wird erzeugt, springt 10x pro Sekunde nach Sub "Tastenabfrage"
    On Timer1 Tastenabfrage
    Const Timervorgabe = 57203
    Enable Timer1
    Enable Interrupts
    
    
    Dim I As String * 23                                        'maximal Länge Tastatureingabe (fuer LCD 20x4)
    Dim T As String * 20                                        'Länge des Textstrings
    Dim B As String * 3                                         'ersten 3 Zeichen für Befehl
    Dim O As String * 1                                         '4. Zeichen - Wert = 1 oder 0
    
    Dim Taster As Byte
    Dim Led As Byte
    Dim Zeilen As Byte
    Dim Zeichen As Byte
    
    Taster = 6                                                  'Anzahl der angeschlossenen Taster
    Led = 2                                                     'Anzahl der angeschlossenen LED
    Zeilen = 4                                                  'Anzahl Displayzeilen
    Zeichen = 20                                                'Anzahl der Displayzeichen
    
    
    Main:
    Do
    
       Input , I                                                'max 23 zeichen einlesen
       B = Left(i , 3)                                          'ersten drei zeichen des StringI in Variable B schreiben
       T = Mid(i , 4 , 20)                                      'ab dritten Zeichen alles in Variable T schreiben
       O = Mid(i , 4 , 1)                                       'Abfrage ob viertes Zeichen eine  1 oder 0 für LED`s
       If B = "z1=" Then Goto Zeile1                            'wenn ersten drei zeichen z1=,z2= oder l1=..., dann springe entsprechend
       If B = "z2=" Then Goto Zeile2
       If B = "z3=" Then Goto Zeile3
       If B = "z4=" Then Goto Zeile4
       If B = "cls" Then Goto Cls
    
       If B = "l1=" Then Goto Led1
       If B = "l2=" Then Goto Led2
       If B = "la=" Then Goto Lall
    
       If B = "cfg" Then Goto Config                            'Abfrage der angeschlossenen Hardware
       'Locate 3 , 1
       'Lcd I
       'Locate 4 , 1
       'Lcd B
      I = ""
    Loop
    
    
    
    Zeile1:
       Locate 1 , 1
       Lcd "                    "
       Locate 1 , 1                                             'springe in erste Postition der Zeile 1
       Lcd T                                                    'gebe alles ab drittem zeichen der Eingabe aus
       Goto Main                                                'und wieder zur Hauptroutine
    
    Zeile2:
       Locate 2 , 1
       Lcd "                    "
       Locate 2 , 1
       Lcd T
       Goto Main
    
    Zeile3:
       Locate 3 , 1
       Lcd "                    "
       Locate 3 , 1
       Lcd T
       Goto Main
    
    Zeile4:
       Locate 4 , 1
       Lcd "                    "
       Locate 4 , 1
       Lcd T
       Goto Main
    
    Cls:
       Cls
       Goto Main
    
    
    
    
    Led1:
       If O = "1" Then Portd.2 = 1                              'bei l1=1 schaltet sich LED1 ein
       If O = "0" Then Portd.2 = 0                              'bei l1=0 schaltet sich LED1 aus
    Goto Main
    
    Led2:
       If O = "1" Then Portd.3 = 1
       If O = "0" Then Portd.3 = 0
    Goto Main
    
    
    Lall:
       If O = "0" Then                                          'bei Eingabe "la=1" gehen alle LED an
       Portd.2 = 0
       Portd.3 = 0
       End If
    
       If O = "1" Then                                          'bei Eingabe "la=0" gehen alle LED aus
       Portd.2 = 1
       Portd.3 = 1
       End If
    Goto Main
    
                                                              'Die Abfrage 'cfg" listet Konfiguration auf
    Config:
       Print "#t=" ; Taster ; ",l=" ; Led ; ",r=" ; Zeilen ; ",c=" ; Zeichen ; "#"
    Goto Main
    
    
    
    Tastenabfrage:
    Locate 1 , 1
    If Pinc.0 = 0 Then Print "T1=1"                             'gib bei Tastendruck über RS232 "T1=1" aus
    If Pinc.1 = 0 Then Print "T2=1"
    If Pinc.2 = 0 Then Print "T3=1"
    If Pinc.3 = 0 Then Print "T4=1"
    If Pinc.4 = 0 Then Print "T5=1"
    If Pinc.5 = 0 Then Print "T6=1"
    Return
    ...

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Probier erstmal einfach vorne

    $HWSTACK = 64


    mit Interrupt können die defaultmässigen 32 knapp werden


    2: die Timervorgabe mußt du auch verwenden.
    Tastenabrage:
    Timer1 = timervorgabe
    ... etc....
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    Hallo,
    danke für die Antwort: leider hat es das Problem noch nicht behoben.
    Habe mal die Variablen I & B auf das LCD geschrieben:
    also bei B ist wohl der Fehler!!!!

    beim ersten mal gibt mir B die ersten 3 Zeichen zurück: z.b.: "z1=" und so soll das ja auch sein
    beim zweiten und jedem weiteren mal gibt mir B ein Sonderzeichen (3senkrechte Balken) und dann die Zeichen z und 1 wieder - aber wo kommt dieses Sonderzeichen her?

    _____
    also bei 2. kommt die Fehlermeldung dass es schon vorgegeben ist:
    CONST already specified [TIMERVORGABE]



    Tobias
    ...

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    zu 2) strange, ist aber jetzt erstmal egal.

    Ich würde beim Emfang immer erstmal alles ignorieren, bis ich ein Zeichen > " " bekomme.
    Code:
       zeichen1 = Inkey()                   ' Keyboard ?
       If zeichen1 >  64 Then
             input  , i         
               --etc---
       end if
    Vorsicht bei "input": Das erste zeichen "z", "l", "c" kriegst du natürlich nicht nochmal, d.h. in "i" steht dann nurmehr "1=" oder "ls" oder "fg".
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    Hallo,
    ich habe nun Zeichen1 as Word genommen.

    was meinst du mit ---etc--- ich habe da nur den Input befehl rein geschrieben.
    Soll da noch mehr rein?

    so werden nun ganz viele @ Zeichen angezeigt und das LCD blinkt unregelmäßig...

    Könnte man nicht vielleicht nach dem ersten Empfang ein Bit setzen welches dafür sorgt, das bei allen weiteren empfangenen Teilen das erste Zeichen - also die 3senkrechten Balken - gelöscht werden?

    Tobias
    ...

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Naja, ich bring mal ein Beispiel, was funktionieren könnte.

    Code:
    DIM zeichen1 as Byte
    
    Do 
       zeichen1 = inkey()
       if zeichen1 > 64 then 
            Input , I                'max 23 zeichen einlesen 
            B = Left(i , 2)        'ersten zwei zeichen in Variable B schreiben 
            select case zeichen1
            case "z":       
                 T = Mid(i , 3 , 20)    
                 If B = "1=" Then Goto Zeile1      
                 If B = "2=" Then Goto Zeile2 
                 If B = "3=" Then Goto Zeile3 
                 If B = "4=" Then Goto Zeile4 
            case "l":       
                 O = Mid(i , 3 , 1) 
                 If B = "1=" Then Goto Led1 
                 If B = "2=" Then Goto Led2 
                 If B = "a=" Then Goto Lall 
            case "c":       
                 If B = "ls" Then Goto Cls 
                 If B = "fg" Then Goto Config    
            end select
            'Locate 3 , 1 
            'Lcd I 
            'Locate 4 , 1 
            'Lcd B 
            I = "" 
        end if
    LOOP
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    Hallo Robert!
    vielen Dank für deine Mühe!!! Es funktioniert!!!!
    SUPER!!! Danke!!!!

    gruß, Tobias
    ...

  8. #8
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    17.02.2005
    Ort
    NRW-Bergisches Land
    Beiträge
    311
    Ich habe eine Vermutung, wieso es zuvor nicht richtig ging.
    Dein Terminal sendet am Ende sicher nicht nur ein CR, welcher die Input Abfrage terminiert, sondern es wird ein CR + LF geschickt.
    Beim zweiten Durchlauf hängt das LF dann immer noch im Buffer an erster Stelle.
    Somit ist der nächste Input nicht "z1=Test" sondern "(LF)z1=Test".
    Mittlerweile ist es möglich den Input dahingehend zu konfigurieren.

    Mit Config Input0 = CRLF wäre es demnach auch gegangen.
    Oder aber auf anderem Wege sicherstellen, daß vor dem Input der Buffer auch wirklich leer ist.
    Gruß RePi!


    *** Holzhacken ist deshalb so beliebt, weil man bei dieser Tätigkeit den Erfolg sofort sieht. ***
    *** (Albert Einstein) ***

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    Hallo repi64
    hab im Programm mal nachgesehen und es wird immer CR-LF mitgesendet!!!
    wenn ich das auf nur CR umstelle, dann geht´s - aber mich interessiert natürlich wie das mit "Config Input0 = CRLF " geht!

    An welche stelle kommt das? ich hätte es nun ganz oben gleich hinter die "Portconfiguration" (Config Portd = Output...usw...) geschrieben aber dann wird das beim überprüfen rot markiert....

    Tobias
    ...

  10. #10
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    17.02.2005
    Ort
    NRW-Bergisches Land
    Beiträge
    311
    Schau mal in der Help nach.
    Ich meine, es geht erst ab der 1.11.9.0.

    Evt. muss noch das Config Input0 = CRLF , ECHO=NOECHO
    o.ä. deklariert werden.
    Gruß RePi!


    *** Holzhacken ist deshalb so beliebt, weil man bei dieser Tätigkeit den Erfolg sofort sieht. ***
    *** (Albert Einstein) ***

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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