PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Input geht genau einmal?



globe711
20.12.2004, 14:59
Hi Ihr Profis!

Ich bin grad am verzweifeln! Ich möchte zwei MCU miteineander verbinden über uart.
habe schon viel probiert und es geht am besten mit dem Input Befehl sieht in etwa so aus:

On URXC OnRxD 'Interrupt-Routine setzen
Enable URXC 'Interrupt URXC einschalten
Enable Interrupts 'Interrupts global zulassen
.
.
.
OnRxD:
Input X 'X = Udr
Print X 'Byte als Echo zurückgeben
Return

Leider geht die Sache genau einmal dann erst nach einem Neustart wieder.

Ich bin mir sicher da kann mir einer von Euch helfen.

albundy
20.12.2004, 16:21
Was soll der MC auch machen, nachdem er das Programm einmal durchgegangen ist ? Du solltest eine Schleife einbauen.

globe
20.12.2004, 16:35
Hi

Ist schon klar!

ist ja auch nur ein Ausschnitt...

Sonst noch jemand Ideen?

sebastian.heyn
20.12.2004, 17:37
Hi. hast du mal versuchsweise das Enable URXC ans ende der interruptroutine gemacht? Ich machs wie auf www.rowalt.de beschrieben. Weiss nicht was in bascom der input befehl bewirkt, vielleicht disabled er ja den interrupt? (nur ne vermutung)

globe
20.12.2004, 18:27
Ja hab ich auch chon probiert und es will leider nicht. Naja ich habs mit dem Input - Befehl langsam aufgegeben...

Die Beispiele von rowalt.de hab ich mir auch schon angeschaut. Es klappt auch einzelne Zeichen zu empfangen. Nur wie schaffe ich es diese wieder zu einem Integer zusammen zu setzten?
Beispiel:
Ich emfange eine 1 dann eine 2 und zuletzt eine 3. Wie schaffe ich es jetzt diese zu einer 123 zusammen zu bauen? Habe es schon mit einem Feld probiert aber dabei geht immer ein Zeichen verlohren.

$regfile = "2313def.dat"
$crystal = 3686400
$baud = 9600

Dim S As Word At &H60
Dim B(3) As Byte At &H60 Overlay
Dim N As Byte

On Urxc Onrxd
Enable Urxc
Enable Interrupts

Main:
If N > 3 Then
Printbin S
N = 0
End If
Goto Main

Onrxd:
N = N + 1
B(n) = Udr

Return


Danke schon mal!

sebastian.heyn
20.12.2004, 18:52
machst aus s nen string, und dann kannst du den ja mit "val" in ein byte oder integerwert interpretieren lassen.. dann müsste es gehen, glaub ich 8-[

Dino Dieter
20.12.2004, 19:25
Hallo

Schau dir das Beispiel mal an. Wenn du fragen hast frage nochmal, habe im Moment aber wenig Zeit.


Dim S As Word At &H60
Dim B(3) As Byte At &H60 Overlay

Das passt ja schon mal nicht so ganz. Word hat nur 2 Bytes.



$regfile = "2313def.dat"
$crystal = 3686400
$baud = 9600

Dim S As Integer
Dim Temp As Byte
Dim B(3) As Byte
Dim N As Byte

On Urxc Onrxd
Enable Urxc
Enable Interrupts

Main:
If N = 3 Then 'wenn 3 zeichen empfangen wurden, auswerten
S = B(1) * 100 '1. Zeichen hat eine 100 Wertigkeit
Temp = B(2) * 10 '2. Zahl hat eine 10 Wertigkeit
S = S + Temp '100er und 10er addieren
S = S + B(3) 'und noch die Einer dazu, fertig
Print S
N = 0
End If
Goto Main

Onrxd:
N = N + 1
B(n) = Udr - 48 'aus ASC II Code den Wert gewinnen, 0 = 48, 1 = 49 usw 9 = 57

Return

So sollte es gehen, wenn du die Zeichen von dem anderen uC per Print Befehl ausgibst.


MFG
Dieter

globe
20.12.2004, 20:44
Jo danke Euch!
Werd mir die Sache dann noch mal in Ruhe anschaun. Wenn ich noch Fragen hab meld ich mich.

sebastian.heyn
20.12.2004, 20:47
hey so geht es auch voll gut mit viel weniger rechenaufwand!

globe
21.12.2004, 07:35
Super jetzt geht die Sache. Hab gestern noch bis um 3 programmiert und jetzt bin ich in der FH oder doch besser ich liege in der FH.
War eine super Tip Dieter. Danke