Du hast offenbar einen Finger für seltsame Erscheinungen.
Du sagst, das $crystal und $baud stimmen ?
Analog müßte sein
j -> z
A -> Q
% -> 5
Ist das so ?
Hi, ich hab mir die Einführungen von www.rowalt.de durchgelesen und den Code für den Datenempfang mit UART über Interrupt ausprobiert.
Ich hab nicht alles übernommen, hier mal der Code:
Jetzt kommt aber wenn ich im Bascom-Terminal was sende irgendein random Buchstabe an:Code:Dim I As Byte Ddrd = &B00100000 On Urxc Onrxd Enable Urxc Enable Interrupts Main: 'nix Goto Main Onrxd: I = Udr Printbin I Return
eingegeben -> bekommen
a -> q
b -> r
c -> s
aber:
q -> q
r -> r
s -> s
Baud ist in sowohl im Controller als auch am PC 9600.
Muss ich des kapieren?
mfg
jagdfalke
Du hast offenbar einen Finger für seltsame Erscheinungen.
Du sagst, das $crystal und $baud stimmen ?
Analog müßte sein
j -> z
A -> Q
% -> 5
Ist das so ?
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Oh man, ich habs rausgefunden. $crystal hat nicht gestimmt. ich hatte ein .bas-file genommen, dass nicht die richtige Einstellung für Crystal hat und hab's da einfach reingeschrieben. Wenn $crystal 8000000 ist dann gehts.
Aber mal zwei Fragen dazu:
1.
Warum ist crystal dafür eigenlich wichtig? Den Zusammenhang versteh ich nicht. Baud seh ich ja ein aber crystal ?
2.
Was bedeutet das Ddrd = &B00100000 genau? Hat das überhaupt was mit dem Interrupt zu tun? Ich frag das, weil es in dem Beispiel-Code steht aber mein Pogramm auch ohne auskommt.
@Picnick:
Ich seh grad du heißt Robert. Ist das deine Seite von der ich das hab?
crystal=
erst dadurch weiß er, wie lange 1 sekunde dauert
crystal = 8000000 --> wenn der Quarz 8 Millionen mal gebrummt hat, ist eine Sekunde rum
Erst dadurch kann er mit BAUD = 9600 ausrechnen, wie breit er die Bit machen muß, damit 9600 Stück in eine Sekunde reinpassen.
DDRD=
jedes Bit in dem register stellt einen Pin am Port D dar. Is'n einser drin, nimmt er den Pin als Output, sonst als Input
analog gibt's ein DDRA, DDRB, DDRC usw.
Mit der UART hat das nix zu tun. wahrscheinlich hat das Beispiel da ein LED drauf gehängt ??
Robert=
Ich bestreite die Vaterschaft. Das muss'n Namensvetter sein
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Alles klar. Hätte ja sein können.
Ok, danke du hast mir sehr geholfen das ganze besser zu verstehen. Seltsam, dass meistens du mir antwortest. Ich komm mir vor als ob ich dir ziemlich auf die Nerven geh. Vorallem war dieser Thread ja nicht wirklich ein Problem, sry meine Schuld
Vergiß' sowas. Wenn ich Streß habe, geb' ich eh keine Antwort.Zitat von jagdfalke
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Hi, ich hab jetzt was geschrieben:
Die Bedingung Len(serial_in) = Data_len ist dummerweise nie erfüllt, schätz mal weil die Typen nicht übereinstimmen. Wie wandle ich die denn um? Einfach Integer = String scheint nicht zu funktionieren.Code:Dim Incoming_ascii As Byte Dim Incoming_char As String * 1 Dim Serial_in As String * 255 Dim Temp_Byte As Byte Dim Data_str As String * 255 Dim Header_str As String * 2 Dim Data_len As String * 1 Incoming_ascii = 0 Incoming_char = "" Serial_in = "" Temp_Byte = 0 Data_str = "" Header_str = "" Data_len = "" On Urxc Onrxd Enable Urxc Enable Interrupts Main: Goto Main Onrxd: Incoming_ascii = Udr Incoming_char = Chr(incoming_ascii) If Incoming_char = ">" Then Serial_in = Serial_in + Incoming_char If Len(serial_in) > 2 Then Temp_byte = Len(serial_in) - 2 Data_str = Left(serial_in , Temp_byte) Header_str = Right(serial_in , 2) Data_len = Left(header_str , 1) If Len(serial_in) = Data_len Then Print Len(serial_in) Print Data_len Print Data_str Print Header_str End if Serial_in = "" Else Print "String < 2" Serial_in = "" End If Else Serial_in = Serial_in + Incoming_char End If Return
Kann sich jemand den Code mal im groben und ganzen anschaun und mir sagen ob ich irgendwas wichtiges vergessen habe? Oder man was besser machen kann? Wäre echt super !!!
mfg
jagdfalke
Hallo, Junge !
Ich debugge mich normalerweise mit dem Print von einem zum nächsten durch:
hinter "incoming_char = chr....."
mach gleich einen Print incoming_char;
Wenn alles funzt, ist das mehr oder weniger ein echo.
dann schmeiss den Print und mach hinter "serial_in = serial_in + ..."
einen "print serial_in"
ein zwischenschritt:
temp_byte = len(serial_in)
print str(serial_in)
Und so geht's weiter. dann kannst du immer schauen, wie's läuft und nicht das rauskommt, was sollte.
EDIT: Ich mißtraue dem Len(xx) innerhalb einer "IF" abfrage
probier temp_byte = len (..
und dann if temp_byte > 2 ......
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Ja das mach ich auch immer so. Und es passte eigentlich immer alles. Ich wollte eigenlich nur wissen ob mein Program vom Prinzip her passt und wie ich des String in ein Integer umwandeln kann.
Für string--> Integer ist val zuständig
x = val ( string )
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Lesezeichen