logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak połączyć 2 bajty LSB i 2 bajty MSB w Bascom AVR?

adamski01 14 Lis 2004 07:46 3364 5
REKLAMA
  • #1 983970
    adamski01
    Poziom 11  
    Posty: 14
    Proszę o pomoc w rozwiązaniu problemu z połączeniem młodszych bajtów ze starszymi w bascomie. Mam napisaną procedure zapisu do eeproma liczby long wszystko ok lecz z odczytem jest gorzej:
    Dim Dana As Long
    Dim Dana1 As Long
    Dim Slowo_high As Word
    Dim Slowo_low As Word
    Dim Bajt1_high As Byte
    Dim Bajt2_low As Byte
    Dim Bajt3_high As Byte
    Dim Bajt4_low As Byte
    Dim 2bajty_starsze As Word
    Dim 2bajty_mlodsze As Word

    Input Dana (naprzykład: 89431)
    Slowo_high = Highw(dana)
    Slowo_low = Loww(dana)
    Bajt1_high = High(slowo_high)
    Bajt2_low = Low(slowo_high)
    Bajt3_high = High(slowo_low)
    Bajt4_low = Low(slowo_low)

    nastepnie bajty od 1 do 4 zapisuje w eepromie 24c04
    po odczycie z eeproma loncze je po dwa bajty starsze i dwa mlodsze

    2bajty_mlodsze = Makeint(bajt4_low , Bajt3_high)
    2bajty_starsze = Makeint(bajt2_low , Bajt1_high)

    i w tym miejscu stoje. JAK POŁĄCZYĆ TE BAJTY ZA SOBĄ?
    Próbowałem przez HIGH(2bajty_mlodsze)=2bajty_starsze lecz to funkcja
    odnosi się do zmiennych dwu bajtowych a nie cztero.
  • REKLAMA
  • #2 984049
    yarpen2
    Poziom 22  
    Posty: 549
    Pomógł: 39
    Ocena: 39
    nie mam teraz bascoma ale spróbuję coś poradzić tylko musisz zobaczyć jak w bascomie zapisywana jest zmienna typu long, bo może sie okazac że moja rada będzie do bani...

    > deklarujesz zmienną long to jest (chyba 4 bajty):
    xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
    > zapisujesz w niej dwa starsze bajty:
    xxxxxxxx xxxxxxxx SSSSSSSS SSSSSSSS
    > teraz trzeba by to przesunąć w lewo:
    SSSSSSSS SSSSSSSS xxxxxxxx xxxxxxxx
    >i dodać młodszy bajt
    SSSSSSSS SSSSSSSS MMMMMMMM MMMMMMMM
  • REKLAMA
  • #3 984140
    Wilku
    Poziom 17  
    Posty: 330
    Pomógł: 5
    Ja do zapisu i odczytu tego typu zmiennych używałem poleceń Poke i Peek. Operuje się tu na adresach w pamięci RAM. Trzeba tylko uważać gdzie deklarujesz zmienne na których będziesz operował. Najlepiej zrobic to w pierwszej kolejności, przed innymi zmiennymi w używanymi w programie. Zajrzyj do helpa Bascoma i zapoznaj się bliżej z tymi poleceniami, może to załatwi sprawę najszybciej.
  • REKLAMA
  • #4 985242
    elektro255
    Poziom 15  
    Posty: 178
    Pomógł: 4
    Ocena: 1
    żeby połączyć te zmienne ze sobą musisz zrobić:
    zmienna=2bajty_mlodsze+2bajty_starsze*65535
  • REKLAMA
  • #5 985485
    adamski01
    Poziom 11  
    Posty: 14
    Niestety zapis:
    zmienna=2bajty_mlodsze+2bajty_starsze*65535
    przy kompilacji wywietla error 177 : Illegal operation
    a jak zapisze to w taki sposób:
    zmienna=2bajty_starsze * 65535
    zmienna=zmienna+2bajty_młodsze to gubi jeden bajt i tak zamiast podać liczbe 89431 która była zapiasna wcześniej do eeproma to podaje 89430.
    Można by za każdym razem dodawać 1 ale mie wiem czy przy wiekszej liczbie dalej bedzie mniejsza o jeden gorzej jak się to zmieni.
    Czyżby faktycznie w bascomie było tak ciężko...
  • #6 985566
    shg
    Poziom 35  
    Posty: 2289
    Pomógł: 339
    Ocena: 135
    zmienna = 2bajty_starsze
    SHIFT(zmienna, 16, LEFT)
    zmienna = zmienna OR 2bajty_młodsze

    Wszystko to pod warunkiem, że operujemy na formacie big-endian, a BASCOM z tego, co pamiętam używa formatu little-endian. Wobec tego takie coś można zrobić tylko na zmiennej, jeżeli trzeba zapisywać do pamięci (za pomocą poke), to kolejność bajtów trzeba odwrócić.
    ---------
    a jak by co, to to mnożenie miało być przez 65536 (2^16), a nie 65535
REKLAMA