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

[Atmega8][C] Liczby binarne na dziesiętny +wartosci pozycyjn

DrV 04 Maj 2009 21:50 3569 5
REKLAMA
  • #1 6490156
    DrV
    Poziom 10  
    Witam,


    buduje sobie spokojnie na zaliczenie termometr oparty o atmege i ds1820
    wiem że są gotowe rozwiązania na forum ale ja chce zrobić to sam, w pełni to rozumiejąc i umiejąc się z tego wytłumaczyć czemu kod wygląda tak a nie inaczej

    ogólnie jedna rzecz mnie męczy - mianowicie wymyśliłem sobie że na mój wyświetlacz puszcze cyfry przez 7448(wchodzi bcd wychodzi 7 segment)
    ale jest jeden mały problem gdyż jak wiadomo ds1820 przez 1-wire™ da mi ciąg binarny z temperaturą i trzeba go obrobić.

    Głównie mi chodzi o to że na liczbach w systemie dziesiętnym mi będzie wygodnie operować a konkretnie potrzebuje 2 rzeczy:

    przejść z binarki na dziesiętny - jako ze mikrokontroler ma coś takiego jak przesunięcia, dodawanie odejmowanie a mnożenie to już jest problem(napisze kod do mnożenia ale co to mi da jak w pewnym momencie mi pamięci braknie).

    Głownie na 10-tce sobie wydzielić z liczby część dziesiatek, i jedności ale problem w tym że dzielenie przez 10 odpada(pamięć) poszukuje jakiegoś sprytnego sposobu, chyba że jest opcja na binarnym dowiedzieć się o tym, ale ja niestety jakoś nie potrafie nic sensownego wymyśleć, więc jakby ktoś mi pokazał/powiedział sposób na binarnym operować byłbym baardzo ucieszony.
    Głównie to mnie ogranicza CodeVision AVR który w wersji darmowej ma ograniczenie do wielkości kodu jak i ten 1kb w mikrokontrolerze.

    W skrócie: potrzebuje z liczby binarnej w sposób najkrótszy wydzielić cyfrę jedności, cyfrę dziesiątek i wysłać najlepiej przez jeden port.

    Pozdrawiam.
  • REKLAMA
  • #2 6490698
    Dr.Vee
    VIP Zasłużony dla elektroda
    W atmega8 nie zmieści Ci się dzielenie? Wolne żarty. Przecież funkcja dzielenia 8bit/8bit to kilkanaście instrukcji... 16bit/16bit to ciut ponad 20 instrukcji.

    Oczywiście istnieje algorytm bin->bcd bez użycia dzielenia, nazywa się "shift-and-add" i jest opisany np. tutaj.

    Pozdrawiam,
    Dr.Vee
  • REKLAMA
  • #3 6491539
    kedzi1
    Poziom 18  
    Taki termometr można zrobić na ATTINY2323 :)

    A jeżeli chcesz zrobić konwersją prosto i łatwo do wytłumaczenia to robisz tak:

    Odejmujesz setki, dodając jednocześnie po jeden do innej zmiennej do czasu aż liczba będzie mniejsza niż 100 i otrzymujemy ilość setek. Tak samo liczymy diesiątki i zostaje nam liczba mniejsza niż 10, czyli liczba jedności. Koniec :).

    Pewnie użyłeś liczb zmiennoprzecinkowych, dlatego taki duży kod. Jeżeli wyświetlasz to tylko, to nie potrzebne są przecinki. Dokładność jednej dziesiątej uzyskasz, traktując liczby jako 10 razy większe, czyli 36,6 stopnia będzie reprezentowała liczba 336. A na wyświetlaczu przecinek mażesz mieć na stałe.
  • REKLAMA
  • #4 6492578
    DrV
    Poziom 10  
    Hmm, twój pomysł z odejmowaniem mi się podoba. Ale ogólnie chyba z tym mnożeniem i dzieleniem wyrobie się z miejscem w mikro kontrolerze, w sumie dziś wpadłem na parę dobrych pomysłów i reszta kodu się znacząco skróciła.

    Dzięki za pomysły,jakby coś jeszcze się odezwę.

    Pozdro
  • REKLAMA
  • #5 6493719
    Pittt
    Poziom 32  
    Prościej: podziel liczbę przez 100. Całości jakie ci wyjdą pomnóż prze 100. To odejmij od badanej liczby. Zostaną dziesiątki i jedności. To samo z dziesiątkami
  • #6 6494528
    kedzi1
    Poziom 18  
    Oczywiście tak prościej jest z kodem w C, ale jezeli mikrokontroler nie ma dzielenia w liście rozkazów to na jedno wyjdzie, a kod wynikowy będzie bardziej skomplikowany.
REKLAMA