PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : serielle befehle empfangen



Keksdose
02.08.2005, 12:39
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):


'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... 8-[

artools
05.08.2005, 13:17
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

JulianF
05.08.2005, 13:33
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

PicNick
05.08.2005, 14:25
...das UART nur ASCII127 benutzt
Kannst du das näher erläutern ?

JulianF
06.08.2005, 12:28
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

06.08.2005, 12:52
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

izaseba
06.08.2005, 12:56
hmm habe vergessen mich einzulogen,
Der beitrag drüber ist von mir und bezog sich auf die Aussage von Julian

Gruß Sebastian

PicNick
06.08.2005, 14:25
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.

izaseba
06.08.2005, 14:41
@Robert,
Das ist mir schon klar, ich habe einfach nur nicht geglaubt, daß der MSB immer auf High gesetzt sein soll.

Gruß Sebastian

PicNick
06.08.2005, 18:25
@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.