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



Teraz jest 6 kwi 2026, o 17:40


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 
Autor Wiadomość
PostNapisane: 20 kwi 2015, o 16:41 
Offline
Użytkownik

Dołączył(a): 22 sie 2013
Posty: 64
Pomógł: 1

Witam , pisze program do obsługi silnika krokowego i sprawdzam działanie na diodach podłączonych do pinów
#define T1 (1<<PD7)
#define T2 (1<<PD6)
#define T3 (1<<PA2)
#define T4 (1<<PA1)

Chce aby pętla for wykonywała się 10 razy tzn żeby cała sekwencja zapalania diod (funkcja kroki lewo()) wykonała się 10 razy.
Problem w tym ze po spełnieniu warunku t=1 zaświeci się tylko 1 dioda(KROK1). Natomiast jak usunę t=0 z programu to pętla for będzie się wykonywała nieskończona ilość razy ponieważ jest w pętli while(1) i zaświeca się wszystkie diody po kolei ( KROK1, KROK2,KROK3,KROK4).
Kod programu:
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: 20 kwi 2015, o 18:01 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

Akurat ten program inaczej nie będzie działać.
Program po wejściu do pętli for sprawdza w if_ie czy zmienna Timer1 ma wartość zero. Jeśli ma to wykona się funkcja kroki_lewo(). Wykonany zostanie jeden krok.

Teraz nastąpi drugi obrót pętli for. I znów zostanie sprawdzony warunek if. Tym razem zmienna Timer1 będzie miała wartość większą od zera bo jeszcze do tego zera nie doliczyła. Funkcja kroki_lewo() się nie wykona.

Po tym nastąpi trzeci obrót pętli for. Potem czwarty i tak do końca. I na pewno w tym czasie zmienna Timer1 nie doliczy do zera. Bo to nastąpi dopiero po 200 ms. A for wykona się o wiele szybciej.

Po wyjściu z for zmienna "t" zostanie wyzerowana i program od tej pory będzie się kręcił tylko w pętli while z każdym obrotem sprawdzając warunek if(t==1).

I w rezultacie zostanie wykonany tylko 1 krok z 10 zaplanowanych.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 kwi 2015, o 18:17 
Offline
Użytkownik

Dołączył(a): 22 sie 2013
Posty: 64
Pomógł: 1

Ok rozumie. Ogólnie chciałbym uzyskać taki efekt jak poniżej gdzie zastosowałem delay_ms ale nie mam pomysłu jak wykorzystać do tego timer.
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: 20 kwi 2015, o 21:25 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

Najprościej (co nie znaczy, że najlepiej) można by to zrobić np. w taki sposób
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Użycie pętli for, wg mnie, nie jest w tym przypadku najlepszym pomysłem. Bo co jeśli będziesz chciał aby silnik zrobił większa ilość kroków?
Jeśli program wskoczy do pętli for i pozostanie w niej przez dłuższy czas to będzie to taka sama sytuacja jak użycie dalayów. Nawet jeśli wewnątrz for będzie użyty timer programowy zamiast delaya. Dopóki program nie wyjdzie z pętli for, to poza przerwaniami, nie będzie robił nic innego.



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

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