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


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:
Code:
'#################################
'# 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