PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RS232 Interrupt Problem



apfelsafft
02.11.2007, 23:08
Hallo zusammen,

ich möchte micht gerne mit meinem ATmega8 über RS232 unterhalten.
Ansich kein Problem, die inkey() Funktion funktioniert fast problemlos.

An den AVR möchte ich Befehle schicken auf die er dann reagiert. Einziger Zwang ist dass meine Befehle mit CR+LF enden. Und hier liegt mein Problem!
Nach einigen Fehlern mit inkey(), die ich als zeitliche Probleme einschätze (lange IF/THEN in der Loop) möchte ich die ISR Variante probieren.

Gegenstelle ist ein Hyperterm mit CR+LF senden aktiviert.

Meine Befehle trudeln als einzelne Zeichen ein und ich erkenne diese dann auch wenn CR+LF kommt.
Allerdings scheint irgendwas mit CR+LF nicht zu stimmen.

Ich beobachte, dass:
- das CR kommt aber der IF Zweig nicht erreicht wird (anstelle kommt LF)
- der Originalwert von UDR sich ändert, sobald er z.B. in CHR(udr) verändert wird. Er hängt dann immer Zeichen hinterher und zeigt mir erstmal das vorher getippte Zeichen ein.

Aus meiner Sicht müßte doch eigentlich während der Print-Anweisung UDRX, UDR und XUDR identisch sein... Sind sie aber nicht
:-k

Tippe ich den "INIT" Befehl in Hyperterm und schicke ihn ab erhalte ich folgende Ausgabe:

UDR_: 73 udr: 10 xudr: 73
I
UDR_: 78 udr: 73 xudr: 78
IN
UDR_: 73 udr: 78 xudr: 73
INI
UDR_: 84 udr: 73 xudr: 84
INIT
UDR_: 10 udr: 13 xudr: 13
LF
On your command! INIT
Init something
UDR_: 10 udr: 13 xudr: 10
LF
On your command!
Error


Wer kann mir damit helfen?

Vielen Dank
René

Code siehe hier:



'#################################
'# Serial Test #
'#################################

$regfile = "M8def.dat"
$crystal = 16000000
$baud = 2400

' set serial stuff
Config Com1 = 2400 , Synchrone = 0 , Parity = Even , Stopbits = 2 , Databits = 7 , Clockpol = 0

'Interrupts zum Empfangen auf der RS232
On Urxc Onrxd
Enable Urxc

Dim Udrx As Byte
Udrx = 0

Dim Xudr As Byte
Xudr = 0

Dim Got_new As Bit
Got_new = 0

Dim Rs232_in As String * 8
Rs232_in = ""

Dim Rs_cmd As String * 8
Rs_cmd = ""

Dim Cmd_valid As Bit
Cmd_valid = 0


' set port stuff
Config Portd = Output
'Config Portc = Output

'Interrupts Global einschalten
Enable Interrupts


Const Quot = 34
Const Cr = 13
Const Lf = 10


'###Deklarationen###
Led1 Alias Portd.5 'LED Gelb
Led2 Alias Portd.6 'LED Rot


Do

If Got_new = 1 Then
Got_new = 0
Xudr = Udrx
Print "UDR_: " ; Udrx ; " udr: " ; Udr ; " xudr: " ; Xudr

If Udrx = Lf Then
Print "LF"
Rs_cmd = Rs232_in
Rs232_in = ""
Cmd_valid = 1
Elseif Udrx = Cr Then
Print "CR"
Else
Rs232_in = Rs232_in + Chr(udrx)
Print Rs232_in
End If
End If

'we got a valid commandt
If Cmd_valid = 1 Then
Cmd_valid = 0
Print "On your command! " ; Rs_cmd

If Rs_cmd = "INIT" Then 'init

Print "Init something"

Else
Print "Error " ; Rs_cmd ' Error
'Print "unknown: " ; Rs_cmd
Toggle Led2
End If
Rs_cmd = "" 'command detection
End If
Loop


Onrxd:
Udrx = Udr
Got_new = 1

Return

End