Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[STM32][C] - Encoder Interface Mode zawracana liczba

ka_3 26 Kwi 2015 00:43 1308 22
  • #1 26 Kwi 2015 00:43
    ka_3
    Poziom 16  

    Bawiłem się ostatnio trybem Encoder Interface Mode w mikrokontrolerze stm32f4. Wykorzystuję do tego 32 bitowy TIMER2. Problem zaczyna się jak chcę wartość z licznika zwrócić w funkcji. Tak to mniej więcej wygląda:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Po uruchomieniu programu gdy wartość licznika jest równa zero kręcę kołem od enkodera w prawo funkcja zwraca liczby rosnące (0, 1, 2 .....)
    Gdy zaś kręcę w lewo chciałbym aby pojawiały się wartości ujemne tzn (0, -1, -2, .....)
    a pojawiają się (4294967296, 4294967295, 4294967294, ......)
    gdy zmienię typ zwracanej funkcji na uint16_t
    Kod: c
    Zaloguj się, aby zobaczyć kod
    wszystko jest w porządku.
    Nie potrafię tego wytłumaczyć i dojść do rozwiązania.

    0 22
  • #3 26 Kwi 2015 11:06
    ka_3
    Poziom 16  

    Funkcja GetCounter zwraca liczbę typu uint32_t;

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Próbowałem odczytywać bezpośrednio z rejestrów i zwracać jako int32_t, ale jest dokładnie ten sam problem co opisany w temacie.
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Gy zmieniłem typ zwracany na int16_t wszystko jest w porządku.
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #5 26 Kwi 2015 12:09
    alagner
    Poziom 25  

    Pokaż całość kodu. 4294967295 i -1 to t sama reprezentacja binarna, jedynie inaczej interpretowane są bity, czyli błąd jest raczej gdzie indziej.

    https://ideone.com/tMYTIE

    0
  • #6 26 Kwi 2015 20:19
    Freddie Chopin
    Specjalista - Mikrokontrolery

    dasej napisał:
    Wychodzi na to że znalazłeś błąd w kompilatorze, tak to wygląda.

    No... Z pewnością... Jak czytam takie rzeczy, to nie wiem czy się śmiać czy płakać. Pewnie ten "błąd w kompilatorze" wygląda tak, że później ta liczba jest wysyłana przez UART funkcją która przyjmuje liczbę bez znaku...

    1
  • #7 26 Kwi 2015 21:53
    ka_3
    Poziom 16  

    Tak wysyłam przez UART, ale wg mnie tu nie warto szukać błędów.
    Dodałem taki fragment kodu, kręcąc w lewo wałem silnika dioda się nie włącza gdy wartość zwracana to int32_t, gdy zmieniłem na int16_t dioda się zapaliła.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Tak inicjuję:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #8 26 Kwi 2015 22:15
    tadzik85
    Poziom 38  

    ka_3 napisał:
    Tak wysyłam przez UART, ale wg mnie tu nie warto szukać błędów.
    Dodałem taki fragment kodu, kręcąc w lewo wałem silnika dioda się nie włącza gdy wartość zwracana to uint32_t, gdy zmieniłem na uint16_t dioda się zapaliła.
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Tak inicjuję:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    A GetEncoder zwraca zapewne zmienną bez znaku. I czemu się dziwisz?

    0
  • #9 26 Kwi 2015 22:19
    Freddie Chopin
    Specjalista - Mikrokontrolery

    ka_3 napisał:
    Tak wysyłam przez UART, ale wg mnie tu nie warto szukać błędów.

    Skoro tak twierdzisz, to szukaj ich dalej w kompilatorze. Good luck & have fun.

    ka_3 napisał:
    Dodałem taki fragment kodu, kręcąc w lewo wałem silnika dioda się nie włącza gdy wartość zwracana to uint32_t, gdy zmieniłem na uint16_t dioda się zapaliła.

    Jeśli Twoja funkcja getEncoder() zwracała raz uint32_t, a drugi raz uint16_t, to nie ma opcji, że dioda się zapaliła. Chyba że zapalasz ją jeszcze gdzieś, ale tego się nie dowiemy, bo na razie widzimy tylko fragmenty kodu które pokazują, że niezbyt umiesz programować w języku C oraz sugestie, że źródłem problemu jest błąd w kompilatorze (w sumie to nawet nie wiemy w jakim). Co więcej - widzimy również, że nie umiesz w sposób precyzyjny opisać swojego problemu, bo w piszesz o uint16_t, a potem pokazujesz kod w którym jest int16_t. Skąd mamy wiedzieć, że pisząc "zmieniłem na int32_t" tak naprawdę nie zmieniłeś na uint32_t?

    Pokaż CAŁY kod, włącznie z tym który każe Ci sądzić, że liczba jest bez znaku choć powinna być ze znakiem. W przeciwnym wypadku źródłem problemu jest znany fenomen o skrócie PEBKAC.

    0
  • #10 26 Kwi 2015 22:24
    ka_3
    Poziom 16  

    tadzik85 napisał:
    ka_3 napisał:
    Tak wysyłam przez UART, ale wg mnie tu nie warto szukać błędów.
    Dodałem taki fragment kodu, kręcąc w lewo wałem silnika dioda się nie włącza gdy wartość zwracana to uint32_t, gdy zmieniłem na uint16_t dioda się zapaliła.
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Tak inicjuję:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    A GetEncoder zwraca zapewne zmienną bez znaku. I czemu się dziwisz?

    Źle napisałem. Miało być int16_t i int32_t :|

    0
  • #11 26 Kwi 2015 22:30
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Reasumując:

    "Ustawiłem timer żeby działał tylko w zakresie dodatnim zmiennych 32-bitowych (kod poniżej) i chyba jest błąd w kompilatorze, bo nie mogę uzyskać liczby ujemnej..."

    Code:
    TIM_SetAutoreload (ENCR_TIMER, 0x7fffffff);

    1
  • #12 26 Kwi 2015 22:40
    ka_3
    Poziom 16  

    Aha :D . Szczerze mówiąc myślałem, że ta funkcja "robi" coś innego.
    Napisałem gdzieś, że jest błąd w kompilatorze?
    W STM32 jestem dość początkujący.

    0
  • #13 26 Kwi 2015 22:42
    tadzik85
    Poziom 38  

    ka_3 napisał:
    Aha :D . Szczerze mówiąc myślałem, że ta funkcja "robi" coś innego.
    Napisałem gdzieś, że jest błąd w kompilatorze?


    Klasyczny objaw ignorancji......
    A korzystaj dalej z bibliotek. Gdzie nawet nie pokusiłeś się o zapoznanie choćby z nią.

    0
  • #14 27 Kwi 2015 22:36
    ka_3
    Poziom 16  

    Każdy krytykuje SPL. Nie jest to czasem odpowiednich bibliotek w Arduino? Dziwi mnie to, bo Arduino bardzo dobrze się przyjęło na polskich uczelniach, wśród amatorów, a nawet profesjonalistów.

    -1
  • #15 27 Kwi 2015 22:49
    tadzik85
    Poziom 38  

    ka_3 napisał:
    Każdy krytykuje SPL. Nie jest to czasem odpowiednich bibliotek w Arduino? Dziwi mnie to, bo Arduino bardzo dobrze się przyjęło na polskich uczelniach, wśród amatorów, a nawet profesjonalistów.


    Za dużo powiedziane....., To zabawka, a skutki przedstawiłeś w tym temacie.

    0
  • #16 27 Kwi 2015 23:56
    Freddie Chopin
    Specjalista - Mikrokontrolery

    ka_3 napisał:
    Dziwi mnie to, bo Arduino bardzo dobrze się przyjęło na polskich uczelniach, wśród amatorów, a nawet profesjonalistów.

    Arduino + profesjonaliści? Ci którzy wcześniej używali BASCOMa czy niby jacy?

    0
  • #17 28 Kwi 2015 00:43
    alagner
    Poziom 25  

    Problem w tym, że przyjęło się na uczelniach, bo poziom leci na pysk, ot cała zagadka.

    0
  • #18 28 Kwi 2015 05:51
    tronics
    Poziom 36  

    alagner napisał:
    Problem w tym, że przyjęło się na uczelniach, bo poziom leci na pysk, ot cała zagadka.

    To swoją drogą, ale podejrzewam, że głównie chodzi o to by coś ciekawego na 2 godzinach lekcyjnych pokazać. Efektem jest to, że absolwent nie jest w stanie zrobić nic jeśli nie ma jasno opisanych "bibliotek" do obsługi wszystkich peryferiów, ale może się pochwalić, że zaprogramował działającego robota kroczacego, stację meteo, drona etc.

    0
  • #19 28 Kwi 2015 08:05
    ka_3
    Poziom 16  

    Freddie Chopin napisał:
    ka_3 napisał:
    Dziwi mnie to, bo Arduino bardzo dobrze się przyjęło na polskich uczelniach, wśród amatorów, a nawet profesjonalistów.

    Arduino + profesjonaliści? Ci którzy wcześniej używali BASCOMa czy niby jacy?
    Ktoś kto ładnych paręnaście lat programował w C, jak pojawiło się Arduino to w swoich konstrukcjach go używa i poleca innym. Ja programowałem AVR tylko rok i jakoś nie miałem problemu pisać w C. Może dlatego, że jest kilka dobrych książek jak pisać w C pod AVR. Nawet nie przyszło mi na myśl aby używać Arduino.
    Dwa miesiące temu przesiadłem się na STM32 i próbując pisać w C utonąłem, Zero przykładów, wszystkie książki i tutoriale wykorzystują SPL. Znacie jakąś dobrą książkę lub tutorial w języku angielskim, który pokazuje jak pisać w C pod STM32 bez użycia SPL?

    tronics napisał:
    To swoją drogą, ale podejrzewam, że głównie chodzi o to by coś ciekawego na 2 godzinach lekcyjnych pokazać. Efektem jest to, że absolwent nie jest w stanie zrobić nic jeśli nie ma jasno opisanych "bibliotek" do obsługi wszystkich peryferiów, ale może się pochwalić, że zaprogramował działającego robota kroczacego, stację meteo, drona etc.

    Pisząc o uczelniach miałem co innego na myśli. NA dobrych uczelniach nie jest Arduino wykorzystywane na laboratoriach. Wydaje mi się, że w pracach dyplomowych jest często używane. Dlaczego? Dlatego, żeby student nie tracił czasu na pisanie w samym C, jeśli może to szybko wyklikać w Arduino. Dodtakowo nie trzeba robić PCB. Oczywiście mówię o takich pracach gdzie mikrokontroler jest tylko dodatkiem, a nie głównym tematem pracy.

    0
  • #20 28 Kwi 2015 08:17
    Freddie Chopin
    Specjalista - Mikrokontrolery

    ka_3 napisał:
    Znacie jakąś dobrą książkę lub tutorial w języku angielskim, który pokazuje jak pisać w C pod STM32 bez użycia SPL?

    Taka "książka" nazywa się Reference Manual. W ekstremalnych przypadkach - gdy coś nie działa a powinno - wystarczy spojrzeć do kodu SPLa żeby upewnić się, że kolejność operacji jest prawidłowa. Naprawdę nie jest Ci potrzebne nic więcej.

    Do startu możesz wykorzystać przykłady z mojej stronki - https://www.elektroda.pl/rtvforum/topic1339518-0.html - masz tam użycie GPIO i konfigurację PLL bez żadnego SPLa.

    0
  • #21 28 Kwi 2015 08:28
    gaskoin
    Poziom 38  

    ka_3 napisał:
    Może dlatego, że jest kilka dobrych książek jak pisać w C pod AVR.

    ...

    Dwa miesiące temu przesiadłem się na STM32 i próbując pisać w C utonąłem, Zero przykładów, wszystkie książki i tutoriale wykorzystują SPL. Znacie jakąś dobrą książkę lub tutorial w języku angielskim, który pokazuje jak pisać w C pod STM32 bez użycia SPL?


    Problem w tym, że nie ma czegoś takiego jak "język C na AVR", "C na STM", "C na MSP430". C to C i tyle. Reszta to tylko manual, żeby wiedzieć które rejestry i kiedy poustawiać. Jeśli chodzi o książki to dla mnie ideałem jest "język ANSI C", ale dla początkujących ilość informacji może być tam za bardzo upakowana.

    0
  • #22 28 Kwi 2015 12:33
    ka_3
    Poziom 16  

    gaskoin napisał:

    Problem w tym, że nie ma czegoś takiego jak "język C na AVR", "C na STM", "C na MSP430". C to C i tyle. Reszta to tylko manual, żeby wiedzieć które rejestry i kiedy poustawiać.

    Wiem, że C to C, ale inaczej wygląda np. PWM na AVR a inaczej na ARM właśnie ze względu bardziej rozbudowanych rejestrów. Jak na razie jest mi to ciężko połapać. Na AVR po jakimś pół roku nauczyłem się samemu korzystać z noty i pisać waąsne programy, wcześniej przerabiałem przykłady z książek. W nocie od stm ginę. Tutaj leży u mnie problem.

    0
  • #23 07 Maj 2015 13:36
    ka_3
    Poziom 16  

    Wiem, że SPL jest zły, powoli z niego uciekam.
    Nie rozumiem jeszcze jednej rzeczy w tym fragmencie:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    a taki błąd się ukazał:

    Code:
     error: 'RCC_APB2Periph_GPIOA' undeclared (first use in this function)


    Nie jest to mój wytwór tylko kod z książki.

    IDE to CooCox.

    EDIT: Popatrzyłem w DS i w rejestrze RCC_APB2ENR nie ma takiego bitu, jest zaś w RCC_AH1B1ENR. W książce jest błąd?

    0