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



Teraz jest 21 mar 2026, o 05:20


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 
Autor Wiadomość
PostNapisane: 27 sty 2017, o 08:58 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 kwi 2015
Posty: 450
Pomógł: 3

Witam!

Mam pewien problem z wykonaniem kilku instrukcji po kolei, nieblokująco (timer programowy – 10ms), ale w szczególnej sytuacji. W programie głównym, w pętli while, wywoływane jest zdarzenie od okładu RTC RTC_EVENT(). W zdarzeniu tym w rytm sygnału z RTC co 1 sekundę pobierany jest z niego czas i gdy sekundy są zerowe (co minutę) następuje uruchomienie funkcji (funkcja_send) wysyłającej dane przez uart. Problem w tym, że przed właściwym wysłaniem danych (funkcja_send) chciałbym wysłać do uart serię poleceń w odstępach np. 1000, 200, 300ms. Gdyby funkcja_send była w pętli while problemu by nie było. Proszę o pomoc i wskazówki. W kodzie wygląda to tak:

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.


Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sty 2017, o 10:15 
Offline
Użytkownik

Dołączył(a): 08 mar 2015
Posty: 60
Pomógł: 5

Dlaczego nie możesz umieścić w pętli while()? Wystarczy, że zamiast wysyłania w RTC_EVENT() ustawisz jakąś zmienną pomocniczą, a w pętli while() sprawdzisz warunek na podstawie tej zmiennej. Co do odstępu czasowego to odsyłam do poradnika MODULO na YT, który przygotował Pan Mirosław.

BTW. Zachęcam do zakupu YELLOWBOOKA, bo tam jest pięknie opisana realizacja timerów sprzętowych oraz timeoutów z wykorzystaniem struktur i jednego przerwania sprzętowego, oczywiście w sposób nieblokujący. ;)

_________________
Http://anonimg3.comxa.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sty 2017, o 11:16 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 kwi 2015
Posty: 450
Pomógł: 3

anonimg3 napisał(a):
Dlaczego nie możesz umieścić w pętli while()? Wystarczy, że zamiast wysyłania w RTC_EVENT() ustawisz jakąś zmienną pomocniczą, a w pętli while() sprawdzisz warunek na podstawie tej zmiennej.

Dziękuję. Jest to kwestia organizacji dużego programu. Myślałem żeby zrobić tak:

1. W ciele RTC_EVENT(), jak w pierwszym poscie, przed funkcją send umieścić funkcję inicjalizacja
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

2. Funkcję inicjalizacja umieścić w pętli while
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

3. W ciele funkcji inicjalizacja zawrzeć timer programowy z licznikiem, który będzie odmierzał zadane odstępy czasu, przy konkretnej wartości licznika funkcja się zakończy i powróci do miejsca wywołania w RTC_EVENT() i w następnej kolejności uruchomiona zostanie funkcja send
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Czy założenia tego pomysłu są poprawne?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sty 2017, o 11:31 
Offline
Użytkownik

Dołączył(a): 08 mar 2015
Posty: 60
Pomógł: 5

Po pierwsze nie wiem czemu funkcja inicjalizacja() jest w while() oraz RTC_EVENT(). Po drugie ciężko powiedzieć, bo nie ma całego kodu a jedynie fragmenty. Nie lepiej wrzucić do uC i sprawdzić, czy działa? ;)

_________________
Http://anonimg3.comxa.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sty 2017, o 11:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 kwi 2015
Posty: 450
Pomógł: 3

anonimg3 napisał(a):
Nie lepiej wrzucić do uC i sprawdzić, czy działa?

Wrzucę i sprawdzę



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sty 2017, o 11:56 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Możesz zaimplementować wewnątrz funkcji prosty automat skończony (ang. finite state machine).

W tej chwili nie mam czasu, a trudno to opisać na szybko w kilku słowach, więc może późniejszym popołudniem/wieczorem pokażę jakiś przykładowy kod, jeśli problem nie zostanie jeszcze rozwiązany.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sty 2017, o 12:20 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 kwi 2015
Posty: 450
Pomógł: 3

andrews napisał(a):
Możesz zaimplementować wewnątrz funkcji prosty automat skończony (ang. finite state machine).

W tej chwili nie mam czasu, a trudno to opisać na szybko w kilku słowach, więc może późniejszym popołudniem/wieczorem pokażę jakiś przykładowy kod, jeśli problem nie zostanie jeszcze rozwiązany.


Bardzo dziękuję. Poszukam. Będę wdzięczny za przykład w miarę wolnego czasu. Mój "automat" jest nieskończony bo timer programowy działa non-stop .
Pozdrawiam

------------------------ [ Dodano po: 22 minutach ]

Zrobiłem tak:
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: 27 sty 2017, o 18:01 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Przedstawię jak mniej więcej jak ja bym to widział. Nie będzie to kod gotowy do skopiowania i skompilowania, ale taki "zarys" (objaśnienia w kodzie - w razie niejasności postaram się wyjaśnić):

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


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sty 2017, o 18:51 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 kwi 2015
Posty: 450
Pomógł: 3

andrews napisał(a):
Przedstawię jak mniej więcej jak ja bym to widział. Nie będzie to kod gotowy do skopiowania i skompilowania, ale taki "zarys" (objaśnienia w kodzie - w razie niejasności postaram się wyjaśnić):

Bardzo dziękuję! Przeanalizuję kod i w razie niejasności i wątpliwości poproszę o wyjaśnienie. Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sty 2017, o 10:43 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Chciałbym jeszcze dodać, że koncentrowałem się tutaj bardziej na pokazaniu implementacji maszyny stanów, niż na precyzyjnym odmierzaniu czasu. Świadomie ustaliłem interwał inkrementacji zmiennej timestamp na 10ms, aby podczas odliczania 1000ms jej wartość nie przekroczyła 256, czyli pojemności typu uint8_t (1 bajtu).

Chodziło mi o to, żeby nie komplikować niepotrzebnie kodu, ponieważ zmienne kilkubajtowe modyfikowane w przerwaniu wymagają w pętli głównej programu atomowego dostępu, co oznacza, że podczas każdego ich użycia należy wyłączać globalną flagę zezwalającą na przerwania (czy też użyć np. makra ATOMIC_BLOCK).

W związku z powyższym mój kod może powodować pewne niedokładności rzędu jednego okresu obiegu timera, czyli 10ms. Jeśli jest to problemem, można zmniejszyć okres do 1ms i użyć zmiennej timestamp typu uint16_t, pamiętając o wyłączaniu przerwań w odpowiednich miejscach.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sty 2017, o 11:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 kwi 2015
Posty: 450
Pomógł: 3

Bardzo dziękuję. Spróbuję ten automat zaimplementować w kodzie programu i poproszę o sprawdzenie.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 5 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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO