- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 10 von 10

Thema: serielle befehle empfangen

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    13.01.2004
    Beiträge
    135

    serielle befehle empfangen

    Anzeige

    Praxistest und DIY Projekte
    Hallo,
    ich möchte mit einem AT90S2313 mit 4Mhz mit serieller verbindung zu meinem ATMega32 text empfangen und entweder als befehl auswerten oder auf ein LCD schreiben. Hier erst mal der komplette quelltext (wegen vollständigkeit):
    Code:
    'Roboter LCD Modul Version 0.9 Beta"
    
    'Hardware: AT90S2313
    $regfile = "2313DEF.dat"
    
    'Quarz definieren
    $crystal = 4000000
    $baud = 4800
    
    Config Serialin = Buffered , Size = 20
    Enable Interrupts
    
    Declare Sub Lcdwrite(byval Zeichen As Byte)
    Declare Sub Mainloop()
    
    Config Pind.5 = Output
    Config Pinb.4 = Output
    Config Pinb.3 = Output
    Config Pinb.2 = Output
    Config Pinb.1 = Output
    Config Pinb.0 = Output
    Config Pind.6 = Output
    Config Pind.4 = Output
    
    'Portb.3 = 0                                                 'Read / Write pin
    Portd.5 = 1                                                 'Beleuchtung einschalten
    
    'Display Variablen
    Dim Serinput As Integer
    Dim Leng As Integer
    Dim Sertext As String * 20
    Dim Code As String * 2
    
    'LCD konfigurieren
    'Config Lcdmode = Port
    Config Lcdbus = 4
    Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.0 , Db6 = Portd.6 , Db7 = Portd.4 , E = Portb.2 , Rs = Portb.4
    Config Lcd = 20 * 4
    
    'LCD initialisieren
    Initlcd
    
    Call Lcdwrite(&B00101100)
       Waitms 5
    
       Call Lcdwrite(&B00001001)
       Waitms 5
    
       Call Lcdwrite(&B00101000)
       Waitms 5
    
       Call Lcdwrite(&B00000110)
       Waitms 5
    
       Call Lcdwrite(&B00001100)
       Waitms 5
    
    
    'Bootscreen
    Cursor Blink
    Locate 1 , 1
    Lcd "  LCD Driver V0.9"
    Locate 2 , 1
    Lcd "    01.08.2005"
    Locate 3 , 1
    Lcd "********************"
    Locate 4 , 1
    Lcd "  Loading Driver..."
    Wait 4
    Cls
    Locate 1 , 1
    
    'Hauptprogramm
    Sub Mainloop()
    
    While Ischarwaiting() = 1
    'Bytes empfangen
    Serinput = Inkey()
    Sertext = String(1 , Serinput)
    Code = String(1 , Serinput)
    Wend
    
    'Steuerbefehle auswerten
    If Code = "*1" Then
    Locate 1 , 1
    Sertext = ""
    End If
    
    If Code = "*2" Then
    Locate 2 , 1
    Sertext = ""
    End If
    
    If Code = "*3" Then
    Locate 3 , 1
    Sertext = ""
    End If
    
    If Code = "*4" Then
    Locate 4 , 1
    Sertext = ""
    End If
    
    If Code = "*5" Then
    Portd.5 = 0
    Sertext = ""
    End If
    
    If Code = "*6" Then
    Portd.5 = 1
    Sertext = ""
    End If
    
    Code = ""
    
    'Text auf LCD schreiben
    If Len(sertext) > 0 Then
    Lcd Sertext
    Sertext = ""
    End If
    
    'Auf Input warten
    Do
    If Ischarwaiting() = 1 Then Call Mainloop()
    Loop
    
    End Sub
    
    'Schreibt die Initialisierungs - Bits zum LCD
    
       Sub Lcdwrite(byval Zeichen As Byte)
    
         ' Höherwertiges Nibble setzen
         If Zeichen.4 = 1 Then Portb.1 = 1 Else Portb.1 = 0
         If Zeichen.5 = 1 Then Portb.0 = 1 Else Portb.0 = 0
         If Zeichen.6 = 1 Then Portd.6 = 1 Else Portd.6 = 0
         If Zeichen.7 = 1 Then Portd.4 = 1 Else Portd.4 = 0
         ' Höherwertiges Nibble übertragen
         Portb.2 = 1
         Waitms 1
         Portb.2 = 0
         Waitms 1
    
         ' Niederwertiges Nibble setzen
         If Zeichen.0 = 1 Then Portb.1 = 1 Else Portb.1 = 0
         If Zeichen.1 = 1 Then Portb.0 = 1 Else Portb.0 = 0
         If Zeichen.2 = 1 Then Portd.6 = 1 Else Portd.6 = 0
         If Zeichen.3 = 1 Then Portd.4 = 1 Else Portd.4 = 0
         ' Niederwertiges Nibble übertragen
         Portb.2 = 1
         Waitms 1
         Portb.2 = 0
         Waitms 1
    
       End Sub

    Das problem was ich habe ist das wahrscheinlich die mainloop mehrmals komplett durchläuft und nicht nur einmal weil die zeichen nicht schnell genug ankommen das nur die while wend schleife die zeichen ausm buffer holt.
    So wie ich das jetzt geschrieben hab sollte es doch normalerweise funzen !? Aber die befehle werden trotzdem auf das display geschrieben und nicht ausgewertet ! Also kein sprung in die nächste zeile usw.

    Kann mir irgendjemand helfen ? Bin am verzweifeln...

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    14.08.2004
    Beiträge
    19
    Hallo,

    ich habe ähnliches vor, die Daten kommen dann aber per Interrupt rein über TXD / RxD und werden daraufhin dargestellt und dann könnte noch eine andere Routine laufen.

    Gruss
    artools

  3. #3
    Ich bin eher Assembler-Mensch drum kann ich jetzt auch nicht so direkt auf deinen Code eingehen, aber was bei mir anfänglich ewig zu Fehlern geführt hat, war die Tatsache das das UART nur ASCII127 benutzt und das Höchstwetigste Bit immer 1 ist, hilft dir das weiter ? du solltest also am anfang alle restlichen bits erstmal ausmaskieren ... soweit so gut

    Julian

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Zitat Zitat von JulianF
    ...das UART nur ASCII127 benutzt
    Kannst du das näher erläutern ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Naja, es ist so, dass es ja den Standard ASCII Code gibt, mit 128 Zeichen und einen erweiterten mit 256. Und das UART benutzt mit den Standard Einstellungen, das mit 128 Zeichen, wobei das MSB dabei immer High ist.
    Wenn man also die Restlichen Bits nicht ordentlich ausmaskiert, kommt es (kam es zumindest bei mir) immer zu Fehlern ... soweit so gut

    Julian

  6. #6
    Gast
    Vielleicht liegt es en der Konfiguration der Seriellen am PC ?
    Ich verschicke meine Daten nicht als zeichen, sondern binär 0-255 und habe keine Probleme
    damit, es kommen auch zahlen kleiner 128 an.

    Gruß Sebastian

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    hmm habe vergessen mich einzulogen,
    Der beitrag drüber ist von mir und bezog sich auf die Aussage von Julian

    Gruß Sebastian

  8. #8
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Bei der Einstellung 8 N 1 sendet deine, meine und jede andere UART ein start-Bit, 8 Datenbit und ein stop bit.
    8 Datenbit gibt logo 0-255, da is nix gesetzt oder maskiert.
    Der berühmte ASCII code ist nix als eine Vereinbarung, was diese 0-255 zu bedeuten haben, wenn man mit einem Terminal oder Drucker solche Daten austauscht.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    @Robert,
    Das ist mir schon klar, ich habe einfach nur nicht geglaubt, daß der MSB immer auf High gesetzt sein soll.

    Gruß Sebastian

  10. #10
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    @Sebastian: Du hast schon recht, wollte dich nicht belehren, der Unruhestifter war (ist) ja der Julian

    Ich glaub ja, der Kollege schickt 7 Bit, dann ist natürlich das MSB scheinbar immer Null, da es in Wirklichkeit das Stoppbit ist.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad