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



Teraz jest 7 kwi 2026, o 22:45


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 
Autor Wiadomość
PostNapisane: 15 sie 2013, o 12:42 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

witam

Piszę sobie taki program, generalnie jest pozbawiony jakiejś użyteczności, ale stanowi próbę połączenia działania kilku wątków w sposób nie blokujący, oraz wprowadzania ustawień i zapisu ich do eeprom.
Oczywiście używa timerów programowych sterowanych przez przerwanie COMPARE dla OCR0 w trybie CTC.
Piszę go metodą "po kawałku" czyli uruchomiłem na razie same procesy "nieblokujące" którymi jest miganie diodami led z różną częstotliwością.
Następnie wprowdziałem zmienną "mode" która może przyjmować 3 wartości (odczyt, ustawienia1, ustawienia2). Wartość zmiennej mode jest zmieniana przyciskiem od 0 do 3, po osiągnięciu 3 jest zmieniana z powrotem na 0.
W pętli while jest sprawdzana wartość mode i wykonywane są odpowiednie czynności. Część tego widać w załączonym kodzie. Nie wklejam na razie całego kodu, żeby nie śmiecić :P Ale oczywiście mogę wkleić.

Problem polega na tym, że gdy zmienna mode z powrotem zmieni się na wartość domyślna (taką jak po resecie) czyli 0 to efekt jest taki jakby timery programowe się zatrzymywały. Pierwsza sekwencja zmiany wartości mode działa dobrze, ale powrót do początku już nie.

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


Wartości podawane do funkcji ledX_blink są to wartości porównania dla timerów programowych.

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


W czym może być tu problem??



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 sie 2013, o 12:53 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Antystatyczny napisał(a):
if(++mode > 3) mode = 0;


To samo...
Dodam jeszcze, że zaraz po wywołaniach funkcji migania diodami, wywołane są funkcje obsługi lcd.
I te funkcje działają, tzn widać, że zmienna mode wraca do wartości 0.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 sie 2013, o 13:08 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 sie 2013
Posty: 230
Lokalizacja: Zabrze
Pomógł: 17

Antystatyczny w warunku ma >2 a nie >3.

Poza tym:
Piszesz, że mode może mieć 3 wartości, a twoja funkcja mode_set() pozwala na przyjmowanie wartości od 0 do 3 (czyli czterech wartości), gdyż jeśli mode==2 wykonywane jest to co po else, czyli mode wyniesie 3. Zmień w niej warunek mode==3 na mode==2; uzyskasz wtedy efekt jaki daje też propozycja Antystatycznego.

_________________
40-32:2=4!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 sie 2013, o 13:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Ilość wartości zmiennej mode to sprawa w sumie nieistotna. Zmienna wraca ostatecznie do wartości 0. Warunek pierwszy w pętli while zostaje spełniony, na LCD pokazuje się wartość zmiennej mode czyli 0, jednak diody już nie migają. Tak jakby zawieszają się na jednym stanie i tak pozostaje aż do resetu proca.

------------------------ [ Dodano po: 3 minutach ]

Same funkcje do diod, zmiennej mode czy sprawdzania warunków są banalne, wkleję cały 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: 15 sie 2013, o 20:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Po wielu próbach zmian, niejednokrotnie uważam, że bezsensownych bo funkcje są banalne i nie bardzo mają mieć gdzie jakiś "haczyk", nadal nie mam pojęcia o co może chodzić.
Pozwoliłem więc sobie napisać króciutki programik wypisujący po kolei zawartość komórek pamięci RAM. Oczywiście przed uruchomieniem odcinam na jakiś czas zasilanie to MCU (pamieć RAM to static). I żeby było ciekawie w całej pamięci rezydują jakieś wartości. Spodziewałem się, że powyżej powiedzmy 0x200 będzie stało 0 albo ff a tu niespodzianka.

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: 17 sie 2013, o 01:17 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Już wyszło szydło z wora. Chodziło o to, że przy spełnieniu warunku wykonywała się funkcja która zerowała timer.
Gdy warunek nie był spełniony timer się nie zerował tylko liczył dalej, jako że był 16 bitowy musiał doliczyć do 65535 aby się wyzerować samoczynnie.
Gdybym poczekał 655 sekund to by z powrotem ruszyło :D

Dodałem zerowanie timerów do funkcji przełączającej tryby.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 wrz 2013, o 21:02 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 kwi 2012
Posty: 195
Pomógł: 0

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

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

??
Może dziwne pytanie bo wiem że kod działa ....



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 wrz 2013, o 21:27 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Z tego co wiem, nie musi... Przynjajmniej jeśli jest tylko jeden. Ale może niech się ktoś bardziej obczajony w C wypowie :P



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 6 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