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



Teraz jest 19 kwi 2024, o 00:29


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 
Autor Wiadomość
 Tytuł: Pętla w pętli
PostNapisane: 27 maja 2019, o 18:26 
Offline
Użytkownik

Dołączył(a): 19 lip 2016
Posty: 114
Pomógł: 0

Witam,
Zamierzony efekt to po 60 obiegach pętli sekund, jeden obieg pętli minut.
Problem w tym że działa tylko z wartością 60!?
Całość działa w co sekundowym przerwaniu.
Czy to zadziała, co robię źle?

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 maja 2019, o 20:17 
Offline
Użytkownik

Dołączył(a): 05 sty 2015
Posty: 393
Lokalizacja: Mielec
Pomógł: 14

Przesuń nawias } ten co jest po b++ na koniec drugiej pętli za b=0 } i zadziala z każdą wartością od b==1 do b==212



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 maja 2019, o 20:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 mar 2015
Posty: 313
Lokalizacja: Czerwionka-Leszczyny
Pomógł: 22

Jeżeli cię dobrze zrozumiałem, to tak się tego nie robi.
Jeżeli chcesz zmieniać stan diody nr.1 co sekundę na przeciwny a stan diody nr.2 co minutę na przeciwny
a korzystasz z przerwania co 1sekundę to wyrzuć te pętle for z pętli głównej i skorzystaj z procedury przerwania.
Jak? No tak:
Skoro przerwanie odbywa się co sekundę to zmieniaj stan pinu PB1 w procedurze obsługi tego przerwania.
Potem inkrementuj sobie jakąś zmienną np. a , i sprawdzaj if-em czy osiągnęła już wynik np a>59.
Wtedy jeśli if zostanie spełniony to zmień stan drugiej diody na PB2 na przeciwny i wyzeruj zmienną a.
Wszystkim zajmie się procedura obsługi przerwania a pętla główna zostanie pusta.
No i to wszystko.

_________________
http://www.avrboss.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 maja 2019, o 20:30 
Offline
Użytkownik

Dołączył(a): 05 sty 2015
Posty: 393
Lokalizacja: Mielec
Pomógł: 14

Przepraszam ale...

Kolega pisał co robi zle w tym przedstawionym kodzie, nie pytał o inne rozwiazania, bo może to jest jego zamierzony cel, pomigac dioda tak szybko że aż sobie świeci delikatnym swiatełkiem ciagłym.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 maja 2019, o 20:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 mar 2015
Posty: 313
Lokalizacja: Czerwionka-Leszczyny
Pomógł: 22

Dlatego też napisałem, że nie wiem czy dobrze zrozumiałem jego problem.

_________________
http://www.avrboss.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 maja 2019, o 05:02 
Offline
Użytkownik

Dołączył(a): 19 lip 2016
Posty: 114
Pomógł: 0

Szofer napisał(a):
Przesuń nawias } ten co jest po b++ na koniec drugiej pętli za b=0 } i zadziala z każdą wartością od b==1 do b==212


Przesunięcie tego nawiasu powoduje tylko to że, obie pętle pracują razem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 maja 2019, o 06:12 
Offline
Użytkownik

Dołączył(a): 05 sty 2015
Posty: 393
Lokalizacja: Mielec
Pomógł: 14

Druga pętla jest po if(b==60) wiec ona działa jak jest spełniony if, czyli w zakresie b=0 do b=212, zauważ że inkrementujesz b w petli for, ona zakonczy sie kiedy "a" osiagnie 212, wiec nie wykona sie drugi if bo w pierwszym if-ie "b" przekroczy wartosc warunku drugiego if-a zanim wyjdzie z pętli i program przejdzie dalej.

Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 maja 2019, o 06:13 
Offline
Użytkownik

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

Kod, który przedstawiłeś będzie co sekundę uruchamiał pierwszą pętlę (212 * zmiana stanu PB1 co 1ms).
Warunek if(b==60) będzie spełniony, czyli druga pętla (212 * zmiana stanu PB2 co 1ms) będzie wykonana, gdy:
((sek*212)%256)==60
gdzie:
sek to sekundy
(% to operator modulo)
Nie chce mi się teraz liczyć, po ilu sekundach to nastąpi.

Jeśli chcesz, aby pierwsza pętla była wykonywana co sekundę, a druga co 60 sekund, spróbuj tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


EDIT:
Widzę, że kolega Szofer uprzedził mnie i wskazał już miejsce błędu, ale zostawię moją odpowiedź jako uzupełnienie.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 maja 2019, o 17:37 
Offline
Użytkownik

Dołączył(a): 19 lip 2016
Posty: 114
Pomógł: 0

Wszystko działa jak należy.
Dodałem jeszcze godziny.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Dziękuję wszystkim za pomoc.
Pozdrawiam



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

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