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:36


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 
    Autor Wiadomość
    PostNapisane: 28 kwi 2020, o 16:41 
    Offline
    Użytkownik

    Dołączył(a): 06 sie 2019
    Posty: 47
    Pomógł: 0

    Witam. Mam problem z odmierzaniem czasu w programie uC (STM32 rejestry). W jaki sposób wykonać prosty timer nierobiący nic poza czekaniem ten czas który mu zadam typu AVR - delay_ms(jakis_czas). Potrzebuje używać tego timera zarówno w main.c jak i bibliotekach. Myślałem nad SysTickiem tylko nwm jak mogę go wykożystać, aby działał mi we wszystkich bibliotekach.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 kwi 2020, o 17:42 
    Offline
    Użytkownik
    Avatar użytkownika

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

    Robię to tak:
    1. Ustawiam Systick na przerwanie co 1 ms:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    48000000 to oczywiście częstotliwość uK, a potrzebne są standardowe nagłówki z CMSIS.
    Mam więc uruchomiony silnik timerów programowych, podobnie jak w bluebook.
    W przerwaniu od Systicka może być np taki kod:
    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 trzba wyprowadzić funkcj na zewnątrz:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Po takim przygotowaniu mamy funkcję blokującą delay_ms() oraz dwie zmienne, softTimer1, softTimer2 do opóźnień nieblokujących.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 kwi 2020, o 18:04 
    Offline
    Użytkownik

    Dołączył(a): 06 sie 2019
    Posty: 47
    Pomógł: 0

    Zealota napisał(a):
    Robię to tak:
    1. Ustawiam Systick na przerwanie co 1 ms:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    48000000 to oczywiście częstotliwość uK, a potrzebne są standardowe nagłówki z CMSIS.
    Mam więc uruchomiony silnik timerów programowych, podobnie jak w bluebook.

    Dlaczego jak dzielisz 48Mhz / 1000 to wychodzi ci 1ms? Mi wychodzi co 1ms jak podzielisz 48MHz/48000. Jak coś źle napisałem to prosze mnie poprawić.

    W jakim celu są te softtime. Jak one działają?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 kwi 2020, o 19:21 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 29 lis 2019
    Posty: 145
    Pomógł: 37

    Zealota napisał(a):
    ...
    register uint16_t n;
    n = softTimer1; if (n) softTimer1 = --n;


    Użycie zmiennej pośredniej jest w przypadku Cortexów niepotrzebne.
    W przypadku AVR obecnie też.

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


    Albo bardziej cywilizowanie

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

    _________________
    Think for yourself and question authority.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 kwi 2020, o 07:48 
    Offline
    Użytkownik

    Dołączył(a): 23 sty 2014
    Posty: 1085
    Pomógł: 73

    fofex napisał(a):
    Zealota napisał(a):
    ...
    register uint16_t n;
    n = softTimer1; if (n) softTimer1 = --n;


    Użycie zmiennej pośredniej jest w przypadku Cortexów niepotrzebne.
    W przypadku AVR obecnie też.

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


    Albo bardziej cywilizowanie

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


    Zapomniałeś o volatile przy definicji thatTimerCounter



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 kwi 2020, o 12:27 
    Offline
    Użytkownik

    Dołączył(a): 06 sie 2019
    Posty: 47
    Pomógł: 0

    z czasami rzędu [ms] nie ma problemów, ale jakbym chciał zrobić 1[us] niestety nie działa. Czy trzeba już w takiej sytuacji użyć funkcji asemblerowych?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 kwi 2020, o 14:52 
    Offline
    Użytkownik

    Dołączył(a): 06 sie 2019
    Posty: 47
    Pomógł: 0

    91suoirfeN napisał(a):
    matteo9999111 napisał(a):
    z czasami rzędu [ms] nie ma problemów, ale jakbym chciał zrobić 1[us] niestety nie działa. Czy trzeba już w takiej sytuacji użyć funkcji asemblerowych?


    jeżeli potrzebujesz odmierzać czas w dziesiątkach mikrosekund to kod powyżej jak najbardziej się sprawdzi. Wystarczy bowiem pozwolić kompilatorowi się wykazać i użyć flagi optymalizacji, np. -O2. Należy pamiętać że Cortex-M0 nie należy do najszybszych rdzeni i czasem złomega będzie od niego szybsza w pewnych zastosowaniach. Jest on po prostu znacznie okrojony z instrukcji w porównaniu do M3 czy M4.

    Jeżeli interesują Cie bardziej dokładne opóźnienia to wpisz w google STM32F0 microsecond delay i poczytaj wyniki


    W tym momencie tworzę na rdzeniu Cortex M4 (dokładnie to na uC STM32F411RE ). Zgadza się przy dziesiątkach us daje radę nawet przy taktowaniu fabrycznym 16MHz. Tylko potrzebne są mi czasy np 2us.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 30 kwi 2020, o 11:03 
    Offline
    Użytkownik

    Dołączył(a): 06 sie 2019
    Posty: 47
    Pomógł: 0

    Nie chce zakładać nowego tematu to tutaj zapytam. Wykonałem bibliotekę do wyświetlacza 2x16 (HD44780). Stm nie zmienia wg stanu na wyjściu (sprawdzone oscyloskopem). Wszystkie LCD_Dx_SET/RESET są w rzeczywistości poleceniem GPIOA->BSRR = GPIO_BSRR_BS(BR)x. Nie wiem dlaczego tak jest? Chyba ze polecenie ...BSRR... jest tutaj niepoprawne.

    main.c

    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.

    plik biblioteczny:

    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.


    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.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 30 kwi 2020, o 13:28 
    Offline
    Użytkownik
    Avatar użytkownika

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

    Wg mnie błąd robisz przy włączeniu zegarów.
    Zamiast "|=" dajesz "=" i dlatego w drugiej linii wyłączasz zegar dla portu C oraz inne zegary na tej szynie..

    To pewnie jeszcze nie wszystko, ale nie zajrzę teraz do RM dla F4.
    Zacznij od dobrego poradnika - tzw "poradnika Szczywronka" - znajdziesz w google. Tam masz wszystko prawie na tacy. Jeśli chcesz bliżej się zapoznać z STM32 to jest to konieczne, żebyś korzystał również z literatury.
    Oczywiście jak masz problemy to pytaj na forum, ale wrzucaj nowe watki - to pomoże w przyszłości innym.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 30 kwi 2020, o 18:40 
    Offline
    Użytkownik

    Dołączył(a): 06 sie 2019
    Posty: 47
    Pomógł: 0

    Zealota napisał(a):
    Zacznij od dobrego poradnika - tzw "poradnika Szczywronka" - znajdziesz w google. Tam masz wszystko prawie na tacy. Jeśli chcesz bliżej się zapoznać z STM32 to jest to konieczne, żebyś korzystał również z literatury.
    .


    Polecasz jakąś konkretną książkę do nauki programowania na rejestrach? Odnośnie poradnika Szczywronka to jestem właśnie w trakcie jego przerabiania. Co ciekawe ustawiając 1 na wyjściu PA5 (NUCLEO) również poleceniem GPIOA->BSRR... dioda działa. Postanowiłem wyłączyć sygnał zegarowy dla GPIOA tak samo porty C nie reagują. Wg manuala powinno to działać.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 30 kwi 2020, o 19:12 
    Offline
    Użytkownik
    Avatar użytkownika

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

    Pisząc o literaturze to miałem właśnie na myśli poradnik Szczywronka, bo pod względem pisania na rejestrach jest generalnie posucha :) Mam kilka ogólnie dostępnych książek, ale żadna z nich w tym temacie nie ma wiele do powiedzenia, natomiast "STM32 w systemach sterowania i regulacji" daje trochę wiedzy o asemblerze dla STM32, ale tylko dla F1.
    Z drugiej strony poradnik jest na tyle kompleksowy, że po jego "'przerobieniu" można już iść własną drogą :)

    Co do ustawień rejestrów GPIO to w poradniku jest zgrabna biiblioteka do ich obsługi co oczywiście nie zwalnia od zrozumienia konfiguracji rejestrów, nie mniej jednak zaglądam w tym temacie do RM sporadycznie i zwykle to wystarcza.
    Dobrze jest tez mieć RM do serii F0, tam są przykłady do konfiguracji różnych peryferii właśnie na rejestrach, podobnie jak w notach Atmela.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 30 kwi 2020, o 22:49 
    Offline
    Użytkownik

    Dołączył(a): 06 sie 2019
    Posty: 47
    Pomógł: 0

    To ciekawe że porty C nie reagują. Czy jest możliwe spalenie jakoś tych pinów (wszystkie mają oznaczenia FT) przez wyświetlacz HD44780 i normalne działanie innych? Nie używam większego napięcia niż 5V.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 maja 2020, o 00:33 
    Offline
    Użytkownik
    Avatar użytkownika

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

    Widzę tu jeszcze jednego babola. Zamiast operatora sumy bitowej używasz operatora sumy logicznej, "||" zamiast "|".
    Rejestry BSSR i ODR można używać zamiennie, ale te pierwsze reagują tylko na bit 1, ustawienie odpowiednich pól ustawia lub kasuje właściwy pin i można robić to "atomowo".



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 maja 2020, o 14:08 
    Offline
    Użytkownik

    Dołączył(a): 06 sie 2019
    Posty: 47
    Pomógł: 0

    Zealota napisał(a):
    Widzę tu jeszcze jednego babola. Zamiast operatora sumy bitowej używasz operatora sumy logicznej, "||" zamiast "|".

    I właśnie przez to porty C nie działały teraz jest na nich napięcie. Tylko wyświetlacz dalej nie chce furgać. Ciekawe bo po zmierzeniu oscyloskopem jest nadawany sygnał. Wyswietlacz działa na 100%, bo sprawdzałem go już gdzieś indziej.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 maja 2020, o 18:08 
    Offline
    Użytkownik

    Dołączył(a): 06 sie 2019
    Posty: 47
    Pomógł: 0

    Zauważyłem że dane nie wysyłane są w całości. Nie wiem dlaczego wysyłanych jest tak mało danych. Poniżej zmiana stanów na D4 i D5 przy poleceniu LCD_init(). Znalazłem trochę błędów i poprawiłem:
    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.


    Żółtym D4, Niebieskim D5
    Obrazek

    Żółtym Enable, Niebieskim D4
    Obrazek

    Więcej sygnałów nie zauważyłem. Wygląda to tak jakby SendHalf() działał raz, a potem nie reagował na polecenia.



    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: 15 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

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


    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