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



Teraz jest 23 kwi 2024, o 13:32


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 18 ] 
Autor Wiadomość
PostNapisane: 25 cze 2017, o 20:54 
Offline
Użytkownik

Dołączył(a): 28 maja 2016
Posty: 469
Lokalizacja: Katowice
Pomógł: 1

Mam taką zagwozdkę. Działam na ATB.
Napisałem sobie w programie,że po naciśnięciu klawisza zapalają mi się diody, przechodzą diody jak w typowym robalu, czyli z lewej do prawej. Robal powtarzany jest cztery razy i diody gasną. wszystko trwa około 3 sekund. Zrobiłem obsługę klawisza i po naciśnięciu, robal jest uruchamiany. Wszystko działa z delajami, więc program jest blokujący się. Ale działa według moich założeń.
Następnie uruchomiłem sobie timer, w którym mrygam jedną diodą(niezależnie od pętli głównej), którą pożyczyłem sobie z wyświetlacza 7-mio segmentowego i chcę, aby ta dioda z timera mrygałą mi tylko i wyłącznie podczas momentu, gdy wykonuje się cztery razy robal w pętli głównej, następnie ma zgasnąć. I z tym mam problem.

W timerze napisałem sobie obsługę klawisza, tego samego co w pętli głównej i gdy go naciskam, to dioda przestaje migać i świeci ciągle. Gdy puszczę klawisz, to dioda znów zaczyna mrygać z timera

Myślałem, aby powołać zmienną o wartości 1.

Na mój chłopski rozum po naciśnięciu klawisza w pętli głównej powinienem zamieścić tą zmienną z wartością =1, gdy robal wykona się cztery razy, zeruję tą zmienną. Ale to tak nie chce działać.

proszę o podpowiedź.

_________________
Nikt nie mówił,że będzie łatwo...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 cze 2017, o 21:12 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1021
Lokalizacja: Trójmiasto
Pomógł: 188

Bez zobaczenia kodu który naskrobałeś trudno będzie cokolwiek pomóc.
Czy pod pojęciem uruchomienia timera i mrugania w nim diodą rozumiesz timer sprzętowy i mruganie diodą w przerwaniu od niego?
Jeśli tak to pomysł z dodatkową zmienną jest jak najbardziej prawidłowy (potocznie taką zmienną się nazywa flagą), tylko taka zmienna musi być globalna (bądź typu static) i opatrzona dopiskiem volatile...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 cze 2017, o 21:19 
Offline
Użytkownik

Dołączył(a): 28 maja 2016
Posty: 469
Lokalizacja: Katowice
Pomógł: 1

to o co pytam jest częścią kodu, ale już udotępniam kodzik. Jestem początkujący, więc proszę o wyrozumiałość, ponieważ zdaję sobie sprawę,że wiele rzeczy można by napisać w mniej liniowy sposób. Ja jednak dopiero się uczę :)
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


------------------------ [ Dodano po: kilkunastu sekundach ]

nie oczekuję gotowego rozwiązania, tylko podpowiedzi, w którą stronę mam pójść. :)

_________________
Nikt nie mówił,że będzie łatwo...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 cze 2017, o 21:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1021
Lokalizacja: Trójmiasto
Pomógł: 188

No to jak na osobę początkującą to zmajstrowałeś potężny kawał kodu ;)
Jeszcze mógłbyś wskazać o którą konkretnie diodę chodzi bo analizować taki kod to nie wiem czy ktokolwiek się podejmie...
Tak czy siak jedno co kłuje w oczy to znacznych rozmiarów procedura obsługi przerwania, a przy przerwaniach trzeba się starać by trwało ono jak najkrócej...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 cze 2017, o 21:42 
Offline
Użytkownik

Dołączył(a): 28 maja 2016
Posty: 469
Lokalizacja: Katowice
Pomógł: 1

co do przerwania, to chodzi o to, aby było jak naj mniej tekstu pisanego? w późniejszym czasie zamięnię w przerwaniu na modulo.
a chodzi mi o trzy diody
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



każda dioda ma być przypisana do jednego z klawisza
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



na wstępie zapytałem o jeden klawisz i jedną diodę.
Ale chodzi mi o to, że gdy nacisnę klawisz pierwszy,to ma mi mrygać z timera dioda pierwsza i ma tak długo mrygać, aż się wykona cała funkcja z pierwszego klawisza. Analogicznie będzie z druga diodą i drugim klawiszem, oraz z trzecią diodą i trzecim klawiszem.
Z tym mam właśnie kłopot.

z częścią kodu pomagał mi Daro69. Głównie pomagał z obsługą serwa, bo z tym też było ciężko.



Po kolejnym zastanowieniu myślę sobie,że może tutaj powinienem tą zmienną przypisać? w tej części kodu?
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
Nikt nie mówił,że będzie łatwo...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 cze 2017, o 21:59 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 sie 2015
Posty: 205
Lokalizacja: UK
Pomógł: 10

wojciechgorzolka napisał(a):
co do przerwania, to chodzi o to, aby było jak naj mniej tekstu pisanego?

Nie do końca, chodzi o to, aby wykonywać jak najmniejszą liczbę operacji. Zmiana stanu wyjścia i sprawdzanie takiej ilości ifów zajmuje sporo czasu i może zablokować w pewnym momencie program, gdyż "nie będzie się on po prostu ze wszystkim wyrabiał".

wojciechgorzolka napisał(a):
#define LED_1_PIN (1<<PC0)
#define LED_2_PIN (1<<PC1)
#define LED_3_PIN (1<<PC2)
#define LED_4_PIN (1<<PC3) // diody 8szt.
#define LED_5_PIN (1<<PC4)
#define LED_6_PIN (1<<PC5)
#define LED_7_PIN (1<<PC6)
#define LED_8_PIN (1<<PC7)


A propos robala, zauważyłem, że wszystkie diody masz podłączone do tego samego portu. Żeby uzyskać prosty efekt migania wystarczy, że zastosujesz przesunięcie bitowe (np. w przerwaniu). Z każdym przerwaniem możesz przesuwać logiczne 1 w prawo. Jeżeli oczywiście o taki efekt ci chodzi ;)

Dobrze jest to wyjaśnione w tym poradniku mirka:
https://www.youtube.com/watch?v=tIS1LX6if3E

Pozdrawiam, :)
Michał


Autor postu otrzymał pochwałę

_________________
MMT Technologies



Ostatnio edytowano 25 cze 2017, o 22:03 przez Makowka, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 cze 2017, o 22:03 
Offline
Użytkownik

Dołączył(a): 28 maja 2016
Posty: 469
Lokalizacja: Katowice
Pomógł: 1

ok, postaram się nad dym pochylić. i to poprawię w miarę własnych możliwości :)
Wiele rzeczy jest tam jeszcze do poprawy, ale na tą chwilę nie mogę sobie poradzić z tym problemem, o który pytam na początku.

_________________
Nikt nie mówił,że będzie łatwo...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 cze 2017, o 22:08 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

hejka, :)
Ale tasiemiec już powstał. ;D
Wojtku, gdyby udało się Tobie ogarnąć wszystko na timerach, to nie musiał byś wciskać takich ilości poleceń do przerwania. ;)
A tak jeżeli chcesz by wraz z wykonującą się jakąś funkcją zawierającą delaye wykonało się równorzędnie inne mryganie, to trzeba by wcisnąć to mryganie pomiędzy wiersze tej funkcji - albo zapchać przerwanie :).
A jak dojdzie coś jeszcze to co wtedy zapchamy. :?
Lepiej pomęcz timery bo jeszcze parę pomysłów tam upchniesz i i może zacząć się blokować.
:)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 cze 2017, o 22:13 
Offline
Użytkownik

Dołączył(a): 28 maja 2016
Posty: 469
Lokalizacja: Katowice
Pomógł: 1

to już jest ostatnia rzecz, która będzie w tym programie.

------------------------ [ Dodano po: 41 minutach ]

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

_________________
Nikt nie mówił,że będzie łatwo...



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

Dołączył(a): 23 paź 2014
Posty: 1021
Lokalizacja: Trójmiasto
Pomógł: 188

wojciechgorzolka napisał(a):
co do przerwania, to chodzi o to, aby było jak naj mniej tekstu pisanego?
Niezupełnie, na podstawie kodu pisanego w C jest generowany plik *.asm w którym są instrukcje asemblerowe dla procesora, trzeba odnaleźć sekcję przerwania i sprawdzić ile instrukcji asemblerowych zawiera dane przerwanie (w bluebooku masz to opisane w rozdzielne o sterowaniu PWM (kolorowa dioda RGB)). Większości instrukcji wykonuje się w jednym takcie zegara więc stosunkowo łatwo można policzyć czas wykonywania przerwania. A nie może on być zbyt długi bo jeśli będzie a przerwanie będzie wywoływane częściej niż zdąża się wykonywać wówczas podczas trwania przerwania zostanie zgłoszone już kolejne, co będzie skutkować tym że jak w końcu skończy się wykonywać, wróci do programu głównego wykona jeden rozkaz i jako że było międzyczasie kolejne zgłoszenie przerwania to znów zacznie się ono wykonywać. W rezultacie raz że same wywołania przerwania mogą się pogubić (podczas wykonywani przerwania może zbuforować się tylko jedno kolejne wywołanie) a dwa że program główny będzie praktycznie zamrożony (będzie się wykonywał po jednej instrukcji asemblerowej między przerwaniami)

wojciechgorzolka napisał(a):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Co do tego tworu to nie lepiej zmniejszyć wartość do której zlicza "zliczanie" i dodać drugą zmienną która będzie zawierała liczbę mrugnięć (po każdym mrugnięciu liczba będzie dekrementowana, czyli zliczanie będzie odpowiedzialne za czas świecenia, i zgaszenia diody, a druga zmienna za liczbę mrugnięć jeśli wogule liczba mrugnięć jest potrzebna), przez co warunki ifa będą dużo mniej czasochłonne dla procka?

Co do przycisków, to w jakim celu ich obsługę masz zarówno w przerwaniu timera i w pętli głównej programu? Samo załączenie migania ledów możesz zrobić dodając po jednej zmiennej/fladze dla każdej diody ze specyfikatorem volatile, i w pętli głównej, w warunkach od przycisków jeśli wciśnięty masz kod który ma się wykonać, to na początku dodajesz by flaga dla danej diody została ustawiona na 1, a po wszystkich poleceniach które od przycisku mają się wykonać dajesz zerowanie flagi. Natomiast w przerwaniu dajesz tylko warunek jeśli flaga 1 to mrugaj, jeśli 0 to nie mrugaj.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 cze 2017, o 15:37 
Offline
Użytkownik

Dołączył(a): 28 maja 2016
Posty: 469
Lokalizacja: Katowice
Pomógł: 1

teraz mam dużo bardziej jaśniejszy obraz. Wieczorem się tym pobawię i będę próbował. a jak mi się nie uda, to wywalę timer i zrobię tylko zapalanie diody na początku funkcji klawisza i gaszenie na samym końcu. A temat będę zagłębiał w osobnych ćwiczeniach :)

_________________
Nikt nie mówił,że będzie łatwo...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 cze 2017, o 20:36 
Offline
Użytkownik

Dołączył(a): 28 maja 2016
Posty: 469
Lokalizacja: Katowice
Pomógł: 1

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



Poprawiłem kod w przerwaniu i gdy wpisuję zmienne z wartością jeden w pętli głównej (dla sprawdzenia poprawności działania kodu), to wszystko pięknie działa. Diody migają z założoną częstotliwością. Gdy zmieniam wartość kontrolki_3, na zero, to oczywiście przestaje migać.
Następnie usunąłem z pętli głównej moje zmienne i wrzuciłem je odpowiednio do funkcji trzech klawiszy. Czyli na początku funkcji wystawiam wartość jeden, na końcu funkcji zeruję i wystawiam jedynkę kolejnej kontrolki.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Teoretycznie powinno działaś poprawnie. I działa, pięknie się zmieniają moje trzy kontrolki. Tylko niestety przy kontrolce drugiej jest awaria w postaci takiej,że jest zapalona ciągle z takim bardzo delikatnym mruganiem. Pierwsza natomiast raz mi zgaśnie, a raz świeci się ciągłym światłem. Dodam jeszcze,że gdy zmienna od kontrolek ma wartość =0, to kontrolka, czyli dioda powinna się świecić.
Reasumując. Jeśli robiłem testy w pętli głównej, to działało poprawnie, natomiast w funkcjach klawiszy już jest problem.

Czy taka usterka mojego kodu może być spowodowana licznymi delajami, czy może tym,że w przerwaniu mam sporo kodu?

_________________
Nikt nie mówił,że będzie łatwo...



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

Dołączył(a): 23 paź 2014
Posty: 1021
Lokalizacja: Trójmiasto
Pomógł: 188

Zmienne kontrolka_X masz zadeklarowane jako globalne z dopiskiem volatile?

Co do kodu w przerwaniu to dla każdej kontrolki możesz wywalić po jednym ifie - wystarczą 2np przy zliczanie==0 zgaś, a przy zliczanie==10 zapal (lub odwrotnie wedle uznania), licznik nadal powinien tykać do 20.
Warunek gaszenia kontrolek najlepiej wyrzucić poza ify sprawdzające kontrolki - chyba że nie zależy ci na stanie w jakim zostaną po zatrzymaniu (co jest zresztą powodem tego że kontrolka_1 czasem gaśnie a czasem świeci po jej zatrzymaniu).



Ostatnio edytowano 27 cze 2017, o 21:06 przez xentis, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 cze 2017, o 21:06 
Offline
Użytkownik

Dołączył(a): 28 maja 2016
Posty: 469
Lokalizacja: Katowice
Pomógł: 1

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

_________________
Nikt nie mówił,że będzie łatwo...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 cze 2017, o 21:22 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1021
Lokalizacja: Trójmiasto
Pomógł: 188

zauważ że wszystkie warunki kontrolek, zarówno zapalające jak i gaszące, masz wrzucone na koniec funkcji przycisków po wszystkich poleceniach gdzie masz jeszcze _delay_ms(500)...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 cze 2017, o 21:28 
Offline
Użytkownik

Dołączył(a): 28 maja 2016
Posty: 469
Lokalizacja: Katowice
Pomógł: 1

To zdanie:

"Warunek gaszenia kontrolek najlepiej wyrzucić poza ify sprawdzające kontrolki - chyba że nie zależy ci na stanie w jakim zostaną po zatrzymaniu (co jest zresztą powodem tego że kontrolka_1 czasem gaśnie a czasem świeci po jej zatrzymaniu)."

pisałeś odnośnie ifów w przerwaniu, czy w funkcji klawisza?

------------------------ [ Dodano po: 5 minutach ]

zależy mi na stanie w jakim pozostaną po zatrzymaniu. Bardzo mi zależy. :)

_________________
Nikt nie mówił,że będzie łatwo...



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

Dołączył(a): 23 paź 2014
Posty: 1021
Lokalizacja: Trójmiasto
Pomógł: 188

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 cze 2017, o 21:36 
Offline
Użytkownik

Dołączył(a): 28 maja 2016
Posty: 469
Lokalizacja: Katowice
Pomógł: 1

już poprawiam

_________________
Nikt nie mówił,że będzie łatwo...



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

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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO