Elektroda.pl
Elektroda.pl
X
Prosz, dodaj wyj徠ek dla www.elektroda.pl do Adblock.
Dzi瘯i temu, 瞠 ogl康asz reklamy, wspierasz portal i u篡tkownik闚.

8051 + sta這przcinkowe liczby 16bitowe

03 Gru 2007 21:33 1295 14
  • Poziom 16  
    Witam!
    Mam problem z liczba sta這przecinkowymi i 89S8252
    Buduje manipulator i przy zadawaniu warto軼i np. 270 stopni z silnika otrzymam 432 impuls闚.
    Oko這 1,6 impulsa na stopie z enkoder闚.
    Jak teraz przy zadawaniu watro軼i w stopnich zapisywa w rejestrze ile impuls闚 ma odliczy timer aby wy陰czy silnik??
    Programuje w asemblerze
    Pozdrawiam
  • Poziom 21  
    je瞠li N= 432, S=270 to s warto軼i skaluj帷e to dalej juz jest prosto:
    zadany ruch w stopniach to M wtedy dok豉dna warto嗆 impuls闚 z enkodera Y b璠zie wyznaczona formu陰 Y= (M*N)/S, koniecznie w tej kolejno軼i,teraz pozostaje tylko sprawdzi jakiej d逝go軼i arytmetyka bedzie potrzebna dla konkretnych zakres闚 stosowanych warto軼i skalujacych i zadawanego ruchu. Przyk豉dowo je瞠li zakres M to 0-360, to wtedy najwi瘯sza liczba po鈔ednia b璠zie 360*432 co sie na pewno nie zmie軼i w 16 bitach. albo os豉bienie dokladno軼i przez wstepne przeskalowanie, albo jakie operacje ze wsp鏊nymi podzielnikami (ale wtedy b璠zie to dopasowane do konkretnych wartosci skaluj帷ych) albo dorobi arytmetyke na wiekszych liczbach (24-32 bity)

    bis
  • Poziom 27  
    witaj
    Nie wiem co to za enkoder kt鏎y ma zakres 576 imp/obr鏒 ale nawet taki wynik w niczym nie przeszkadza. Przy zadawaniu k徠a musisz zrobi tak jak napisa kolega: przemno篡 przez sta豉. I wcale nie musi by to operacja 32bitowa, je郵i nie potrzebujesz tak du瞠j dok豉dno軼i :)
    Tak czy siak nie otrzymasz prawie nigdy pe軟ego stopnia, wi璚 nie ma o co si bi. Akurat mno瞠nie przez 0.8 nie jest takie trudne, kompilator zrobi Ci to sam, na takich liczbach, jakie sobie zyczysz, chyba ze wolisz to robi "z palca" i mie pewno嗆, to sobie rospisujesz zmienne na podzielne przez 2 i tez nie ma problemu :)
  • Poziom 16  
    Ch.M. napisa:
    witaj
    Nie wiem co to za enkoder kt鏎y ma zakres 576 imp/obr鏒 ale nawet taki wynik w niczym nie przeszkadza.

    mo瞠 nie by這 by tak d鏎zo ale jest to w陰cznik halotronowy TLE4905L wklejony mi璠zy magnesy silnika od wycieraczki i przy ka盥ym 興obku w wirniku nast瘼uje impuls, jest 10z這bk闚 a na wyj軼iu jeszcze przek豉dnia slimakowa 57/1 wi璚 wychodzi ponad 570impuls闚 na obr鏒
    Pomy郵e jeszcze na rozwi您aniem tego problemu bo 32bitowe liczby mnie nie kr璚 :D
    Je郵i kto ma jaki pomys to prosze pisac
    Pozdrawiam
  • Poziom 28  
    Domagasz sie konkret闚 wi璚 sam podaj konkrety.
    Jak rozumiem chodzi poprostu o to 瞠 masz jak捷 liczb wej軼iow IN i mno篡sz j przez 1.6 otrzymuj帷 OUT. Na pocz徠ek musisz okre郵i zakres poszczeg鏊nych liczb, mo瞠 dla Ciebie to oczywiste, ale dla mnie nie.
    Np:
    IN - od 0 do 360 (tak sie domy郵am, ale r闚nie dobrze mo瞠sz chcie robi 2 obroty)
    OUT - od 0 do 570
    Dok豉dno嗆 - 1 impuls (a mo瞠 1 stopie, albo 4 stopnie)

    Na tej podstawie dobierasz format liczb (ilo嗆 bit闚 i format Q) Np:
    IN - 16bit闚 (bo dok豉dno嗆 co do 1 stopnia)
    OUT - 16bit闚 (bo dok豉dno嗆 co do 1 impulsu)

    IN - minimalnie format Q0 maksymalnie Q7 (bo b璠ziesz zadawa z dokladno軼i do 1 stopnia)
    OUT - minimalnie format Q0 maksymalnie Q6 (bo i tak nie policzysz u豉mkowych impuls闚)
    Aby zapisa liczb 1.6 z maksymaln dok豉dno軼i wybieram IN-Q0, Out-Q6, z t康 wynika 瞠 1.6 zapiszemy w Q6, a wi璚 mamy (1.6)Q6 = 102 = 0x66.
    Teraz wystarczy tylko pomno篡: (IN)Q0 * 0x66 = (OUT)Q6
  • Poziom 27  
    No juz nie przesadzajmy, liczba bit闚 potrzebna do zapisu wej軼ia czy wyj軼ia nie jest a tak zale積a od ilo軼i obrot闚. Mo積a podzieli t liczb na cz窷 ca趾owit i cz窷 ulamkow (np 8bit闚 i 16bit闚) i precyzja przy 1 czy 250 obrotach b璠zie taka sama. mo瞠 jakby autor w徠ku napisa co buduje, to o wiele szybciej dosta豚y p瘯 rad co i jak trzeba zrobi... ale to tylko moja drobna sugestia :)
    Pozdrawiam
  • Poziom 28  
    Ch.M. napisa:
    No juz nie przesadzajmy, liczba bit闚 potrzebna do zapisu wej軼ia czy wyj軼ia nie jest a tak zale積a od ilo軼i obrot闚. Mo積a podzieli t liczb na cz窷 ca趾owit i cz窷 ulamkow (np 8bit闚 i 16bit闚) i precyzja przy 1 czy 250 obrotach b璠zie taka sama.

    Czyli jednak trzeba wi璚ej bit闚 8bit闚 + 16bit闚 = 24bity, tyle 瞠 zapisane w kodzie "tak jakby BCD z podstaw 360 a nie 10".
  • Poziom 27  
    Mo積a tak uj望. Je郵i chcesz oszcz璠zic rejestr闚 czy przeskok闚 sterty to mo瞠sz zdecydowa sie na 8+8bit闚 tyle, 瞠 dok豉dno嗆 spadnie Ci dwukrotnie i uproszcz si oblicznienia. Mo瞠 si瘳kaza, 瞠 i tak dok豉dno嗆 b璠zie wystarczaj帷a, a obliczenia w takim przypadku wykonywane s nawet 2 krotnie szybciej :)
  • Poziom 16  
    Jak napisa貫m na pocz徠ku buduje manipulator (mechaniczne ramie).
    Program napisany tak i przy nacisnienciu przycisku zwieszksza si o 1stopie warto軼 konta o jak ma przesun帷 si ramie.
    Watro軼 ta bezbo鈔ednio wysy豉na jest na LCD.
    I na po nacisni璚iu 149 razy przycisku (lub d逝窺zym przytrzymaniu) do komurki ram po adres np 35h zapisywana jest liczba 149.
    nast瘼nie przed uruchomieniem silnika do licznika kt鏎y bedzie odlicza impulsy z enkodera (halotronu) trzeba wpisa liczb po jakiej silnik wykona obr鏚 o 149 stopni czyli w tym przypadku 149*1,6=238,4 czyli 238 bo mega dok豉dno嗆 nie jest potrzebna i dzi瘯i temu bedzie mniej liczenia.
    Tu zaczyna si problem:
    1. jak w pami璚i ram zapisa liczbe np 320 bo o taki k徠 te silnik bedzie mog si poruszy??
    2. rozumiem 瞠 do timera przed startem trzeba za豉dowa 65536-sta豉 w Ram*1,6??
    ma kto inny pomys albo mo瞠 potwierdzi m鎩??
    mo瞠 jaki przyk豉dowy kod w asm??
  • Pomocny post
    Poziom 39  
    Skoro obliczenia w asemblerze sprawiaj Ci k這pot , to maj帷 8KB pami璚i programu i 2KB EEProm-u , wygospodaruj 720 bajt闚 na tablic , zapisz w niej gotowe warto軼i dla ka盥ego k徠a i ... to tyle ;)

    Piotrek
  • Poziom 16  
    zumek napisa:
    Skoro obliczenia w asemblerze sprawiaj Ci k這pot , to maj帷 8KB pami璚i programu i 2KB EEProm-u , wygospodaruj 720 bajt闚 na tablic , zapisz w niej gotowe warto軼i dla ka盥ego k徠a i ... to tyle ;)

    w sumie te 720 bajt闚 zawsze si znajdzie a z tablica bedzie mo瞠 nie profesjonalnie ale chocia bez problem闚 ;)
    Tylko 瞠 za dobrze nie potrafie budowa tablic w asemblerze, ale zaraz o tym poczytam :D
  • Poziom 12  
    Cytat:

    a z tablica bedzie mo瞠 nie profesjonalnie ale chocia bez problem闚 ;)
    Tylko 瞠 za dobrze nie potrafie budowa tablic w asemblerze, ale zaraz o tym poczytam :D


    Wi璚ej pokory kolego Tarczel2 dla zumka, w豉郾ie z tablic b璠zie b. profesjonalnie, poprogramujesz troch to si dowiesz dlaczego.
  • Poziom 18  
    Jak zrozumia貫m u Ciebie jest tylko problem z zapisem liczby wi瘯szej od 255 do kom鏎ki pami璚i.
    Ot騜, je瞠li o to chodzi, to trzeba po prostu zrobi z liczby wi瘯szej od 255 dwie liczby z kt鏎ych 瘸dna z nich nie b璠zie wi瘯sza od 255, czyli zwr鏂i m這dsz cz窷 (bajt LSB) podanej zmiennej (np. typu word, czyli liczby do 65535), oraz zwr鏂i starsz cz窷 (bajt MSB) podanej zmiennej.
    W ten spos鏏 otrzymasz dwie liczby jednobajtowe, a wi璚 mniejsze od 255 kt鏎e zapisujesz do kom鏎ek pami璚i.
    Po ich odczytaniu 陰czysz je, aby znowu otrzyma liczb kt鏎a b璠zie wi瘯sza od 255.
    Tak np. dla liczby 65535, LSB=255, MSB=255
    Operacja 陰czenia to (MSB*256)+LSB
  • Poziom 16  
    Pozostane jednak przy tablicach
    Pozdrawiam i dzi瘯uje za odpowiedzi
  • Poziom 18  
    Zrobisz jak Ci pasuje, ale tak jest bardzo prosto, dla liczby np. 432 (jak napisa貫 na pocz徠ku) jest to LSB=176, MSB=1. U篡wasz 1 zmiennej typu word, oraz dw鏂h zmiennych pomocniczych typu byte.