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

[BASCOM] zmienna 1 bajtowa dodatnia i ujemna

wader_669 20 Sie 2009 02:06 2877 11
REKLAMA
  • #1 6912015
    wader_669
    Poziom 28  
    Mam pewnien problem.
    W c jest taka zmienna jak integer (int). Jesto to zmienna 1 bajtowa w procesorach 8 bitowych, moze przyjmowac wartosci od -128 do 127.
    W bascomie nie ma takiej zmiennej. Wiadomo nie jest trudno napisac odpowiedni program, ktory by mi to przeliczal. Tym bradziej, ze bede i tak musial zastosowac bascomowa zmienne typu integer/long, ktora jest 2/4 bajtowa, ale moze przyjmowac wartosci dodatnie i ujemne.
    Problem jest w tym, ze nie wiem ile to np. -128 (w c integer) = ? (w bascomie zmiennej typu "byte") albo najlepiej by bylo gdybym sie dowiedzial wartosci binarnych. Ma ktos moze jakas tabelke? albo moze pomoc? lub ktos moze posiada jakas biblioteke?

    (z gory mowie, ze szukalem nic nie znalazlem)
  • REKLAMA
  • Pomocny post
    #2 6912024
    KJ
    Poziom 31  
    Jeżeli znasz C a z twoich wypowiedzi wynika że choć trochę znasz to może lepiej nie psuć sobie mózgu bascomem tylko napisać w C ? Jeżeli chodzi o zmienne to z tego co mi wiadomo to jedynym typem ze znakiem w bascomie jest właśnie integer tyle ze jest on dwu bajtowy i może mieć wartość od -32,768 do +32,767 tak wynika z helpa. Sensownym byłoby chyba użycie najstarszego bitu jako znaku. Wszak do 127 mamy tam cały czas 0 a powyżej 1 więc stwierdzamy że jak ostatni bit jest 1 to liczba jest ujemna. Żeby otrzymać liczbę zmieniamy ten bit na 0 i wiemy ze otrzymana liczna jest liczną ujemną. Tak bym to chyba zaimplementował.
  • #3 6913384
    wader_669
    Poziom 28  
    C znam troche, juz od paru lat staram sie przeskoczyc cos nie daje rady. W c integer jest 1 bajtowy i mam czujnik ktory podaje mi dawne w takiej postaci.
    Bascom ma zmienna integer ale 2 bajtowa i to ten problem.
    Teraz chcialem zrobic tak ze dane z czujnika beda zapisywane do zmiennej typu byte i pozniej bedzie to przeliczane czy to jest wartosc ujemna czy dodatnia. Nastepnie bedzie ta wartosc z czujnika dodawana do drugiej zmiennej typu integer/long.
    Teraz pytanie jest jak jest zapisywana zmienna integer w c zebym mogl odpowiedni program napisac w bascomie ktory to przelicza.
    Nie moge sobie wymyslic jak ta zmienna ma wygladac, czyjnik z gory mi mowi jak ona wyglada.
  • Pomocny post
    #4 6913457
    mirekk36
    Poziom 42  
    kolega wader_669 - jak zawsze tak zakręci temat, że na końcu przez to wszystko sam już się w tym wszystkim niepotrzebnie gubi ;)

    poczekaj poczekaj, odpowiedz może po kolei na kilka pytań żeby dobrze zrozumieć twój cel:

    1. piszesz program w końcu w C czy Bascomie ?
    2. czy może masz 2 procki, które komunikują się jakoś ze sobą i na jednym masz program w C a na drugim w Bascomie i chcesz odpowiednio dokonać konwersji typów po przesłaniu danych?

    bo już sam nnie wiem o co tutaj chodzi ? ;)

    .... poza tym piszesz, że w C integer jest 1 batowy - co nie jest do końca prawdą - bo wszystko zależy jak ten integer zdefiniujesz tzn jak zmienną zadelkarujesz, możesz przecież napisać:

    int8_t zmienna = 122;


    i będzie to zmienna 1 bajtowa

    ale równie dobrze możesz tak:

    int16_t zmienna = -583;


    i będzie to już zmienna dwubajtowa ;)

    więc gdybym wiedział z czym wiążą się twoje rozmyślania i problemy odnośnie typów w Bascomie i w C - tak od strony twojego softu to może można byłoby coś konkretnego podpowiedzieć.
  • REKLAMA
  • Pomocny post
    #5 6913514
    szelus
    Poziom 34  
    Podejrzewam, że chodzi o 8 bitów z czujnika interpretowane do tej pory w C jako int8_t.
    :arrow: wader_669
    Reprezentacja binarna - zobacz kod uzupełnieniowy do 2
    Przeliczanie - wpisz te 8 bitów do 16-bitowego integer-a i jeżeli jest więcej niż 127 to odejmij 256.
  • REKLAMA
  • #6 6913522
    wader_669
    Poziom 28  
    1. bascom (tlumacze z c)
    2. cos podobnego. Jeden to czujnik z myszki pan3101, ktory podaje mi przesuniecie x/y w zmiennej 1 bajtowej, ktora moze byc dodatnia i ujemna (od -128 do 127). Drugi procesor to avr atmega16 czy 32 (bez roznicy jak pisze w bascomie)
    Chodzi tutaj o ten temat:
    https://www.elektroda.pl/rtvforum/topic1395263.html
  • Pomocny post
    #7 6913527
    kulmar
    Poziom 31  
    wader_669 napisał:
    Mam pewnien problem.
    W c jest taka zmienna jak integer (int). Jesto to zmienna 1 bajtowa w procesorach 8 bitowych, moze przyjmowac wartosci od -128 do 127.
    W bascomie nie ma takiej zmiennej. Wiadomo nie jest trudno napisac odpowiedni program, ktory by mi to przeliczal. Tym bradziej, ze bede i tak musial zastosowac bascomowa zmienne typu integer/long, ktora jest 2/4 bajtowa, ale moze przyjmowac wartosci dodatnie i ujemne.
    Problem jest w tym, ze nie wiem ile to np. -128 (w c integer) = ? (w bascomie zmiennej typu "byte") albo najlepiej by bylo gdybym sie dowiedzial wartosci binarnych. Ma ktos moze jakas tabelke? albo moze pomoc? lub ktos moze posiada jakas biblioteke?

    (z gory mowie, ze szukalem nic nie znalazlem)


    Ok. Czyli jak się domyślam chodzi o sposób zapisu liczb ze znakiem ?

    Otóz są one zaisywane w kodzie uzupełnienia do dwóch (google się kłania). I tak dla zrozumienia istoty bez google w przypadku liczb 8 bitowych:

    1 = 0000 0001
    2 = 0000 0010
    itd. aż do:
    127 = 0111 1111
    a teraz:
    -1 = 1111 1111 (czyli bez znaku jest to 255!)
    -2 = 1111 1110 (czyli bez znaku jest to 254)
    aż do:
    -128 = 1000 0000 (czyli bez znaku jest to 128)

    Pozdrawiam

    Mariusz
  • #8 6915727
    wader_669
    Poziom 28  
    kulmar napisał:
    google się kłania


    Google nie jest mi opce. Nie wiedzialem jakich slow kluczowych uzyc, dlatego tez mialem marny wynik.

    Dziekuje za pomoc KJ, Szelus i Kulmar.
    Mirekk36 troche juz sie znamy przez to forum, zawsze bylem chaotyczny i chyba to sie juz nie zmieni :D
    Mirekk36 slyszalem, ze budujesz robota. Tez wlasnie sie za to zabieram. Pewnie twojemu nie dorowna, ale jest pomyslowy.
    Wejdz na tego linka:
    https://www.elektroda.pl/rtvforum/topic1395263.html
    moze ci sie przyda. Jest to czujnik otpyczny z myszki. Ja go chce uzyc zamiast enkodera.

    Tutaj umieszczam kod dla innych:
    (Poprzedni kod jest zly zaraz poprawie i ponownie umieszcze)
    
    dim x as byte
    dim x1 as integer ' <-32768, 32767>
    'dim x1 as long  <-2^32, 2^32-1>
    
    do
    If X.7 = 0 Then
    X1 = X1 + X
    Else
    X = Not X
    X = X + 1
    X1 = X1 - X
    End If
    loop : end
    
  • REKLAMA
  • Pomocny post
    #9 6915792
    szelus
    Poziom 34  
    Chyba ten kod nie jest jednak dobry. (Ups, to komentarz do starego kodu, którego już nie ma ;). Jeżeli mysz to ta z pdf-a z tego drugiego wątku i x to wartość odczytana, a x1 bieżąca pozycja, to raczej powinno być tak, jak pisałem powyżej:
    
    x1 = x1 + x
    if x > 127 then
        x1 = x1 - 256
    end if
    

    Edit: nowy kod jest chyba poprawny (póżno już ;) ), ale niepotrzenie skomplikowany.
  • #10 6915799
    wader_669
    Poziom 28  
    Nie wiem o ktorym kodzie mowisz?
    Teraz jest poprawny, testowalem dziala :D

    Dodano po 1 [minuty]:

    Czekaj musze pomyslec czy twoj tez bedzie dzialac

    Dodano po 9 [minuty]:

    Oczywiscie, ze masz racje kod o wiele prostszy i raczej bedzie dzialac. O tej godzinie po prostu juz nie mysle
  • Pomocny post
    #11 6916297
    mirekk36
    Poziom 42  
    wader_669 napisał:
    Mirekk36 slyszalem, ze budujesz robota. Tez wlasnie sie za to zabieram. Pewnie twojemu nie dorowna, ale jest pomyslowy.
    Wejdz na tego linka:
    https://www.elektroda.pl/rtvforum/topic1395263.html
    moze ci sie przyda. Jest to czujnik otpyczny z myszki. Ja go chce uzyc zamiast enkodera.


    no przestań, to mój pierwszy robot w życiu - więc wątpię aby była to od razu jakaś udana konstrukcja ;) ... a swoją drogą to do czego konkretnie będziesz wykorzystywał w swoim robociku taki enkoder ??? ;)

    .... odnośnie tego sposobu na zamianę tych twoich wartości to polecam taki nieco krótszy sposobik i bez żadnych IF'ów - może się przyda? ;) - i jest jakby troszkę krótszy w kodzie

       X1 = -256 * X.7
       X1 = X1 + X
  • #12 6916594
    wader_669
    Poziom 28  
    Juz chyba tego nie mozna nazwac enkoderem :D Ten uklad ma sluzyc jako czujnik przemieszczenia.

    Twoj kod u mnie nie zadziala, bo w x1 jest zapisywane ile juz sie przemiescil. W takim kodzie bym co chwile nadpisywal zmienna x1 i tracil dane z wartosciami ile juz sie przemiescil.
    Po 2 musze i tak zrobic ifa bo w tych czujnikach jest cos takiego jak wskaznik przepelnienia zmiennej. Gdy flaga przepelnienia jest rowna 1 wtedy musze dodatkowo dodac 127 lub odjac 128.
REKLAMA