Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[STM32F407/C/KEIL] - Zawieszanie się mikrokontrolera

11 Dec 2012 21:11 1998 11
  • Level 11  
    Witam
    mam taki problem, otóż mój STM32F4 bardzo dziwnie się zachowuje.
    Mój program ma odczytywać z 3 różnych czujników przez I2C dane i przeliczać je. I2C zrealizowane jest na przerwaniach (z najwyższym priorytetem), dodatkowo używam timera 2, by odmierzał czas.
    Oto kod:
    Code: c
    Log in, to see the code


    Jak go puszczę w debuggerze to zawiesza się w pierwszej : "while(czas<1000);", na podgl±dzie widać, że czas jest znacznie większy od tego 1000, a jak go akurat zatrzymam w miejscu w którym realizowane jest przerwanie od timera, to po doj¶ciu przez "step" do końca przerwania zawiesza się.

    To niestety nie koniec problemów, aby omin±ć ten problem po prostu po każdym zainicjalizowaniu czujnika (inicjalizacje s± bez przerwań) dawałem break pointa i to działało (nie używałem w tym miejscu w ogóle timera.
    W pętli głównej programu, w której sprawdzam czy min±ł czas i można już odebrać dane w zależno¶ci od ustawionych czasów, albo odbieram dane tylko z przyspieszeniomierza (BMA180), albo jeden pomiar z żyroskopów (ITG) i żadnego pomiaru z magnetometru (HMC), a czasem odbieram poprawnie wszystkie dane.
    W dwóch pierwszych przypadkach jak zatrzymam program po kilku sekundach, to okazuje się, że licznikITG i licznikHMC maj± bardzo duże warto¶ci.
    W pętli głównej s± tylko 4 warunki if (zazwyczaj nie spełnione) a i tak nic się nie dzieje, tylko jak zatrzymam program i dam step to w ogóle nie wiem gdzie jest kursor. Co dziwne pierwszy warunek (z BMA180) jest sprawdzany i wykonywany - co prawna nie po 0.5 ms, ale jako¶ mikrokontroler to widzi, a innych warunków już nie.

    Czy robię jaki¶ podstawowy bł±d? Może mam co¶ Ľle skonfigurowane? Z góry dziękuję za pomoc i pozdrawiam
    Maciek
    [30.03.2021, darmowy webinar] Nowoczesna diagnostyka maszyn, monitorowanie i przewidywanie awarii. Zarejestruj się
  • Helpful post
    MCUs specialist
    Dawno już nie było mojego ulubionego problemu zaczynaj±cego się na literę fał.

    qq¶ wrote:
    Czy robię jaki¶ podstawowy bł±d?

    Tak - napisałe¶ taki program że to po prostu masakra...

    4\/3!!
  • Helpful post
    User removed account  
  • Level 11  
    Niestety moja wiedza na ten temat była zerowa, także pewnie miesi±c zeszłoby mi na szukaniu błędu:) Dlatego dziękuję bardzo.
    Rzeczywi¶cie rozwi±zało to pierwszy problem z zawieszaniem się mikrokontrolera, ale dalej nie rozumiem dlaczego w w pętli nieskończonej w mainie sprawdzany jest tylko warunek z pierwszego czujnika, a dwóch pozostałych nie (wszędzie gdzie było potrzebne to dałem to volatile)
  • Level 21  
    Ciężko się patrzy na ten kod. Ale my¶lę, że problem leży w tym, że zmienna: I2CInProgress, nie jest nigdy zerowana. W instrukcji switch, kiedy program natrafi na case pierwszy lub drugi, wykona go i wyjdzie z niego. Ewentualnie, je¶li nie natrafi na żaden z warunków, to się zawiesi.
  • MCUs specialist
    qq¶ wrote:
    dalej nie rozumiem dlaczego w w pętli nieskończonej w mainie sprawdzany jest tylko warunek z pierwszego czujnika, a dwóch pozostałych nie

    Ciężko będzie to znaleĽć, bo Twój program jest "trochę" za długi i "trochę" mało czytelny.

    4\/3!!
  • Level 11  
    I2CInProgress zeruję po odebraniu wszystkich bajtów.
    W funkcji głównej rozpoczynam tylko wysyłkę 1 bajta (nr rejestru czujnika z którego mam czytać dane), a w przerwaniu od I2C po odebraniu 6 bajtów ustawiam na 0 (w podgl±dzie jak zatrzymam kod to jest 0).
    albertb my¶lałem, że tak jest najlepiej, ale w sumie mogę robić tak, że jak już 2 razy odbiorę dane z BMA, to wtedy czytam z czujnika ITG, a jak z ITG odbiorę 14 razy dane to wtedy z HMC, ale tak wydawało mi się lepiej - jutro spróbuję tak zrobić i zobaczę czy wszystko będzie hulać:)
    Dzięki za odpowiedzi, odezwę się jutro i zdam relację jak mi poszło:)
    edit: Freddie: wiem, że mało czytelne jest to dla Was, mógłbym jeszcze napisać funkcje do wysyłania i odbierania danych przez polling w I2C do konfiguracji czujników, ale boję się trochę tego ruszać skoro już działa:D Najlepiej pewnie byłoby jakby w pliku main.c była tylko pętla główna programu a reszta gdzie¶ po innych plikach, ale dla mnie to jest już mniej czytelne, bo trzeba szukać po różnych plikach różnych funkcji (nie wiem może kiedy¶ do tego dojrzeję, ale póki co dla mnie to jest najczytelniejsze).
  • Level 21  
    No teraz już widzę, że jest po za switchem, ale ciężko cokolwiek w tym kodzie wypatrzeć. Albo już póĽno jest :D.

    Czy ten pierwszy warunek jest spełniony więcej niż jeden raz?
  • Level 11  
    Tak, pierwszy i ostatni. Po kilku sekundach działania programu naliczyć mi kilkaset pomiarów z czego 1 pomiar z ITG a reszta z BMA. Co również jest zastanawiaj±ce powinno być kilka tysięcy pomiarów a nie kilkaset. Tak jakby ten mikrokontroler wcieło gdzie¶ na chwilę po każdym pomiarze
  • Level 11  
    Witam ponownie
    Przerobiłem trochę kod i teraz rzeczywi¶cie odczytuje dane z wszystkich czujników no ale jest jedno ale.....
    Częstotliwo¶ć odczytywania danych jest znacznie mniejsza niż być powinna.
    Code: c
    Log in, to see the code


    Jak ustawię breakpointa zaraz po wej¶ciu w funkcję if to okazuje się, że licznikCzasu ma warto¶ci z przedziału 252-255. Chyba trochę dużo jak na zrobienie kilkuset działań.


    edit: jeszcze mam takie pytanie, czy wiecie dlaczego tak się dzieje, że nie s± sprawdzane wszystkie warunki (w pierwotnej wersji) i ja robię jaki¶ bł±d, który jest ciężko znaleĽć czy to wynika jako¶ z mikrokontrolera (i powinienem co¶ doczytać), czy to jest po prostu niewytłumaczalne?:)

    edit2: chyba znalazłem powód
    Code: c
    Log in, to see the code

    Te 3 linijki kodu po prostu bardzo długo trwaj±, no nic, zwiększę taktowanie mikrokontrolera do 168MHz i powinno pomóc.
    My¶lę, że temat można by było zamkn±ć ale dalej mnie to nurtuje, dlaczego pierwotna wersja nie działa. Program cały czas rozbudowuję, będzie jeszcze wysyłanie wszystkiego do karty pamięci, konfigurowanie przez SPI modułu radiowego, wysyłanie przez USART danych do modułu, odbieranie danych z GPS'a i czujników ci¶nienia, algorytm autopilota i sterowanie kilkunastoma serwami modelarskimi po PWMie, dlatego chciałbym wiedzieć gdzie robię błędy, żeby w przyszło¶ci tego unikn±ć, z góry dziękuję za pomoc
  • User removed account  
  • Level 11  
    No wiem wiem.. głupi bł±d:) Po prostu nie spodziewałem się, że te asin a atan s± takie pracochłonne. Dzięki wszystkim za pomoc i pozdawiam:)