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 wprowadzać liczby z dokładnością do 0.1 na DSM 8051?

Guliwer_ 29 Gru 2006 21:16 4010 26
REKLAMA
  • #1 3384499
    Guliwer_
    Poziom 11  
    Posty: 17
    Witam, mam do wykonania nastepujacy projekt:
    Opracować program, którego zadaniem będzie obliczenie prędkości kul przed lub po zderzeniu spręzystym. Korzystając z zasady zachowania pędu. Wartości liczbowe podajemy z klawiatury numerycznej z dokładnością 1 miejsca po przecinku, wynik wyświetlać na wyświetlaczu LCD.

    Pracujemy na zajeciach na DSM 8051 jak juz wyzej wspominalem w temacie. W zadaniu mam rozpatrzyc 4 warianty, ktore beda roznily sie iloscia zmiennych jakie znam. W kazdym przypadku beda znane masy, ale w 1. musze obliczyc predkosci koncowe v1' i v2', w 2. predkosc poczatkowa v1' i koncowa v2, w 3. obliczyc v2' , w 4. obliczyc v2.
    Na tyle ile starczylo mi wiedzy i umiejetnosci napisalem ten program ale nie potrafie, a wlasciwie nie rozumiem jak mam wprowadzac liczby z dokladnoscia do jednego miejsca po przecinku, no i jak uwzglednic znak przy obliczeniach jezeli na ktoryms z etapow uzyskam liczbe ujemna. W sumie to tych pytan i problemow mam sporo no ale nie chce rzucac grochem o sciane. Wiec jezeli byl by ktos kto moze mi pomoc to prosze o kontakt. Podesle moj kod do wgladu no i jakiejs weryfikacji.
    Pozdrawiam
  • REKLAMA
  • #2 3385020
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    A w jakim języku to piszesz ?
  • #3 3385276
    Guliwer_
    Poziom 11  
    Posty: 17
    Posluguje sie komendami jakie nam wpojono na zajeciach, rozumiem ze to jest assembler. No ale odmiany assemblera tez sa chyba rozne. Zreszta moze ponizej jakis przykladowy programik aby pokazac co jest co:

    ;DZIELENIE DWOCH LICZB

    LJMP START
    ORG 100H
    START:
    LCALL WAIT_KEY
    MOV R2,A
    LCALL WAIT_KEY
    MOV B,A
    MOV A,R2
    CLR C
    DIV AB
    LCALL WRITE_HEX
    MOV A,B
    LCALL WRITE_HEX
    SJMP $

    Na zajeciach mamy caly osprzet do teg oczyli mikrosterownik i oprogramowanie. Na zwyklym PC domowym kompilowac takie programy mozna w programie Jagoda, a pisac zarowno w notatniku zapisujac z rozszerzeniem .asm jak i w tej Jagodzie.
  • #4 3385296
    Konto nie istnieje
    Konto nie istnieje  
  • #5 3385317
    Guliwer_
    Poziom 11  
    Posty: 17
    Tak , jest dokladnie tak jak mowisz. Mam generalnie napisany caly program przez siebie ale ma mase bledow bo zle porobione sa dzialania , ze wzgledu na to ze nie wiem jak te liczby zapisywac.
  • #6 3385330
    Konto nie istnieje
    Konto nie istnieje  
  • #7 3387099
    Guliwer_
    Poziom 11  
    Posty: 17
    W zalaczniku plik z programem, a wlasciwie z prowizoryczna postacia do jakiej ma byc zblizony, tam jest masa do poprawki. Tu uzywam komend epromu takich jak WRITE_HEX czy WAIT_KEY jednak w projekcie nie moge sie nimi poslugiwac tylko mam napisac obsluge tych polecen. To jednak moze sobie zalatwie gdyz kazdy z nas ma jakis projekt i kazdy musi napisac ta obsluge wiec moge to "pozyczyc" sobie od kogos. Tak wiec zalezy mi najbardziej na tym zeby ten program w ogole ruszyl nawet z tymi komendami.
    Pozdrawiam
    Załączniki:
    • PROJEKT3.rar (1.44 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #8 3394512
    Guliwer_
    Poziom 11  
    Posty: 17
    Hmmm widze, ze raczej nikt mi za wiele nie pomoze. No szkoda bo liczylem na to. Nie wiem czy z braku motywacji czy jak? W kazdym razie kwestie finansowa tez mogl bym rozwazyc o ile rzeczywiscie bedzie tego warte ;)
  • #9 3401487
    Guliwer_
    Poziom 11  
    Posty: 17
    a czy chociaz ktos mogl by mi pomoc z tym jak zrobic dodawanie, odejmowanie, mnozenie, dzielenie wielobitowe? Dokladnie chodzi mi o to ze na trzech bajtach zapisuje:
    |tysiace setki| |dziesiatki jednosci|, |1 lub 2 miejsca po przecinku|
  • REKLAMA
  • #10 3402450
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    W załączniku masz moją bibliotekę dla mnożenia, dzielenia i konwersja BCD na BIN i na odwrót.
    Załączniki:
    • Bibl.zip (2.22 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #11 3413441
    Guliwer_
    Poziom 11  
    Posty: 17
    Dzieki , widze ze operujesz tu na czterech bajtach ale nie uwzglednia to przecinka, a mnozenie z przecinkiem , jak i dzielenie z przecinkiem jest znacznie trudniejsze i nadal mam z tym problem. Co zrobic i jak to zrobic?
  • #12 3413581
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    Wydaje mi się że wszystkie obliczenia można sprowadzić do liczb całkowitych a potem tylko odpowiednio ustawić przecinek.
  • #13 3413647
    markosik20
    Poziom 33  
    Posty: 2261
    Pomógł: 208
    Ocena: 147
    Liczba zmiennoprzecinkowa dla uP to min. cztery bajty. Poczytaj o liczbach typu "float" wg. standardu IEEE 754 jak są przedstawiane.
    http://en.wikipedia.org/wiki/Floating_point

    Co do działań na tych liczbach to przyznam się szczerze, że nie wiem co tam asembler na nich wyrabia (pisze wszystko w C). Spróbuje napisać prosta funkcję i podglądnąć co tam kompilator wymyślił.

    Najprosciej jednak będzie zrobić jak wspomniał kolega GienekS, robić działania matematyczne na liczbach całkowitych a później uwzględniać miejsce przecinka.
  • #14 3414054
    Guliwer_
    Poziom 11  
    Posty: 17
    No ale jak moge podzielic liczby z przecinkiem przez siebie , traktujac je jak by nie bylo przecinka, czyli o wiele wieksze, to sie sprowadza do wlasciwej interpretacji dzielenia pisemnego w slupkach ktorego szczerze juz nie pamietam :(
  • #15 3414108
    markosik20
    Poziom 33  
    Posty: 2261
    Pomógł: 208
    Ocena: 147
    Nic tam nie musisz dzielić w słupkach.
    Pomyśl, bo jest to proste do zrobienia :)
    Musisz sobie ustalić ile chcesz pozycji po przecinku i trzymać sie sztywno tej wartości.
  • #16 3416456
    Guliwer_
    Poziom 11  
    Posty: 17
    Mam miec minimum 1 miejsce po przecinku. Wiec z racji tego ze chce to zrobic jak najprosciej to nie musi byc ich wiecej. No to w takim razie jak to zrobic. Moze mi powiesz. Gdybym wedzial to przeciez bym o to nie pytal od kilku dni. Moze jakis przyklad?
  • #17 3416519
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    To jeszcze określ się ile ta Twoja liczba ma mieć cyfr przed przecinkiem i to już będziemy wiedzieli wszystko t.z. ilu cyfrowa będzie to musiała być arytmetyka.
  • REKLAMA
  • #18 3416554
    Guliwer_
    Poziom 11  
    Posty: 17
    wyzej podalem w jednym z moich postow

    |tysiace setki| |dziesiatki jednosci|, |1 lub 2 miejsca po przecinku|

    Czyli dzielac to na bajty mamy 3 bajty z czego 2 na calosci i 1 na miejsce po przecinku
  • #19 3416643
    markosik20
    Poziom 33  
    Posty: 2261
    Pomógł: 208
    Ocena: 147
    np:

    234,7=2347*10do-1;
    765,1=7651*10do-1;


    234,7+765,1=10do-1*(2347+7651);
    podobnie odejmowanie;
    234,7*765,1=10do-2*(2347*7651);

    dzielenie podobne tylko trzeba jeszcze resztę zamienić na postać dziesiętną np:
    liczba całkowita z dzielenia 2347/7651=0;
    "miejsca po przecinku" 10do-1/10do-1=10do-2;
    reszta z dzielenia 2347/7651=5304;
    licznik to 5304 mianownik to 7651, należy sprowadzić ten ułamek do postaci dziesiętnej (szkoła podstawowa) :)
  • REKLAMA
  • #20 3416768
    Guliwer_
    Poziom 11  
    Posty: 17
    No dobra, dzieki ale jak ja operujac na 0 i 1 podniose cos do potegi -1 ?? To nie C++ i inne tego typu jezyki
  • #21 3416826
    markosik20
    Poziom 33  
    Posty: 2261
    Pomógł: 208
    Ocena: 147
    Chciałem Ci tylko zobrazować jak to zrobic. Nie musisz dzielić a ni mnożyć tych "10do-1". Te 10do-1 to info dla ciebie ile liczba ma miejsc po przecinku. To jest wszystko prosta matematyka, gdzie pewnych rzeczy sie poprostu nie liczy tylko wpisuję jako stałe. Jak chcesz robić wszystkie działania matematyczne na uP to niestety pozostaje tylko C. Funkcja dzieląca liczbę zmiennoprzecinkową przez ten sam rodzaj liczby zajmuje jakieś kilkadziesiąt komend ASM które pracują w pętli. Jeżeli to chcesz to Ci podeśle ale nie wytłumaczę działania dlatego, że to "stworzył" kompilator. Jak już wcześniej wspomniałem liczba zmiennoprzecinkowa zajmuje w uP min. 4bajty i jest zapisana wg. pewnych standardów (link wyżej). Żeby wykonywać działania matematyczne trzeba bardzo dobrze wiedzieć na czym zapis liczby polega.
  • #22 3416907
    Guliwer_
    Poziom 11  
    Posty: 17
    Musze wszystko napisac w assemblerze pod ten mikorkontroler wiec zapis w innych jezykach nic mi nie da zapewne, jezeli cos masz co moze mi pomoc no to oczywiscie podeslij
  • #23 3417135
    markosik20
    Poziom 33  
    Posty: 2261
    Pomógł: 208
    Ocena: 147
    Podsyłam Ci to co mi kompilator zrobił z dzielenia dwóch liczb zmiennoprzecinkowych. Mozesz sobie to jakimś symulatorem przeanalizować.
    Załączniki:
    • PRÓBNY.rar (2.15 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #24 3417213
    Guliwer_
    Poziom 11  
    Posty: 17
    Dzieki, ale niestety na nic mi sie to nie przyda :(
  • #25 3417233
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    Guliwer_ napisał:
    wyzej podalem w jednym z moich postow

    |tysiace setki| |dziesiatki jednosci|, |1 lub 2 miejsca po przecinku|

    Czyli dzielac to na bajty mamy 3 bajty z czego 2 na calosci i 1 na miejsce po przecinku
    Czyli maksymalna liczba w zapisie dziesiętnym to:9999,9 a w zapisie liczb całkowitych to 99999 czyli w zapisie binarnym zmieści się na w 3 bajtach.
    Co do podnoszenia do kwadratu to nic prostrzego jak mnożenie X*X
  • #26 3417244
    Guliwer_
    Poziom 11  
    Posty: 17
    chociaz nie, sorki, patrzylem nie na ten plik, a co to masz za kompilator ze wlasnie tworzy 3 takie pliki i w tym jednym jest ten kod assemblerowy? Moze dalo by sie w C lub C++ napisac taki program i ten kod wynikowy z tego pliku odczytac i uruchomic pod tym mikrokontrolerem?

    Dodano po 1 [minuty]:

    GienekS napisał:

    Co do podnoszenia do kwadratu to nic prostrzego jak mnożenie X*X

    Pisalem o podnoszeniu do -1 a nie do 1 czy 2, tyle to ja tez wiem ;)
  • #27 3437773
    Guliwer_
    Poziom 11  
    Posty: 17
    a czy w takiej kwestii mogl by mi ktos pomoc z nastepujacym problemem zwiazanym takze z projektem:
    Jak wyzej pisalem mam 4 warianty obliczen i mam do nich na poczatek przed wyborem wariantu wypisac na LCD takie cos:

    1. D: M1 M2 V1 V1
    SZ: V1' V2'

    2. D: M1 M2 V1 V2'
    SZ: V2 V1'

    3. D: M1 M2 V1 V2 V1'
    SZ: V2'

    4. D: M1 M2 V1 V1' V2'
    SZ: V2


    D - oznacza dane , a SZ - szukane, poniewaz LCD daje mozliwosc wypisania dwoch linii po 16 znakow to chcial bym zrobic to tak, ze po uruchomieniu programu wypisze dane i szukane dla 1, jak nacisne strzalke w dol to skasuje to i wypisze 2, potem znow strzalka i wypisanie 3, to samo z 4. Potem beda wykonywac sie obliczenia dla danego warunku i musial bym wypisac wartosci obliczone dla szukanych. Czy ktos mogl by mi w tym pomoc albo podsunac jakis zalazek programu?

Podsumowanie tematu

✨ Dyskusja dotyczy realizacji projektu na mikrokontrolerze DSM 8051, polegającego na obliczaniu prędkości kul przed i po zderzeniu sprężystym z wykorzystaniem zasady zachowania pędu. Kluczowym problemem jest wprowadzanie i obsługa liczb z dokładnością do jednego miejsca po przecinku (0,1) w asemblerze dla DSM 8051, w tym prawidłowe uwzględnienie znaków ujemnych podczas obliczeń. Użytkownik posługuje się asemblerem specyficznym dla DSM 8051, korzystając z własnych komend do obsługi klawiatury i wyświetlacza LCD, które musi samodzielnie zaimplementować. W dyskusji poruszono kwestie reprezentacji liczb zmiennoprzecinkowych na mikrokontrolerze, wskazując na trudności z ich implementacją w asemblerze oraz sugerując operacje na liczbach całkowitych z przesunięciem przecinka jako prostsze rozwiązanie. Przedstawiono przykłady konwersji liczb dziesiętnych z przecinkiem na liczby całkowite (np. 234,7 jako 2347 * 10^-1) oraz zasady wykonywania działań arytmetycznych (dodawanie, odejmowanie, mnożenie, dzielenie) z uwzględnieniem przesunięcia przecinka. Poruszono także temat wielobajtowej arytmetyki i konieczności ustalenia liczby cyfr przed przecinkiem. Wskazano, że liczby zmiennoprzecinkowe w standardzie IEEE 754 zajmują minimum 4 bajty, co jest trudne do implementacji w asemblerze DSM 8051. Zaproponowano wyświetlanie na LCD danych i wyników dla czterech wariantów obliczeń, z możliwością przełączania widoku za pomocą klawiszy. Użytkownik otrzymał fragmenty kodu i biblioteki do mnożenia, dzielenia oraz konwersji BCD-BIN, jednak nadal poszukuje prostych przykładów i wskazówek dotyczących obsługi liczb z przecinkiem i wielobajtowej arytmetyki w asemblerze pod DSM 8051.
Wygenerowane przez model językowy.
REKLAMA