Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Atmega16][ASM] Zamiana 16-bitowej liczby binarnej na liczbę dziesiętną

b1088 05 Sty 2013 21:30 3024 11
  • #1 05 Sty 2013 21:30
    b1088
    Poziom 10  

    Witam,
    mam problem z konwersją liczby zapisanej za pomocą dwóch rejestrów 8-bitowych na jedna liczbę 16-bitową. Najpierw na LCD wyświetlam zawartość pierwszego rejestru, później drugiego i otrzymuję 2 liczby 8-bitowe. Przykład: zamiast liczby 03255 (w rejstrze 1 = 03, w rejestrze 2 = FF) chciałbym odczytać na LCD liczbę 1023. Dodam, że jest to asembler.

    Poprawiłem tytuł.
    [zumek]

    0 11
  • #2 05 Sty 2013 22:14
    Rokita1993
    Poziom 19  

    Witam,
    ściągnąłem właśnie czyjąś pracę (nie wiem jaką i na ile pewnym można być tego co tam pisze). Znalazłem w niej, że rejestry R24-R31 są rejestrami na których można przeprowadzać operacje 16-bitowe.
    Także możesz to wykorzystać i przenieść zawartość pierwszego rejestru do niego, pomnożyć x 256 i do tego dodać zawartość drugiego rejestru i gotowe.
    Nie znam assemblera, więc z kodem programu nie pomogę.

    0
  • #3 05 Sty 2013 22:35
    b1088
    Poziom 10  

    chcąc pomnożyć przez 256 musiałbym użyć dwóch rejestrów, może istnieje jakiś mniej skomplikowany sposób? chodzi głównie o wyświetlenie wartości z rejestrów ADCL i ADCH przetwonikda ADC

    0
  • #4 05 Sty 2013 23:15
    zumek
    Poziom 39  

    b1088 napisał:
    ... Dodam, że jest to asembler.


    To może z TEGO coś "skleisz" :D

    0
  • #5 05 Sty 2013 23:16
    BlueDraco
    Specjalista - Mikrokontrolery

    Albo napiszesz to w C, albo musisz napisać procedurę dzielenia liczby 16-bitowej przez 10 (a właściwie przez 5, bo przez dwa dzieli się trywialnie - przez przesunięcie w prawo.

    0
  • #7 06 Sty 2013 00:01
    kamyczek
    Poziom 33  

    Zawsze zamiast dzielić można odejmować np na początek 10000 licząc ile razy to zrobisz zanim wynik będzie ujemny wtedy liczba operacji odejmowania -1 to liczba dziesiątek tysięcy. Dodajesz 10000 żeby wynik był dodatni i zaczynasz odejmować 1000 aż będzie ujemna dodajesz 1000 i odejmujesz 100 itd aż na końcu dodasz 10 a reszta będzie jednostkami . Na stronie atmela masz notę AVR204

    0
  • #8 06 Sty 2013 00:20
    BlueDraco
    Specjalista - Mikrokontrolery

    Zwykłe binarne dzielenie nierestytucyjne przy 10 bitach będzie prawdopodobnie prostsze, niż każda z tych kombinowanych metod - to w końcu tylko 8 obiegów pętli z porównaniem, przesunięciem i warunkowym odejmowaniem, tyle że te trzy operacje trzeba zrobić na 10 (czyli w praktyce 16) bitach. Gdyby toto miało przynajmniej 8-bitowe dzielenie, jak stary '51, byłoby nieco prościej.

    W C jest to 5 linii kodu. Po co to pisać w asemblerze?

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #9 06 Sty 2013 10:41
    b1088
    Poziom 10  

    Tylko właśnie zależy mi na tym, żeby to było w asemblerze:(

    0
  • #10 06 Sty 2013 20:39
    BlueDraco
    Specjalista - Mikrokontrolery

    To zacznij od napisania procedury dzielenia liczby 10-bitowej przez 10, która da Ci równocześnie iloraz i resztę.

    0
  • #11 07 Sty 2013 00:57
    b1088
    Poziom 10  

    No właśnie tutaj jest też problem, liczbę 8-bitową podziele, gorzej z 10-bitową bo trzeba działać na dwóch rejestrach. Z tym dzieleniem wzoruję się na kodzie z postu Link

    0
  • #12 09 Sty 2013 00:54
    perlon
    Poziom 19  

    Może to głupie, ale jak się na pisze to w C i skompiluje to w *.lss będzie chyba to w assemlerze do obejrzenia.

    0