PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : word nach byte umwandeln



magic33
19.02.2007, 22:16
servus

bin noch heftig am proggen
mit dem neuen bascom 1.11.8.4

bin auf ein problem gestosen

ich habe eine wordvariabel mit dem max wert 1024
ich bräuchte eine bytevariabele mit dem maxwert 255 logisch

wie kann ich das geschickt umwandeln von word nach byte
das das ergebnis in der bytevariable das equivalent der wordvariable spiegelt


danke

Rofo88
19.02.2007, 22:25
Ich gehe mal davon aus das dein max. Wert 1023 ist wegen 10Bit (0 bis 1023)

Wie währe es mit ner division durch 4??

MfG

magic33
19.02.2007, 22:30
die division durch 4 ergibt doch kommawerte und die sind doch in word
variable nicht erlaubt
wird das automatisch konvertiert

also

word=1023
tmp=word / 4

byte=low(tmp)

was hat dann byte für einen wert

der tiny26 hat kein uart ich kann mir da nix anzeigen lassen

Rofo88
19.02.2007, 22:35
Da es keine Kommawerte gibt müssen die auch nich konvertiert werden oder !?! Nachkommestellen werden einfach ignoriert.

word=1023
word=word / 4

byte=word

Mit Low brauchst Du da nichts machen da der Wert ned größer werden kann als 255.

1023 / 4 = 255 mit Byte/Word-Werten (Versuchs im Bascom-Simulator)

magic33
19.02.2007, 22:37
danke werde ich dann mal testen jedoch iust da irgendwas faul

kann sein das es da wieder mal timer probleme gibt

wenn der adc im free modus läuft und dann noch der servo befehl
läuft

der tiny26 hat damit probleme timer0=8bit

kolisson
20.02.2007, 15:16
kannst es ja mal so versuchen:



dim spannung as word

spannung = Getadc(1)
Shift spannung , Right , 2




die variable "spannung" ist zwar per definition immer noch word, der inhalt ist aber nur die höherwertigsten 8 bit des adc-wertes.

merijnwijnen
20.02.2007, 22:13
Nette loesung:
-2 dazu zahlen: P=P+2
-dann durch 4 teilen (am besten mit shift, 2 right, ghet aber auch mit integer teilung ): shift, P ,Right, 2

das zusammen ist ein integer teilung mit richtigen rundung. Normalerweise runden integer teilung und shift immer nach unten.

Gruesse,

Merijn

kolisson
20.02.2007, 22:34
hallo Merijn
was haste denn da geschrieben ?
da die lösung ja von mir stammt, würde ich gern verstehen, was du schreibst.
also mach mal den erklärbär zu deinem beitrag

gtuss

merijnwijnen
20.02.2007, 23:38
Hallo Kolisson,

nimm mal :
P=7 decimal (00000111 binair)
Shift, p, right 2 ergibt dan binair 00000001, also 1 decimal.
Normalerweise sollte es aber nach 2 gerundet werden, denn
7/4 = 1.75, nach rundung gibt dass 2

Die shift function, und auch die Integer teilung runden immer nach unten weil sie einfach die letzt bits weglassen. Das kann mann loesen indem man die halfte des Teilers (hier also 4/2=2 erst zu dem zu teilen wert zahlt:

Gleichen Vorbild:
p=7 dec (00000111 bin)
p=p+2 :ergibt 9 dec (00001001 bin)
shift, P, right, 2 ergint binair 00000010, also 2 dec.
Damit stimmt die rundung. Versuch es selber mal mit 6 dec und 5 dec, dan siehst du wie es functioniert.

Das geht auch mit integer in two's complemet notation wie Bascom sie verwendet.

Ist dies verstaendlich?
Gruesse,

Merijn

kolisson
21.02.2007, 00:06
okay ... habe ich nun verstanden.
werde ich mir auch merken .. könnte mal wichtig werden.

hier ging es ja darum, die werte von einem 10bit wandler in ein byte zu quetschen. da für die meisten anwendungen 8bit ausreichend sind, will man hier mal runter teilen. die ansätze mit adc / 4 könnten meiner meinung nach wesentlich mehr rechenzeit beanspruchen als die variante mit shift right.

hast du schonmal ausprobiert, ob bascom bei teilungen durch 2.4. oder 8 ...
also durch den befehl x / 8 automatisch den shift-befehl generiert oder ob es eine division durchführt ?

wenn es denn einen unterschied macht, was man da eingibt ... in das bascom.. sollten wir mal einen thread aufmachen... thema : schnelle divisionen mit microcontrollern.


ähnliches auch mal zu den variablentypen... hatte neulich mit jemandem gesprochen, der kategorisch die verwendung der variablen "word" ablehnte. auf nachfrage stellte sich dann heraus, dass er word mit string verwechselte.


gruss

magic33
21.02.2007, 16:04
die umwandlung verbrät mehr speicherplatz als das ganze programm mit 3 singel variablen


also ist nicht so mein ding

hab jetzt eine singel und 2 constanten

jetzt gehts so lalal