-
Hilfe, UART und ASCII ?
Hi Leute, ich hab mein Brückenprogramm soweit fertig..das problem:
Ich will von der seriellen einen wert von -1024 bis 1024 empfangen..
Ich kann den motor auch schon steuern, aber das proggi greift anscheinend immer nur ein ASCII-zeichen auf.. zb. wenn ich versuche 900 zu senden, nimmt er die 9, welches ASCII 57 ist...ich will aber die 900 haben, was kann ich ändern?
Hier mal das Proggi
Code:
$regfile = "m8def.dat"
$crystal = 16000000
$baud = 19200
Dim S As Integer
Dim S1 As Integer
Dim I As Integer
Dim J As Integer
Config Pinb.1 = Output
Config Pinb.2 = Output
Config Pind.5 = Output
Config Pind.6 = Output
Config Pind.7 = Output
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 8
Portd.6 = 1
Portd.7 = 1
On Urxc Onrxd
Enable Urxc
Enable Interrupts
I = 0
Do
print "Speed=" ; S
Loop
Onrxd:
S = Udr
Return
End
Bitte helft mir, is echt wichtig, die RL steht ja bald an :)
Gruss Stefan
-
Ohne dass ich jetzt genau helfen könnte, klingt das nach ner "verkürzten" Abfrage..
Ich würde an der Stelle suchen, wo die Daten empfangen werden..
-falscher Datentyp?
-kein Buffer?
-werden die empfangenen Zeichen hinterher nicht wieder zusammengesetzt?
'900' sind ja immerhin 3 Byte als Ascii..
Gruß
Nico
-
Mhmm..also mit der Antwort kann ich jetzt nicht sooo viel anfangen, aber dank :)
Datentyp is ja immerhin integer, der sollte das doch packen?
Buffer kann ich keinen einbauen, weil ich ja die daten über interrupt empfange, dann meckert er beim compilen..
Wieder zusammengesetzt..keine ahnung, weiss ja nicht mal warum ich jetzt plötzlich ascii empfange, wollt doch nur die 900 als dezimalzahl versenden, also egal was, irgend ne zahl zwischen -1023 und 1023..
Gruss Stefan
-
Wenn du Wert darauf legst, die UART mit Interrupt zu bedienen, mußt du einiges zu Fuß machen
Vorschlag ohne Interrupt
Code:
dim instr as string * 5
' On Urxc Onrxd entfällt
' Enable Urxc
Enable Interrupts
I = 0
Do
input "Enter Speed ", instr
s = val(instr)
print "Speed=" ; S
Loop
' isr-routine entfällt
-
damit empängst du nur 1 byte, du musst eine abfrage machen ob 3 oder 4 byte empfangen wurden und diese dann mit val umsetzen in eine zahl.
mit input wird das gesamte programm blockiert wird, bis zur eingabe.
ausser du sendest zwischendurch dummys, nur damit der rest des programms angesprochen wird, geht auch.
mfg pebisoft
-
Jo, ich wollte es ja auch erst mit input machen, aber wie schon erwähnt, blockiert dann das system und das Programm wird nicht fortgesetzt, da ich aber ne schleife hab in der gezählt werden muss, darf es nicht blockieren..
würde es schon gerne mittels interrupt machen, hat mir vll. jemand nen codeschnipsel, dass ich es besser verstehe?
Also beispiel sende ich zb. von hauptprozessor an das Programm hier:
I=800
Print #1, I
oder print "800"
was auch immer :)
Gruss Stefan
-
Nun, so soll es halt sein:
Du kriegst deine Zahlen ascii-Zeichenweise, also mußt du sie zusammenbauen. Ich schreib nur das Wesentliche
Code:
Dim Inint As Integer
dim Vz as integer
dim Inchar as byte
On Urxc Onrxd
Enable Urxc
Enable Interrupts
Inint = 0
VZ = 1
Do
if inchar = 13 then ' sonst dreht er wilde Schleifen
print "Speed=" ; S
end if
Loop
End ' end gehört eigentlich hierher
Onrxd:
inchar = UDR
if inchar = 13 then ' <ENTER> d.h. fertig, input nach S
s = inint * VZ ' vorzeichen berücksichtigen
inint = 0 ' fürs nächste
VZ = 1 ' fürs nächste
elseif
inchar = 45 then ' "-" d.h. negative Zahl
VZ = VZ * -1
else
inint = inint * 10 ' rüberrücken
inchar = inchar AND 15 ' ascii --> binär
inint = inint + inchar ' einerstelle dazu
end if
Return
Vorsicht, es erfolgt keine Prüfung, ob wirklich 0-9 eingegeben wird,
auch nicht, ob mehrere Vorzeichen kommen.
Ich hoff', ich hab mich nicht verschrieben
-
besser wäre es , wenn du einfach eine dummyzahl senden würdest damit input immer sofort weiterläuft. dann fragst du einfache mit if ab , ob es ein dummy ist. ist kürzer als das zusammensetzen, abfragen und wieder umwandeln.
mfg pebsoft
-
Jo..also das sieht mir schon ziemlich komplex aus, aber ich kann auch nicht ständig ne dummyzahl senden, der hauptprozessor hat doch auch noch andere sachen zu tun...
Gibts nicht noch ne andere möglichkeit? Früher konnt ich doch auch direkt zahlen versenden, warum geht das jetzt nicht mehr?
Argh.,.ich krieg die kriese...
Gruss Stefan
-
mensch junge, ein dummy braucht nicht viel zeit. probier das doch mal aus.
was meinst du, wieviel zeit bei einem programm verschleudert wird, bloss weil hier und da ein wunsch einfliessen muss. den zeittest kannst du mit avrstudio sehr gut auswerten. du wirst staunen, wie schnell dieses ist.
und wenn du dein programm in winavr-c schreibst, wird es ca um 400% schneller.
wenn du auf schnelligkeit hohen wert gelegt hättest, dann wär das programm in winavr-c entstanden. also dümpelst du eh rum und beschwerst dich über ein eigelesenes pseudobyte.
mfg pebisoft