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

Dzielenie liczb na uC 8051 w ASM - zaokrąglanie i wyświetlanie wyniku

gallus [pl] 05 Mar 2007 16:52 1335 3
REKLAMA
  • #1 3646062
    gallus [pl]
    Poziom 31  
    Posty: 1197
    Pomógł: 185
    Ocena: 77
    Witam

    Jako, że mam do napisania program w ASM dla µC 8051 pobierający dwie liczby dwucyfrowe z klawiatury i dzielący je przez siebie oraz wyświetlający wynik zaokrąglony do dwóch liczb po przecinku na terminalu, napotkałem drobny problem z którym nie mogę dać sobie rady, a dokładniej:
    jeżeli np. µC będzie miał podzielić 99/98=1,0102 to w A zostanie zapisane 1 a w rejestrze pomocniczym B 102, no o teraz pojawia się problem w jaki sposób mam sprawdzić czy reszta z dzielenia nie ma na początku 0, tak jak jest to w przypadku w/w liczb.

    No i kolejny problem jeżeli np. wprowadzone zostaną liczby 20/01=20 to w jaki sposób mogę sprawdzić czy część całkowita wyniku jest dwucyfrowa i jeżeli tak, to µC ma rozbić ją na dziesiątki i jedności a następnie zakodować w ASCII i wysłać na terminal?

    Z góry dzięki za odpowiedzi :)µ
  • REKLAMA
  • Pomocny post
    #2 3647131
    starob
    Poziom 29  
    Posty: 1088
    Pomógł: 128
    Ocena: 137
    Z treści wynika, że chcesz to opędzić DIV AB
    to 99/98 daje wynik A=1 B=1 a nie B=102 (reszta ale nie podzielona przez 98
    Zakładamy,że liczby nie przekraczają 99
    to metoda DIV daje w A prawidłową część całkowitą
    Teraz reszta
    - pomnóż reszta*2 L=reszta*2
    -podziel mianownik /50 M=M/50
    ..dlaczego:?::D
    A=L
    B=M
    DIV AB
    wynik w A setne części
    nie wiem czy będzie wystarczająca dokładność (marnie to widze)?
    dokładnie to by trzeba
    L=reszta*100
    setne=L/M
    wtedy nie można przez DIV

    .."czy część całkowita wyniku jest dwucyfrowa"..
    a jaka ma być, po co to sprawdzać
    .."następnie zakodować w ASCII"..
    znajdź konwersję bin>>BCD
    (całkowita>>BCD)+','+(setne>>BCD)
    pozostanie oczywiście zamiana BCD na napis,
    ale to zadanie dla ciebie:D kombinuj
  • REKLAMA
  • #3 3650025
    gallus [pl]
    Poziom 31  
    Posty: 1197
    Pomógł: 185
    Ocena: 77
    Z zamianą na napis nie mam problemu, problemem jest ta reszta ;|

    np. 99/98=1,01 a w uC A=1, B=1 i teraz wg. Twojej podpowiedzi 1*100=100/98= A=1, B=2, ale ciągle nie wiem jak to zrobić, żeby uC sprawdził czy po przecinku jest 01, a nie 1

    no i jeżeli z klawiatury zostaną wpisane inne dane np. 55/44= 1,25 A=1, B=25 teraz uC pomnoży to 25*100=2500 (nie mieści się na 8bitach) i podzieli 2500/44 to A=56 co nie jest poprawną resztą zaokrągloną do dwóch miejsc po przecinku.

    Ale i tak dzięki za pomoc ;)
  • #4 3650722
    starob
    Poziom 29  
    Posty: 1088
    Pomógł: 128
    Ocena: 137
    55/44 A=1 B=11 ,a nie B=25

    11*100/44=25
    zastosuj dzielenie 16bit/8bit ponieważ reszta*100 to max 11bitów
    DIV-em nie da się dokładnie
    jak jest 01 jako 0,01 to wynik jest 1
    jak jest 1 jako 0,1 to wynik jest 10
    co tu sprawdzać ?
REKLAMA