PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 4 getrennte Bytees in eine Long/Single Varible wandeln



Claus Mehrholz
13.01.2005, 14:02
Möchte gern 4 aufeinander folgende Bytes in eine Long/Single Varible Wandeln

Von einem Gerät lese ich 16 Bytes per UART
in eine Indizierte Variable in den AT Mega 8
z.B Y(i); Y(i+1); Y(i+2); ... bis Y(i+n)
und habe nun Zugriff auf jedes einzelne Byte.

Die Betriefsfrequens des angeschlossenen Gerätes
liegt beispielsweise in den vier Bytes 2-5.
Meine Idee ist nun diese Information in einer
Größeren Long/Single Variablen weiter zu verarbeiten.

Wie also bringe ich die Information
aus vier einzel Bytes z.B
&B 00000010 10111110 11100001 10000000 = &d 4606400
in eine Long/Single Variable um sie dort durch 16
zu teilen und anschl mit 10 zu multiplizieren damit
ich die augelesene Frequenz von 28.790.000 zu erhalten
und anzuzeigen.

Oder bin ich da komplett auf dem Holzweg ??

x-ryder
13.01.2005, 14:29
Dim Eins As Byte At &H60
Dim Zwei As Byte At &H61
Dim Drei As Byte At &H62
Dim Vier As Byte At &H63

Dim Erg As Long At &H60 Overlay

Eins = 255
Zwei = 1
Drei = 0
Vier = 0

Erg = Erg + 1

Do
Print Erg
Loop
End

14.01.2005, 07:01
Vielen Dank, für Deinen Tipp. Habe nun das Problemchen lösen können.
Beste Gruesse aus Bad Honnef, Claus

RCO
14.01.2005, 10:35
Habe nun das Problemchen lösen können.

Wie denn, so wie x-ryder meinte?
Könnte man nicht einfach so:

Single = byte
Single * 256
Single + byte
Single * 256
...

MFg moritz

Claus Mehrholz
17.01.2005, 09:06
...mehrfach habe ich versucht Deine Idee nachzuvollziehen... bislang ohne Erfolg, bitte sei so gut und formuliere ein bischen mehr Text.

17.01.2005, 10:47
Liegen die Informationen im übergebenen String im ASCII-Format (= Klartext) oder im Binärformat vor.
Nur mit dieser Information kann hier eine zielführende Information gegeben werden.

Viele Grüße
Josef

RCO
17.01.2005, 11:32
Sorry, ich dachte es wäre verständlicher, aber kein Problem. Also meine Idee ist, eine Single/Integer o.ä. Varialbe zu nehmen und sie jeweils mit einem Byte zu beschreiben. Als erstes nehmen ich z.B. das erse von 4 Bytes (Byte1) und schreibe es in die Single-Varaible:

Single=Byte1

Nun verschiebe ich das Byte innerhalb des Singles nach links, dafür gibt mit Sichherit auch eine andere Anweisung, ich mache es einfach rechnerisch:

Single = Single x 256

Im Single siehts dann also so aus:
[leeres Byte][leeres byte][byte 1][leeres byte]

Nun schreibe ich hinten wieder ein byte rein:

Single = Single + Byte 2

verschiebe es wieder...

Im Grunde mache ich dsa genau so wie x-ryder, nur das er den Speicher des Singles direkt anspricht.

Vielleicht geht es aber auch so:

Single.1 = Byte.1

Also bei Bytes kann man ja die einzelnen bits direkt ansprechen. Ob das auch mit Bytes geht, weiß ich nciht. Es wäre aber vermutlich zuviel Arbeit, wenn man jedes Bit einzelnd an die richtige Stelle schreiben würde.

@x-ryder:

Woher weißt du welchen Speicherplatz die Variable einnimt. Weiß man das z.B. dadurch, dass man sie als erste deklariert und Variablen einen bestimmten Speicherplatz (Adresse) haben?

MFG Moritz

PicNick
17.01.2005, 11:46
Hi, Claus !
Es geht darum, daß ein Speicherbereich von zwei Funktionen einfach verschieden gesehen wird. "REDEFINE"
Die UART Rx/Tx kennt nur Byte-Folgen
Deine Anwendung sieht da aber eine Daten-Struktur.
Dazu gibt's eben eine Speicher-Redefinition mit AT xxx OVERLAY

Konkret (Beispiel):
Daten-Struktur:
dim Header as Byte ' steht z.B. auf addr. &H0060
dim Value as single ' steht z.B. auf addr. &H0061
dim Param as integer ' steht z.B. auf addr. &H0065
dim nochwas as word ' steht z.B. auf addr. &H0067

Und jetzt die re-definition als Byte-stream
dim Message(9) as byte AT Header OVERLAY
' steht jetzt auch auf addr. &H0060 und deckt mit länge 9 genau die obige Struktur ab

Die UART liest und schreibt message(n) (n= 1-9)

Die Applikation liest & schreibt aber header, value, param, etc.


@josef da ging's um "CONVERSION", das is was anderes

logo ? mfg robert

x-ryder
17.01.2005, 13:43
hehe piknick haste meinen beitrag übersehen???

:cheesy:

Martin

PicNick
17.01.2005, 14:47
@x-ryder: nein, hab ich nicht übersehen, hast ja recht, de facto isses eh dasselbe, *knieundbodenküssenderSmiley*
nur mit der UART hast du ja normalerweise einen Counter/Zeiger auf das aktuelle Byte, da kannst du mit EINS, ZWEI,... nix rechtes anfangen, oder willst einen case Select nehmen ?
mfg robert

x-ryder
17.01.2005, 14:51
ne aber er empfängt die bytes, dann speichert er diese in eins, zwei... und dann kann er es über erg das ergebnis auslesen