PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zu Input-Interrupt



jagdfalke
06.07.2005, 09:34
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:


Dim I As Byte
Ddrd = &B00100000
On Urxc Onrxd
Enable Urxc
Enable Interrupts

Main:
'nix
Goto Main

Onrxd:
I = Udr
Printbin I
Return


Jetzt kommt aber wenn ich im Bascom-Terminal was sende irgendein random Buchstabe an:
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

PicNick
06.07.2005, 10:15
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 ?

jagdfalke
06.07.2005, 10:52
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?

PicNick
06.07.2005, 11:19
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

jagdfalke
06.07.2005, 11:27
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 :(

PicNick
06.07.2005, 11:36
... als ob ich dir ziemlich auf die Nerven geh.

Vergiß' sowas. Wenn ich Streß habe, geb' ich eh keine Antwort.

O:)

jagdfalke
07.07.2005, 17:47
Hi, ich hab jetzt was geschrieben:


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


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.
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

PicNick
07.07.2005, 18:55
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 ......

jagdfalke
07.07.2005, 19:01
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.

PicNick
07.07.2005, 19:43
Für string--> Integer ist val zuständig

x = val ( string )

jagdfalke
07.07.2005, 19:46
Danke! Ich hab ja mittlerweile gelernt die Bascom-Hilfe zu benutzen ;) aber man kann ja nur nachschaun wie man einen Befehl benutzt, dessen Namen man kennt.

PicNick
07.07.2005, 19:58
Kränk' dich nicht, ich hab auch gesucht, ich wußte nur, da war doch was