Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 8 cze 2025, o 14:14


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 22 ] 
    Autor Wiadomość
    PostNapisane: 28 maja 2018, o 10:41 
    Offline
    Użytkownik

    Dołączył(a): 31 mar 2017
    Posty: 156
    Pomógł: 0

    Mam kłopot z użyciem timera do przerwania na płytce Nucleo z użyciem bibliotek SPL.

    Program w ogóle nie "wchodzi" do funkcji obsługującej przerwanie TIM5_IRQHandler(). Co dziwne, nie wykonuje w ogóle nic, co znajduje się w kodzie poniżej ustawień NVIC. Wrzucam kod, proszę o pomoc/uwagi.

    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Początkowo używałem:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    ale też nie działało.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 maja 2018, o 11:26 
    Offline
    Użytkownik

    Dołączył(a): 22 sty 2014
    Posty: 1806
    Zbananowany użytkownik

    Pomógł: 168

    Obrazek



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 maja 2018, o 11:35 
    Offline
    Użytkownik

    Dołączył(a): 31 mar 2017
    Posty: 156
    Pomógł: 0

    A co dokładnie oznacza ten "pending state"? Timer odlicza, czy nie? A jeśli odlicza, to dlaczego kod przerwania się nie wykonuje?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 maja 2018, o 12:20 
    Offline
    Użytkownik

    Dołączył(a): 22 sty 2014
    Posty: 1806
    Zbananowany użytkownik

    Pomógł: 168

    chodzi o wyczyszczenie flagi od przerwania zanim je włączysz



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 maja 2018, o 12:28 
    Offline
    Użytkownik

    Dołączył(a): 31 mar 2017
    Posty: 156
    Pomógł: 0

    Hmmm...
    Jeśli daję
    TIM_ClearITPendingBit(TIM5, TIM_IT_Update);
    to w działaniu nic się nie zmienia. O to chodzi?

    W trybie debug robiąc step over, program zatrzymuje się na linii NVIC_Init(&nvic).

    Edit:
    Dodałem jeszcze
    TIM_ClearITPendingBit(TIM5, TIM_IT_Update);
    TIM_UpdateRequestConfig(TIM5, TIM_UpdateSource_Regular);
    i program idzie dalej, ale do przerwania nie wchodzi.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 maja 2018, o 18:37 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 15 lut 2017
    Posty: 368
    Lokalizacja: Gliwice
    Pomógł: 34

    U mnie Twój przykład poszedł od strzała, tzn "wchodzi" do obsługi przerwania, a dołożyłem jedynie swoją obsługę leda.
    STM32F411CEUx na płytce Kamami Nucleo.
    Oczywiście wersja z kasowaniem flagi przerwania.

    Musisz mieć problem gdzieś indziej, niż w tym kodzie.
    Sprawdzałeś efekt na debugerze, czy tylko badasz na pinie?

    Czy masz poprawnie zdefiniowane wektory przerwań?
    Szczególnie stare STDPeriph library nie miały wszystkich wektorów zdefiniowanych na starcie. lub tylko dla konkretnego procka..
    U mnie jest to plik ${ProjDirPath}/startup/startup_stm32f411xe.s
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język asm
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Widać wyraźnie, że mamy tablicę konkretnych wektorów, również ten który potrzebujemy: TIM5_IRQHandler.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 maja 2018, o 08:13 
    Offline
    Użytkownik

    Dołączył(a): 31 mar 2017
    Posty: 156
    Pomógł: 0

    U mnie jest tylko plik startup_stm32.s i jest bardzo ubogi:
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    Co mogę z tym zrobić? Poszukać odpowiedniego pliku i go wkleić?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 maja 2018, o 08:25 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 15 lut 2017
    Posty: 368
    Lokalizacja: Gliwice
    Pomógł: 34

    radek04 napisał(a):
    U mnie jest tylko plik startup_stm32.s i jest bardzo ubogi:

    Najwyższa pora ściągnąć CubeMX tam będziesz miał właściwe pliki.
    Wystarczy podmienić ten plik co to podałeś. Gdy będę przed kompem to mogę wskazać odpowiedni.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 maja 2018, o 08:37 
    Offline
    Użytkownik

    Dołączył(a): 31 mar 2017
    Posty: 156
    Pomógł: 0

    Dziękuję.
    Niestety niedługo muszę skończyć swój projekt i już nie pora na zmiana bibliotek. Muszę zakończyć z wykorzystaniem SPL. Rozumiem, że w pakiecie z CubeMX znajdę odpowiedni plik, który będę mógł podmienić/dodać?

    Edit:
    Z Twojego pliku skopiowałem linijki, które dotyczyły Tim5, ale projekt się nie kompiluje. Po zamianie całych plików też się nie kompilowało.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 maja 2018, o 09:10 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 15 lut 2017
    Posty: 368
    Lokalizacja: Gliwice
    Pomógł: 34

    Podaj jakie są błędy. Mogę Ci podesłać cały mój projekt do eclipse z dzialajacym timerem. Reszte sobie przepiszesz. Będzie to projekt w System Workbench. Na razie do atolica nie mam dostepu. Bedzie wieczorem.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 maja 2018, o 09:20 
    Offline
    Użytkownik

    Dołączył(a): 31 mar 2017
    Posty: 156
    Pomógł: 0

    W linii .word 0Ftim5 jest błąd "floating point number invalid startup_stm32.s".
    Po jej usunięciu program (while) wykonuje się do czasu ustawionego w timerze, a dalej nic się nie dzieje. Czyli tak, jakby do przerwania dochodziło, ale nie jest oo obsługiwane poprawnie.
    Chociaż czas jest jakby 2x za krótki. Mam szynę APB1 50MHz, preskaler 50000 oraz odliczanie do 10000, więc teoretycznie 10s, a while działa 5s. Gdy odliczanie zwiększyłem do 20000, działa 10s.
    Czy źle coś rozumiem i preskaler ustawiam względem zegara głównego 100MHz?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 maja 2018, o 10:58 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 15 lut 2017
    Posty: 368
    Lokalizacja: Gliwice
    Pomógł: 34

    No nie to tak łatwo nie pójdzie :)
    Masz mocno stare biblioteki, a jest kilka zależności między różnymi plikami.
    Musisz ze sobą skorelować dwa pliki:
    stm32f4xx.h
    startup_stm32.s


    W tym pierwszym masz numery wektorów (typedef enum IRQn), które muszą się zgadzać z tymi w pliku asm, ale w tym drugim nie masz jawnie numerów wektorów pokazanych. Da się to policzyć.
    Składnia: [ Pobierz ] [ Ukryj ]
    język asm
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    odpowiada
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Twój szukany wektor to:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    Oczywiście jeszcze lepiej numer wektora znaleźć w reference manual.
    zatem należy na odpowiedniej pozycji wpisać nazwę wektora. Uzupełniony plik wygląda (mam nadzieję, że się nie pomyliłem, ale w razie czego sam policz) jak niżej, linia nr 68 na listingu.:

    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język asm
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



    Plik asemblerowy chyba też trzeba uzupełnić o wpis:
    Składnia: [ Pobierz ] [ Ukryj ]
    język asm
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    dokładne miejsce to powinieneś już sam znaleźć :)

    Oczywiście to jeszcze nie wszystko. Uchwyt (handler) musi być zadeklarowany.
    Musisz gdzieś umieścić deklarację:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Możesz to zrobić w pliku main.c albo gdziekolwiek. Ja mam dedykowany plik na uchwyty.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 maja 2018, o 12:25 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 15 lut 2017
    Posty: 368
    Lokalizacja: Gliwice
    Pomógł: 34

    radek04 napisał(a):
    Po jej usunięciu program (while) wykonuje się do czasu ustawionego w timerze, a dalej nic się nie dzieje. Czyli tak, jakby do przerwania dochodziło, ale nie jest oo obsługiwane poprawnie.
    Chociaż czas jest jakby 2x za krótki. Mam szynę APB1 50MHz, preskaler 50000 oraz odliczanie do 10000, więc teoretycznie 10s, a while działa 5s. Gdy odliczanie zwiększyłem do 20000, działa 10s.
    Czy źle coś rozumiem i preskaler ustawiam względem zegara głównego 100MHz?


    Musisz sobie odpowiedzieć na pytanie: jak sprawdzić częstotliwość zegara głównego?
    Pewną podpowiedzią będzie ten wątek:
    https://www.elektroda.pl/rtvforum/viewt ... 2#17229822
    Podpowiedzią będzie rozdział:
    "IV. Analizujemy przydatne na początek pliki: "

    Wg danych które podałeś to masz
    50 MHz/50000/10000 = 0,1 Hz i faktycznie, by to odpowiadało 10 s.
    Prawdopodobnie jednak masz źle ustawiony procesor.
    W wątku, który podałem masz opis zmiennych, które trzeba przejrzeć.
    Może masz źle ustawione HSI_VALUE albo HSE_VALUE.

    Gdy testowałem u siebie to przy zegarze 96 MHz miałem dla wartości początkowych z wątku.
    96 MHz/50000/1000 = 1.92 Hz i faktycznie dioda migała co pół sekundy.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 maja 2018, o 12:31 
    Offline
    Użytkownik

    Dołączył(a): 31 mar 2017
    Posty: 156
    Pomógł: 0

    Płytka ma zegar 100MHz, ale wg dokumentacji APB1 to 50MHz (lub max. 50Mhz może mieć). Preskaler dotyczy zegara systemowego? Jeśli tak, to pasuje, bo jest 100MHz.
    Dziękuję bardzo za pomoc. Będę testował.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 maja 2018, o 12:36 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 15 lut 2017
    Posty: 368
    Lokalizacja: Gliwice
    Pomógł: 34

    radek04 napisał(a):
    Płytka ma zegar 100MHz, ale wg dokumentacji APB1 to 50MHz (lub max. 50Mhz może mieć). Preskaler dotyczy zegara systemowego? Jeśli tak, to pasuje, bo jest 100MHz.
    Dziękuję bardzo za pomoc. Będę testował.

    Chyba jednak nie do końca.
    Zegar domyślnie nie jest ustawiany z pełną prędkością, ani szyny.
    Timer również może mieć różne taktowania.
    Wszystko co sobie zażyczy programista.
    Niestety nie mamy wiedzy jak ustawiasz taktowanie procka i parametry systemu.
    Chodzi mi, że "płytka ma zegar 100 MHz" jest mało precyzyjne :)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 maja 2018, o 14:32 
    Offline
    Użytkownik

    Dołączył(a): 31 mar 2017
    Posty: 156
    Pomógł: 0

    Szybkość później. Najpierw rzeczy najważniejsze :)
    Nie wiem, czy dobrze rozumiem. Linię .word EXTI4_IRQHandler mam wpisać w 10. wierszu g_pfnVectors, a .word TIM5_IRQHandler w 50.?
    Czy też po prostu muszą tam być, niezależnie od miejsca? Ty dałeś na 68. To ma znaczenie?
    Czy muszę modyfikować plik stm32f4xx.h?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 maja 2018, o 15:57 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 15 lut 2017
    Posty: 368
    Lokalizacja: Gliwice
    Pomógł: 34

    radek04 napisał(a):
    Nie wiem, czy dobrze rozumiem. Linię .word EXTI4_IRQHandler mam wpisać w 10. wierszu g_pfnVectors, a .word TIM5_IRQHandler w 50.?

    Nie, linia z EXTI4 to był przykład. Jak jej tam nie masz, a nie korzystasz z EXTI4 to nic nie rób.
    Ważne by w odpowiednie miejsce dać TIM5_IRQHandler .

    radek04 napisał(a):
    Czy też po prostu muszą tam być, niezależnie od miejsca? Ty dałeś na 68. To ma znaczenie?

    Dokładnie tak to zrób.

    radek04 napisał(a):
    Czy muszę modyfikować plik stm32f4xx.h?

    Tak. Najlepiej go wykorzystać do wpisania deklaracji o której pisałem w poprzednim wątku.
    void TIM5_IRQHandler(void);



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 maja 2018, o 21:13 
    Offline
    Użytkownik

    Dołączył(a): 31 mar 2017
    Posty: 156
    Pomógł: 0

    Coś chyba robię źle. Mam mnóstwo błędów.
    Powinienem wkleić tylko tę jedną linijkę
    .word TIM5_IRQHandler w 68. linii oraz
    .weak TIM5_IRQHandler
    .thumb_set TIM5_IRQHandler,Default_Handler w dowolnym miejscu
    pliku sturtup_stm32.s, a także void TIM5_IRQHandler(void) w pliku stm32f4xx.h?

    Przepraszam, że tak głupio pytam, ale już nie chcę nic sam kombinować, bo nie wychodzi.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 maja 2018, o 21:39 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 15 lut 2017
    Posty: 368
    Lokalizacja: Gliwice
    Pomógł: 34

    radek04 napisał(a):
    Coś chyba robię źle. Mam mnóstwo błędów.
    Powinienem wkleić tylko tę jedną linijkę
    .word TIM5_IRQHandler w 68. linii

    Tak, dokładnie w tej linii.
    Obrazek

    Na pozycjach obok, 67 i 69 to nie wiem co masz, tych linii nie ruszaj.

    radek04 napisał(a):
    oraz
    .weak TIM5_IRQHandler
    .thumb_set TIM5_IRQHandler,Default_Handler w dowolnym miejscu
    pliku sturtup_stm32.s,

    Może być na końcu pliku.

    radek04 napisał(a):
    a także void TIM5_IRQHandler(void) w pliku stm32f4xx.h?

    Dokładnie tu.


    Autor postu otrzymał pochwałę


    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 30 maja 2018, o 07:29 
    Offline
    Użytkownik

    Dołączył(a): 31 mar 2017
    Posty: 156
    Pomógł: 0

    Działa. Jesteś wielki. Bardzo dziękuję za pomoc, a przede wszystkim cierpliwość.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 30 maja 2018, o 09:39 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 15 lut 2017
    Posty: 368
    Lokalizacja: Gliwice
    Pomógł: 34

    Napisz zatem jakieś podsumowanie, tak by inni czytający mieli pewność co faktycznie pomogło.
    W ten sposób wątek będzie bardziej pomocny.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 cze 2018, o 12:33 
    Offline
    Użytkownik

    Dołączył(a): 31 mar 2017
    Posty: 156
    Pomógł: 0

    Aby użyć przerwania od timera - dla przykładu TIM5 - na płytce STM32F4 Nucleo z wykorzystaniem SPL należy zmodyfikować następujące pliki:
    -sturtup_stm32.s: jako 67. g_pfnVectors wpisać (edytować, nie dodawać) .word TIM5_IRQHandler oraz
    .weak TIM5_IRQHandler
    .thumb_set TIM5_IRQHandler,Default_Handler w dowolnym miejscu tego pliku;
    -stm32f4xx.h: void TIM5_IRQHandler(void) w dowolnym miejscu.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 22 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


    Nie możesz rozpoczynać nowych wątków
    Nie możesz odpowiadać w wątkach
    Nie możesz edytować swoich postów
    Nie możesz usuwać swoich postów
    Nie możesz dodawać załączników

    Szukaj:
    Skocz do:  
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO