PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ominöses Problem mit RS232 und IRQ - ich bin Ratlos!



Dnerb
26.06.2007, 20:17
Hallo Leute,

eines vorneweg. RS232 mit Bascom und dem AVR ist nichts neues für mich. Trotzdem weis ich wirklich nicht was ich hier falsch gemacht haben könnte.

Zum Code: da ich vom SRAM fast nichts brauche, habe ich die Stacks sehr großzügig ausgelegt. Warum mit den Bytes geizen wenn ich KBs habe die nur brach liegen? ;)

Die Programme wie angehängt sind auf 19200 baud ausgelegt.

Die Version die funktioniert, hat kein Problem mit 115200 Baud, also an einem "zu langsam für die Baudrate" kann es eigentlich nicht liegen.
Außerdem funktioniert diese Version auch noch mit meiner (riesen) Abfrageroutine die ich allerdings fürs Forum entfernt habe, da sich der Effekt auch so zeigt und damit offensichtlich nicht das Problem verursacht.

Einziger unterschied zwischen den Programmen ist, das folgende Routine bei einem Programm in der IRQ Routine steht (und dort alles funktioniert) und das andere mal steckt die Routine im Hauptteil des Programms. (Und dort funktionierts nicht.)


Command = Command + Chr(rs232)

If Rs232 = &H2F Then
Command = "/"
Tempirq = 0
End If


Zur Funktion des Programms: Über ein Terminalproggi schicke ich Befehle an den AVR. Synthax: "/" als identifier und danach der Befehl, z.B. "/help".
Kommt ein "/" wird der String "Command" quasi gelöscht und nur ein "/" befindet sich darin. (Falls vorher Müll drin steht). Mit jedem weiteren Zeichen wird in der Abfrage nachgeschaut ob es ein gültiger Befehl ist und entsprechend eine Subroutine angesprungen.
Bei mehr als 12 Zeichen wird "Command" gelöscht, weil der längste Befehl 12 Zeichen hat und ein überlauf keinen Sinn macht. Und der Anfang eines Befehls wird mit "/" detektiert bevor die 12 Zeichen abfrage kommt.

Tippe ich bei Version 1 "/help" ein und drücke Return, dann bekomme ich als Echo lediglich ein "/e". Und das jedes mal!
Schicke ich die Buchstaben einzeln dann erscheint jeder Buchstabe und zum schluß steht "/help" als Echo auf dem Bildschirm.
Mit dem funktionierenden Programm ist das alles kein Problem. Da kann ich auch längere Befehle (12 Zeichen) am Stück verschicken und das Echo passt.
Eigentlich ist nach einem IRQ vom Uart mehr als genug Zeit um alles andere abzuarbeiten.

Da ich ein Fan vom "sauberen" Programmierstil bin, will ich die IRQ-Routinen nicht unnötig aufblasen. Die IRQ-Routine wird auch noch an einer anderen Stelle im Programm gebraucht und dort stört mich diese Teilroutine. Vor allem weil dort der String überläuft, ich aber an der Programmstelle die 12-Zeichen-Abfrage nicht einbauen will.

Ich bin für jeden Sachdienlichen Hinweis dankbar!

Gruß Dnerb

Nicht Funktionierendes Proggi:


$regfile = "m162def.dat"
$crystal = 14745600

$framesize = 128
$swstack = 128
$hwstack = 128

Dim Tempirq As Byte
Dim RS232 as Byte
Dim Command As String * 13

On Urxc Onrxd
Enable Urxc

Ubrr0l = 47

Enable Interrupts

'---------------Main: (Version 1 - funktioniert nicht)

Mainabfrage:

If Tempirq = 0 Then Goto Mainabfrage

Command = Command + Chr(rs232)

If Rs232 = &H2F Then
Command = "/"
Tempirq = 0
End If

If Len(command) > 12 Then
Command = ""
Tempirq = 0
Goto Mainabfrage
End If

Print Command

'Anstatt dem "Print Command" steht hier normalerweise die Abfrageroutine für die Befehle
'die ich über die RS232 schicke. Syntax: "/Befehl"

Tempirq = 0

Goto Mainabfrage

'---------------IRQ:

Onrxd:

Rs232 = Udr
Tempirq = 1

Return

End


Funktionierendes Programm:


$regfile = "m162def.dat"
$crystal = 14745600

$framesize = 128
$swstack = 128
$hwstack = 128

Dim Tempirq As Byte
Dim RS232 as Byte
Dim Command As String * 13

On Urxc Onrxd
Enable Urxc

Ubrr0l = 47

Enable Interrupts

'---------------Main: (Version 2 - funktioniert 1A)

Mainabfrage:

If Tempirq = 0 Then Goto Mainabfrage

If Len(command) > 12 Then
Command = ""
Tempirq = 0
Goto Mainabfrage
End If

Print Command

'Anstatt dem "Print Command" steht hier normalerweise die Abfrageroutine für die Befehle
'die ich über die RS232 schicke. Syntax: "/Befehl"

Tempirq = 0

Goto Mainabfrage

'---------------IRQ:

Onrxd:

Rs232 = Udr
Tempirq = 1

Command = Command + Chr(rs232)

If Rs232 = &H2F Then
Command = "/"
Tempirq = 0
End If

Return

End