-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: word nach byte umwandeln

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    19.02.2007
    Beiträge
    210

    word nach byte umwandeln

    Anzeige

    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
    STK200 dongel an Lpt via HC244 auf tiny26 ISP und bascom 1.11.84
    sowie STK500

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    28.10.2004
    Ort
    Baoding
    Alter
    37
    Beiträge
    687
    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

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    19.02.2007
    Beiträge
    210
    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
    STK200 dongel an Lpt via HC244 auf tiny26 ISP und bascom 1.11.84
    sowie STK500

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    28.10.2004
    Ort
    Baoding
    Alter
    37
    Beiträge
    687
    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)

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    19.02.2007
    Beiträge
    210
    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

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.11.2006
    Ort
    olargues
    Beiträge
    776
    kannst es ja mal so versuchen:

    Code:
    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.

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    01.04.2006
    Beiträge
    6
    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

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.11.2006
    Ort
    olargues
    Beiträge
    776
    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

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    01.04.2006
    Beiträge
    6
    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

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.11.2006
    Ort
    olargues
    Beiträge
    776
    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

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •