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



Teraz jest 11 gru 2024, o 09:49


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 
Autor Wiadomość
PostNapisane: 9 lut 2012, o 14:31 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 sty 2012
Posty: 131
Lokalizacja: Kraków
Pomógł: 2

Witam,

Mam problem z napisaniem kodu przerwania pętli gdzie po naciśnięciu przycisku wykonuje się inna pętla.
W zasadzie KEY0 i KEY1 działa poprawnie diody gasną i świecą.
Problem zaczyna się w KEY2 i KEY3 gdzie jak go wcisnę to już nie mogę tej pętli przerwać.
Wiem ze problem to while(1) ale nie mogę przeskoczyć jak to poprawnie zdefiniować. Próbowałem też pętli do....while... i tez nic... Jak ktos ma pomysł proszę o pomoc:)
Tzn :
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: 9 lut 2012, o 15:14 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 sty 2012
Posty: 131
Lokalizacja: Kraków
Pomógł: 2

W zasadzie to jedno takie proste rozwiązanie to dodanie do każdej pętli warunku
if (key_down (KEY0 )) {break;}.

Czy jest jeszcze jakiś inny sposób ?(pewnie jest ich ze 100:D)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lut 2012, o 15:18 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

Po pierwsze to znowu masz potworny problem z nawiasami panie kolego, to już drugi twój wątek gdzie to samo się dzieje -----> zastanawiałeś się do czego odnosi się ten nawias zamykający klamrowy w linii nr.83 ??? eeeh no musisz się z tym poprawić i pisać programy korzystając z poprawnych wcięć kodu - bo to co tu widać to jest niestety troszkę masakra :(

no i odpowiedź na pytanie - też pytaniem. A jak chcesz żeby się przerwały te pętle while(1) i while(2) ;) po co w ogóle ta liczba 2 ???? powinno być while(1) w obydwu przypadkach.

ale ok więc jak chcesz żeby ci się one same przerwały skoro przecież napisałeś pan pętle nieskończone bez żadnych warunków które by je kiedyś przerwały ??? Albo nie rozumiem pytania .


---------------[ edit ]-----------------

No właśnie ;) na szczęście doszedłeś do dobrego wniosku zanim kliknąłem odpowiedź ;)

pewnie że sposobów jest 10000000 i sam chyba rozumiesz że ciężko je tu teraz na gorąco wymyślać bo to zależy tylko i wyłącznie od ciebie ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lut 2012, o 15:33 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 sty 2012
Posty: 131
Lokalizacja: Kraków
Pomógł: 2

ten nawias wkleiłem przypadkowo;/
A jak zapisać w tym przypadku pętle while żeby przełączać po miedzy swich-ami bezpośrednio?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lut 2012, o 16:14 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

tomwisnia napisał(a):
A jak zapisać w tym przypadku pętle while żeby przełączać po miedzy swich-ami bezpośrednio?


No ale ja nie rozumiem co ty masz na myśli ? co to znaczy ?

"żeby przełączać pomiędzy switchami bezpośrednio"

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lut 2012, o 16:31 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 sty 2012
Posty: 131
Lokalizacja: Kraków
Pomógł: 2

Tzn ze po naciśnięciu KEY2 wykonuje sie pętla zapisana pod tym klawiszem (np tu jest wszystkie diody świecą) a gdy nacisnę KEY3 to od razu przeskakuje do pętli zapisanej pod klawiszem3 ( czyli zapalanie diod od 0 do 7) i potem gdy nacisnę KEY4 to jest program od migania diod. Takie menu jak np w lampkach choinkowych z przełączaniem różnych trybów migania.

Nie wiem czy dobrze myślę i czy tak można zrealizować za pomocą prostych komendach warunkowych i pętlach takie menu czy lepiej tu użyć przerwań i nie rozumować tego w taki sposób.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lut 2012, o 16:40 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

No tak przede wszystkim o tyle źle myślisz, że chcesz po pierwsze cały swój program napisać (tak jak to robią ludzie w Bascomie) nie dość że w jednym pliku to jeszcze w ramach tej jednej biednej głównej pętli programu.

Musisz zacząć jak najszybciej korzystać z tego że piszesz w C i korzystać z funkcji a potem podziału na pliki projektu.

Przede wszystkim to zamiast ładować kolejne pętle while() w kod po warunkach IF( KEY ) w pętli głównej - napisz pan sobie oddzielną funkcję, którą w tym miejscu po prostu wywołasz. Będzie ona realizowała jakiś tam sposób migania. I to w nie napiszesz sobie tą pętlę while(1) .... sam zobaczysz, że wtedy stworzy ci się odrębny logiczny fragment kodu - coś takiego jak main() ;) .... i w ramach tej pętli będziesz miał znowu podobną konstrukcję i pętlę nieskończoną. Wtedy spokojnie w tej pętli wrzucisz sobie warunek, który po wciśnięciu dowolnego KEY'a oprócz KEY2 - przerwie brutalnie tą pętlę i zakończy się działanie funkcji. Nastąpi to bardzo szybko, więc jak sterowanie powróci do pętli głównej, to jeszcze zaczym oderwiesz palucha od klawisza ;) ... załapie inny IF() w pętli głównej w main(), dzięki czemu zacznie się wykonywać nie koniecznie kolejny ale dowolny inny program spośród tych, które sobie napiszesz.

Teraz jaśniej ? ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lut 2012, o 17:04 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 sty 2012
Posty: 131
Lokalizacja: Kraków
Pomógł: 2

Tak tak właśnie o to mi chodziło, faktycznie najprościej i najwygodniej to zrobić to w odrębnej funkcji. Czyta Pan w myślach:)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lut 2012, o 23:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 sty 2012
Posty: 131
Lokalizacja: Kraków
Pomógł: 2

po sugestiach Pana Mirka dalej mam problem z przerwaniem teraz funkcji
To jest definicja mojej funkcji migania diody
Składnia: [ Pobierz ] [ Ukryj ]
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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


Niestety warunek i break nie przerywa działania funkcji. Niestety tez nie pomaga taki warunek w pętli while funkcji prog3 (wyskakuje błąd Multiple markers at this line
- implicit declaration of function 'key_down'
- previous implicit declaration of 'key_down'
was here).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lut 2012, o 00:33 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

Ależ panie kochany! cóż ty wyczyniasz????? ;)

Zastanów się jak ty chcesz po pierwsze przerwać pracę funkcji prog3() poza tą funkcją ???? A pisałeś wcześniej że zrozumiałeś. Ok jeszcze raz - warunki if() przerywające pracę funkcji progę() to ty rób wewnątrz tej funkcji, w jej koszi i w jej pętli while(1) !!! A nie gdzieś w pętli głównej. Oj ktoś tu w ogóle nie doczytał o postawach, o pętlach i o funkcjach oraz o tym jak działa słówko break! Oj!!! ;)

Pomyśl sobie wywołujesz funkcję progę, ona wpada we własną pętlę while, z której NIGDY !!!! nie ma jak wyjść. Widzisz gdzieś w niej warunek ze słówkiem break??? Bo ja nie ;) więc nawet gdyby ci się ten program skompilował tobędzie ci się ta pętla wewnątrz funkcji prog3 wykonywała po wsze czasy ;)

Ale jeśli chodzi już o te błędy jakie masz ze słówkim break to bardzo proszę weź teraz książkę w rękę i poczytaj o tym słówku i popatrz na przykłady w kodach dobrze??? A potem najwyżej dopytaj dalej, bo robisz tak potworny błąd jakby nigdzie nigdy nie było nic napisane o break. OK????

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lut 2012, o 00:39 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

Aha i jeszcze jedno bo dopiero teraz zobaczyłem, no po co znowu dałeś tą kolejną pętlę while w pętli głównej ??????????? ;( miałeś ją wywalić i tylko wywołać funkcję prog3 po wciśnięciu klawisza 2 a ty znowu tych pętli w pętlach napętałeś że program nie wytrzymał stresu i tego jak go traktujesz i się powiesił ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lut 2012, o 19:36 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 sty 2012
Posty: 131
Lokalizacja: Kraków
Pomógł: 2

Witam:)
W końcu program działa tak jak Ja chcę;)
Jak ktoś ma jakieś uwagi co można poprawić proszę pisać

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: 11 lut 2012, o 20:48 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

Ja mam uwagi - jak piszesz pan słówko break to nie pisz po nim czegoś innego jak tu:

Kod:
if (!(PINA & (1<<PA1))) {break; LED_ON;}


bo break kończy to i już - jak chcesz to przed break daj te rzeczy:

Kod:
if (!(PINA & (1<<PA1))) { LED_ON; break;}

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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