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



Teraz jest 29 mar 2024, o 10:10


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: 369
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: 147
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: 1079
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 ]
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 ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Składnia: [ Pobierz ] [ Ukryj ]
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: 369
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: 369
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: 369
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 ]
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 3 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