PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hilfe, UART und ASCII ?



Gobstar
27.09.2005, 12:08
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



$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

0tes_Gesetz
27.09.2005, 13:46
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

Gobstar
27.09.2005, 14:30
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

PicNick
27.09.2005, 14:43
Wenn du Wert darauf legst, die UART mit Interrupt zu bedienen, mußt du einiges zu Fuß machen
Vorschlag ohne Interrupt


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

pebisoft
27.09.2005, 14:43
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

Gobstar
27.09.2005, 15:26
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

PicNick
27.09.2005, 15:45
Nun, so soll es halt sein:
Du kriegst deine Zahlen ascii-Zeichenweise, also mußt du sie zusammenbauen. Ich schreib nur das Wesentliche


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

pebisoft
27.09.2005, 16:06
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

Gobstar
27.09.2005, 16:57
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

pebisoft
27.09.2005, 18:06
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

Gobstar
27.09.2005, 18:12
Jo..aber ich hab nicht vor nen dummy zu schreiben, es muss doch auch noch nen anderen weg geben weil sonst ist ja meine brücke wieder von dem andauernden senden des mega16 abhängig und das will ich ja nicht..die soll die pwm selber hochzählen, sonst könnt ich auch 900mal den wert 900 schreiben und hätte das gleiche ergebnis....zudem kann ich kein winavr-c

Kann ich vll. die zahl vom m16 als string senden und nachher wieder auseinander nehmen und als ganze zahl haben?

Ich blick bald garnix mehr

Gruss Stefan

pebisoft
27.09.2005, 18:31
deine hochzählschleife kannste mit interrupt machen.
mfg pebisoft

Gobstar
27.09.2005, 18:55
Alsooooo...vielen dank an euch, es funktioniert

Habs jetzt mit printbin und inputbin zusammen mit ischarwaiting gelöst...


vielen dank nochmal :)

Gruss Stefan