PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 2 Bytes zu word zusammenfassen ?



dl1akp
04.03.2008, 08:27
Hallo,

ich habe den 10bit Wert des ADC in eine word-Variable geschrieben und mit HIGH und LOW in die beiden Bytes geteilt. dann das ganze in EEPROM zwischen gespeichert.

Nun lese ich die beiden Bytes wieder aus.
Aber wie kann ich daraus wieder ein Word machen??

Kann mir da mal jemand einen Tip geben?

Vielen Dank im Voraus
dl1akp

Rofo88
04.03.2008, 08:57
Dim A As Byte , B As Byte
Dim X As Word



X = A * 256
X = X + B

python_rocks
04.03.2008, 09:01
Nun lese ich die beiden Bytes wieder aus.
Aber wie kann ich daraus wieder ein Word machen??
Hallo dl1akp!


Dim my_word as Word at $60
Dim b1 as Byte at $60 OVERLAY
Dim b2 as Byte at $61 OVERLAY

B1 = 255
B2 = 255

Print My_word '65535

mfg
Gerold
:-)

Rofo88
04.03.2008, 09:07
und so gehts nach python_rocks-Methode aber ohne direkte Adressierung


Dim My_word As Word
Dim B1 As Byte At My_word Overlay
Dim B2 As Byte At My_word + 1 Overlay

python_rocks
04.03.2008, 10:01
At My_word + 1 Overlay
Hallo Rofo88!

So etwas habe ich immer schon gesucht. Danke! :-)

mfg
Gerold
:-)

MeckPommER
04.03.2008, 11:19
Das geht? Cool !! THX!!!

Muss ich mir merken, erleichtert einem doch einiges beim Zahlenschubsen.

Gruß MeckPommER

DerMaddin
04.03.2008, 11:25
Hi Jungs,

noch besser ist es, Bitoperationen zu benutzen. Die gehen sogar noch schneller als Addition und natürlich viel schneller als Multiplikation :-D

Result = (Highbyte << 8) | LowByte;

Mfg, der Maddin

DerMaddin
04.03.2008, 11:27
oohh.... kann man sich vor Smilies schützen?
Hier nochmal ohne Smilie:

Result = ( Highbyte << 8 ) | LowByte;

Rofo88
04.03.2008, 11:31
Ob das Bascom so mitmacht...und mit Overlay gehts ganz ohne Rechnen und Schieben

DerMaddin
04.03.2008, 12:11
Das geht in Bascom nicht? Ja, ich bin C Progger. Aber ... wenn Bascom DAS nicht kann..... böööh.... dann nehmts nich ;)
Dann natürlich sry für den Spam

MeckPommER
04.03.2008, 12:24
Andersrum, DerMaddin ...

Geht das mit dem Overlaydimensionieren nicht in C? Das geht nämlich noch schneller als das Shiften :)

Meine Meinung: Bascom ist DAS BESTE (wenn man zu gegebener Zeit hier und da ein wenig Assembler einstreut, man wie ich C-Legastheniker ist und Basic schon mit der Muttermilch kurz nach Mitte des letzten Jahrhunderts eingesogen hat *g*)

Das mit Overlay nutze ich häufig und spart einem einiges an Arbeit. Das es aber auch mit AT [Variablenname] geht, das war mir neu. Dieses Forum ist wirklich unbezahlbar.

dl1akp
04.03.2008, 13:44
Hallo Leute,

danke für die schnelle Hilfe! SUPER!!
Habe die Methode nach phyton_rocks und rofo88 probiert.

Mfg. dl1akp

python_rocks
04.03.2008, 14:04
Das geht in Bascom nicht? Ja, ich bin C Progger.
Hallo Der Maddin!

Falls es dich interessiert. In Bascom nimmt man dafür den Befehl SHIFT. Aber das direkte Schreiben in den Speicher mit OVERLAY ist schneller, da nichts verschoben oder berechnet werden muss.

mfg
Gerold
:-)

mat-sche
04.03.2008, 17:39
@All,

ich nutze auch die Overlayfunktion aber nur aus "Fremndcode" und biun noch nicht so richtig durchgestiegen. Kann mir jemand mal Overlay und das AT erklären?

und zu MeckPommER: Damit hast Du wohl sehr recht: das Forum ist wirklich unbezahlbar und die Leute die einem helfen ersteinma....

MAT

Rofo88
04.03.2008, 18:13
@mat-sche

ok ich versuche es mal

Dim X as Word-> belegt im RAM 2 Byte um die Variable x da zu speichern ( 2 Byte weils ne Word-Variable ist, wenn da Long steht sinds 4 Byte und bei nem String noch mehr | die Position wo das im RAM steht ist nicht definiert und wird vom Compiler festgelegt)

Dim X as Word at $60-> macht das selbe wie oben nur das der Speicherplatz im RAM festgelegt ist (fängt halt bei $60 an) und nicht mehr vom Compiler bestimmt wird

Dim y As Byte At X Overlay-> legt fest das auf dem Speicherplatz von X (2 Byte) auch noch Y liegt (1 Byte) somit ist es möglich von der Word-Variable nur ein Byte manipolieren

Also das Overlay sagt aus das der Speicherplatz mehrfach belegt ist und das at an welcher Stelle der Speicherplatz ist

mat-sche
05.03.2008, 19:13
hallo Rofo,

danke für Deine, mir verständliche, Erläuterungg :D !
Jetzt kann ich mir auch einige Sachen erklären!

MAT

sechsrad
05.03.2008, 20:48
einfach die beiden bytes in eine wordvariable(adresse vorher ausmachen) und reinpoken, fertig.

python_rocks
05.03.2008, 21:49
einfach die beiden bytes in eine wordvariable(adresse vorher ausmachen) und reinpoken, fertig.
Hallo sechsrad!

Du meinst mit VARPTR http://avrhelp.mcselec.com/index.html?varptr.htm die Adresse herausfinden und mit POKE http://avrhelp.mcselec.com/index.html?poke.htm zuerst die herausgefundene Adresse und dann die "Adresse + 1" beschreiben?

Ich kenne mich noch nicht so gut mit Bascom aus. Aber in der Hilfe zu POKE steht nur etwas von den Registern 0-31.

Aber ich werde es dann noch ausprobieren. Man will ja lernen.

mfg
Gerold
:-)

python_rocks
05.03.2008, 21:59
Aber ich werde es dann noch ausprobieren.
Hallo!

Ich bekomme beim Kompilieren dieses Beispiels

$regfile = "M8def.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 10
$framesize = 40
$baud = 9600

Dim Wordvar As Word
Dim Address As Word


Wordvar = 200
Print "Old Wordvar:" ; Wordvar

Address = Varptr(wordvar)
Print "Address:" ; Address

Poke Address , 255
Poke Address + 1 , 255

Print "New Wordvar:" ; Wordvar


End
den Fehler
"Error : 200 Line: 24 .DEF not found [R98 [adddr]] , in File..."

Wenn ich die POKE-Zeilen auskommentiere, dann bekomme ich als Ausgabe des laufenden Programms das hier:

Old Wordvar:200
Address:96
New Wordvar:200
mfg
Gerold
:-)

sechsrad
08.03.2008, 09:58
poke haut glaube ich nicht so hin !

mach das am besten so :

Dim b1 as Byte at $60 OVERLAY
Dim b2 as Byte at $61 OVERLAY

b1=1
b2=2

lo und hi-byte dort reinpacken.

MeckPommER
08.03.2008, 10:09
Mit "peek" und "poke" kann man nur die Register 0-31 lesen und schreiben. Wenn man im SRAM etwas lesen und schreiben will, dann muss man dafür "inp" und "out" benutzen.

python_rocks
08.03.2008, 12:52
Mit "peek" und "poke" kann man nur die Register 0-31 lesen und schreiben. Wenn man im SRAM etwas lesen und schreiben will, dann muss man dafür "inp" und "out" benutzen.
Hallo MeckPommER!

Ja, damit funktioniert's. :-)


$regfile = "M8def.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 10
$framesize = 40
$baud = 9600

Dim Wordvar As Word
Dim Address As Word


Wordvar = 200
Print "Old Wordvar:" ; Wordvar

Address = Varptr(wordvar)
Print "Address:" ; Address

Out Address , 255
Address = Address + 1
Out Address , 255

Print "New Wordvar:" ; Wordvar


End
Ergebnis:

Old Wordvar:200
Address:96
New Wordvar:65535
mfg
Gerold
:-)