PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : probleme mit usart



katiiiiii
07.04.2005, 10:13
hi leute!

kann man über USART auch einen int-wert in der größe von ca. 16777216 senden, ohne dass man den Wert aufteilt?

mfg kati

PicNick
07.04.2005, 10:44
USART kann (standardgemäß) nur ein Byte senden. du mußt also 4 Byte senden und mit dem Komm-Partner ausmachen, daß die 4 Bytes zusammengehören. Riecht ein bißchen nach Protokoll, is auch eines.
Du kannst auch auf ASCII -konvertieren (printf) und sagen, bis zum CRLF gehörts immer zusammen.

katiiiiii
07.04.2005, 10:56
kannst du mir vl an tipp gehn, wie ich das dann im code selber ausschaut?
i weiß nämlich nicht, wie man einen so großen wert in 4 Bytes aufteilt.
danke!

mfg Kati

PicNick
07.04.2005, 12:00
In C geht's mit "union" recht leicht:

union {
int32 grossezahl;
unsigned char einzeln[4];
} jenachdem;

main()

jenachdem.grossezahl = 16777216;
for { i= 0; i < 4; i++)
{
out = jenachdem. einzeln[i];
}

Auf der Empfangsseite

for { i= 0; i < 4; i++)
{
jenachdem. einzeln[i] = inp
}
printf("%d\n", jenachdem.grossezahl);

Hilft das ?

katiiiiii
07.04.2005, 16:31
naja, i weiß net so ganz ob des mit int32 geht. weil i programmier im CodeVisionAVR und i versteh des mit dem jenachdem net so ganz. was meinst du mit jenachdem?

mfg kati

katiiiiii
07.04.2005, 16:58
aber ich kann dir mal mein programm zeigen
hab mi da mal a bissl damit herumgespielt und einfach jeweils vier werte pro richtigen wert versucht zu senden.

mfg kati

PicNick
07.04.2005, 17:14
Hi,
"jenachdem" ist einfach der Name von der union.
union {
double Zahl;
unsigned char btt[4];
}jenachdem;

jenachdem.Zahl u. jenachdem.btt[4] haben physisch die gleiche AnfangsAdresse.

jenachdem.Zahl ist der Wert als ganzes (z.B. 16777216)

jenachdem.btt[0] ist das erste Byte von dem double
jenachdem.btt[1] ist das zweite Byte von dem double
jenachdem.btt[2] ist das dritte Byte von dem double
jenachdem.btt[3] ist das vierte Byte von dem double

Und diese einzelnen Byte kannst du nacheinander senden





sagst du im C jenachdem.Zahl

katiiiiii
07.04.2005, 20:52
danke
werds dann gleich ausprobieren

mfg
kati

katiiiiii
07.04.2005, 21:08
hi! so, i habs ausprobiert, aber bei mir kommen 4 fehlermeldungen. i glaub bei CodeVisionAVR haut des ganze net so hin. außerdem gibts bei mir den befehl printf nicht. ich sende alles mit UDR.
irgendwelche klammern und beistriche fehlen.

mfg kati

PicNick
08.04.2005, 09:47
Guten Morgen Katiiiii !
Für mein Verständnis : du hast einen Timer, und immer, wenn der Timer schnackelt, soll er ein double über die USART rauschicken. Ist das so ?
zweite Frage: wenn du etwas binäres binär rausschickst, muß der Empfänger aber mitspielen. WEM willst du das double schicken ? Terminal und so wird nix bringen.

Arexx-Henk
09.04.2005, 09:40
hallo katiiiiii

UDR=mag_y1;
UDR=mag_y2;
UDR=mag_y3;
UDR=mag_y4;

da gehen doch in wirklichkeit nur 2 bytes hintereinander in die transmit buffer? Hier gehen 4 bytes hintereineinder herein, so schnell kan die usart die doch nicht versenden?

mann sollte sich UDRE (Usart Data Register Empty) bit abfragen und wenn '1' dann die nachte byte in UDR schicken

gruss

Henk

katiiiiii
11.04.2005, 19:41
hi!
also, i muss halt drei frequenzen, die einen wert von ca. 150khz haben und eine temperatur auf einmal versenden. deswegen hab i ja drei bzw. vier unterprogramme gemacht. jede sekunde soll mein wert aktualisiert werden.
so hab i einfach mal ausprobiert, ob mein partner, der in java ein programm fürs einlesen programiert hat, das programm richtig gemacht hat. es is so ohne probleme gegangen, aber mit dem aufteilen klappts halt net. weil mein partner setzt auf jeden fall, alle vier werte wieder zusammen. des mit den UDRE is bei mir schon immer irgendwie ein problem gewesen, weil das Codebeispiel vom datenblatt bei mir einfach nicht funktioniert hat. i glaub das war irgendwie so:
while ( !( UCSRA & (1<<UDRE)) )

des is schon einige zeit her, wo i da so herumgespielt hab,aber i glaub er hat des mitn UDRE net so ganz kapiert, weil i des so net ansprechen hab können. i hab des dann mit meine lehrer so umgeschrieben, dass i einfach aus der langen while schleife so a kurze gemacht hab. i hab sogar die werte mit den oszi ausgemessen und des dürft hinkommen. fast genau eine sekunde braucht er um einen wert zu senden.

jetzt muss i halt nur mehr drei bzw. vier mal einen großen wert, der halt sehr groß ist, in 4 Bytes aufteilen oder?
i hoff, des geht dann so oder muss i noch was berücksichtigen?

danke für eure hilfe!

Mfg Kati