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

Funkcja konwertująca z jednego zakresu na inny nie działa

MarQs11 10 Paź 2010 19:10 1623 3
REKLAMA
  • #1 8604454
    MarQs11
    Poziom 19  
    Witam.
    Proc: Atmega8
    IDE: Bascom

    Piszę dość spory kawałek kodu, a zatrzymałem się na prostej funkcji.
    Jej zadanie mam być konwersja liczby z jednego zakresu na inny (np. 0-1023 na 0-255).
    Napisałem taki kawałek kodu:
    Function Mapuj(byval Z As Byte , Byval In_min As Integer , Byval In_max As Integer , Byval Out_min As Integer , Byval Out_max As Integer) As Byte
       Local Alfa As Long
       Local Beta As Long
       Local Gamma As Long
       Local Delta As Long
       Local Epsilon As Long
       Local Dzeta As Long
       'Local Temp As Integer
    
       Alfa = Z - In_min
       Beta = Out_max - Out_min
       Gamma = In_max - In_min
       Delta = Alfa * Beta
       Epsilon = Delta / Gamma
       Dzeta = Epsilon + Out_min
       'Temp =(z - In_min) *(out_max - Out_min) /(in_max - In_min) + Out_min
    
       Mapuj = Dzeta
    End Function


    Jest to żywcem przepisane polecenie 'map()' z projektu arduino.
    http://www.arduino.cc/en/Reference/Map

    Wywołują tę funkcję w ten sposób:
    A = Mapuj(kat , 0 , 180 , 120 , 580)

    gdzie pierwszy argument to zmienna do konwersji, dwie liczby określające zakres wejściowy i dwie zakres wyjściowy. Mimo to w zmiennej "A" mam cały czas wartość 0.

    Kod prosty jak but, a mimo to nie działa :/ W czym tkwi błąd? (pewnie jak zwykle w programiście).
    Zadeklarowane typy zmiennych wynikają z zakresu liczb jakich będę używał. Sposób przekazywania parametrów (BYREF) wymusił Bascom - wywalał błędy jeśli zostawiłem wartości domyślne. A taki a nie inny sposób obliczeń wynika z tego, że nie da się chyba w Bascomie pisać skomplikowanych równań (przyjmuje tylko 3 argumenty).
  • REKLAMA
  • #2 8605227
    MarQs11
    Poziom 19  
    Nawet po zamianie na zmienne 'byte' i podstawieniu do funkcji danych, które mieszczą się w zakresach funkcja nie działa.
    Po wywaleniu wszystkich możliwych zmiennych na LCD wygląda na to, że do funkcji przesyłany jest jakiś syf a nie poprawne wartości.
    Powiedzmy, ze wywołuję funkcję z parametrami:
    Mapuj(9 , 0 , 10 , 10 , 50)

    Funkcja zwraca nadal '0', a kolejne parametry wyrzucone na LCD wyglądają tak:
    (0, 0, 61, 8, 13)

    i po każdym resecie są losowe.
  • REKLAMA
  • #3 8611871
    piotr5000
    Poziom 21  
    Jeżeli A (0.....1023 ) ma zostać zamieniona na B (0...255) to czy
    majprościej nie będzie

    Dim A As Word
    Dim C As Word
    Dim B As Byte

    A = 1023
    C = A / 4
    B = C

    Konieczna jest zmienna C typu dwubajtowego , bo bezpośrednie dzielenie
    B=A / 4 daje wynik 63
  • #4 8612602
    MarQs11
    Poziom 19  
    0-1023 <-> 0-255 to był tylko przykład. Chodziło o to, by funkcja była uniwersalna w szerokich zakresach.
    W końcu udało mi się ja uruchomić. Okazało się, że za mały był rozmiar ramki i trzeba było dodać do kodu:
    $hwstack = 64
    $swstack = 32
    $framesize = 100


    I o ile tę funkcję uruchomiłem, to już wywoływanie jednej funkcji z wnętrza drugiej znowu wysypuje procesor. Cóż - trzeba próbować dalej.
REKLAMA