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
Lesezeichen