Jetzt muss ich doch nochmal auf was zurückkommen...
Ich würde das ganze gern als Interrupt ausführen, aber das funktioniert nicht, nur frage ich mich wieso....
Wenn ich den Code nun so schreibe:
Code:
$regfile = "m128def.dat" 'ATmega128
$crystal = 11059200 'Quarz: 11059200 Hz
$hwstack = 32 'Hardware Stack
$swstack = 32 'Software Stack
$framesize = 32 'Framesize
$baud = 9600
Config Serialin = Buffered , Size = 100
Declare Function Read_string(byval Stringlaenge As Byte) As String
Declare Sub Wait_for_string(byval S As String)
Dim Zeichen As String * 8
Config Lcd = 20 * 4a , Chipset = Ks077
Config Lcdpin = Pin , Db4 = Porta.0 , Db5 = Porta.1 , Db6 = Porta.2 , Db7 = Porta.3 , E = Porta.4 , Rs = Porta.5
Config Lcdbus = 4
Waitms 100
Initlcd
Cursor Off
Do
Call Wait_for_string( "y")
Zeichen = Read_string(6)
Locate 2 , 1
Lcd Zeichen
Locate 3 , 10
Lcd "Hallo"
Loop
'***BEGIN***********AUSLESEN DER RS-232********************
Sub Wait_for_string(byval S As String) As String
Local Startpunkt As Byte
Local Empfangen As Byte
Startpunkt = 1
M1:
Empfangen = Waitkey()
If Empfangen <> Mid(s , Startpunkt , 1) Then
Goto M1
Else
Incr Startpunkt
If Startpunkt > Len(s) Then Goto M2
Goto M1
End If
M2:
End Sub
Function Read_string(byval Stringlaenge As Byte) As String
Local Empfangen As Byte
Local Ss As String * 10
Ss = ""
Do
Empfangen = Waitkey()
Ss = Ss + Chr(empfangen)
Loop Until Empfangen = ","
Read_string = Left(ss , Stringlaenge)
End Function
'***ENDE***********AUSLESEN DER RS-232********************
End
Dann funktioniert das Auslesen der RS-232 problemlos, allerdings wartet mein Programm dann logischerweise immer an der Stelle Call Wait_for_string( "y") bis ein String reingeflattert kommt. Erst dann würde er das "Hallo" anzeigen.
Das will ich jedoch nicht und so habe ich mir gedacht das einfach in einen Interrupt zu legen, der dann so ausschaut:
Code:
$regfile = "m128def.dat" 'ATmega128
$crystal = 11059200 'Quarz: 11059200 Hz
$hwstack = 32 'Hardware Stack
$swstack = 32 'Software Stack
$framesize = 32 'Framesize
$baud = 9600
Config Serialin = Buffered , Size = 100
Declare Function Read_string(byval Stringlaenge As Byte) As String
Declare Sub Wait_for_string(byval S As String)
Dim Zeichen As String * 8
On Urxc
Enable Urxc
Enable Interrupts
Config Lcd = 20 * 4a , Chipset = Ks077
Config Lcdpin = Pin , Db4 = Porta.0 , Db5 = Porta.1 , Db6 = Porta.2 , Db7 = Porta.3 , E = Porta.4 , Rs = Porta.5
Config Lcdbus = 4
Waitms 100
Initlcd
Cursor Off
Do
Locate 2 , 1
Lcd Zeichen
Locate 3 , 10
Lcd "Hallo"
Loop
'***BEGIN***********AUSLESEN DER RS-232********************
Sub Wait_for_string(byval S As String) As String
Local Startpunkt As Byte
Local Empfangen As Byte
Startpunkt = 1
M1:
Empfangen = Waitkey()
If Empfangen <> Mid(s , Startpunkt , 1) Then
Goto M1
Else
Incr Startpunkt
If Startpunkt > Len(s) Then Goto M2
Goto M1
End If
M2:
End Sub
Function Read_string(byval Stringlaenge As Byte) As String
Local Empfangen As Byte
Local Ss As String * 10
Ss = ""
Do
Empfangen = Waitkey()
Ss = Ss + Chr(empfangen)
Loop Until Empfangen = ","
Read_string = Left(ss , Stringlaenge)
End Function
'***ENDE***********AUSLESEN DER RS-232********************
Onrxd:
Call Wait_for_string( "y")
Zeichen = Read_string(6)
Return
End
Nun zeigt mein AVR das "Hallo" an, allerdings wertet er keine Zeichenkette von der UART aus....nur wieso??? Denn das interessante kommt jetzt, wenn ich die Zeile Zeichen = Read_string(6) (und nur diese) wieder oben in Do...Loop reinhaue sieht man wieder dass er auf das Interrupt (korrekt) reagiert.
Code:
$regfile = "m128def.dat" 'ATmega128
$crystal = 11059200 'Quarz: 11059200 Hz
$hwstack = 32 'Hardware Stack
$swstack = 32 'Software Stack
$framesize = 32 'Framesize
$baud = 9600
Config Serialin = Buffered , Size = 100
Declare Function Read_string(byval Stringlaenge As Byte) As String
Declare Sub Wait_for_string(byval S As String)
Dim Zeichen As String * 8
On Urxc
Enable Urxc
Enable Interrupts
Config Lcd = 20 * 4a , Chipset = Ks077
Config Lcdpin = Pin , Db4 = Porta.0 , Db5 = Porta.1 , Db6 = Porta.2 , Db7 = Porta.3 , E = Porta.4 , Rs = Porta.5
Config Lcdbus = 4
Waitms 100
Initlcd
Cursor Off
Do
Zeichen = Read_string(6)
Locate 2 , 1
Lcd Zeichen
Locate 3 , 10
Lcd "Hallo"
Loop
'***BEGIN***********AUSLESEN DER RS-232********************
Sub Wait_for_string(byval S As String) As String
Local Startpunkt As Byte
Local Empfangen As Byte
Startpunkt = 1
M1:
Empfangen = Waitkey()
If Empfangen <> Mid(s , Startpunkt , 1) Then
Goto M1
Else
Incr Startpunkt
If Startpunkt > Len(s) Then Goto M2
Goto M1
End If
M2:
End Sub
Function Read_string(byval Stringlaenge As Byte) As String
Local Empfangen As Byte
Local Ss As String * 10
Ss = ""
Do
Empfangen = Waitkey()
Ss = Ss + Chr(empfangen)
Loop Until Empfangen = ","
Read_string = Left(ss , Stringlaenge)
End Function
'***ENDE***********AUSLESEN DER RS-232********************
Onrxd:
Call Wait_for_string( "y")
Return
End
Nun nimmt er Strings von der RS-232 entgegen und gibt diese auch (fast) korrekt aus, allein das Startzeichen ("y") lässt er noch stehen aber das wäre ja nicht so wild. Nur dumm dass er jetzt erst wieder auf einen Rückgabewert der Funktion Read_string wartet und vorher nichts anderes macht.
Aber mein Verstand steigt schon beim 2. Codebeispiel aus. Wieso führt der AVR beim Interrupt das nicht wie gewüscht aus? Ich habe doch die 2 auszuführenden Anweisungen lediglich vom Hauptprogramm ins Interrupt gelegt??
Lesezeichen