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



Teraz jest 31 mar 2026, o 10:45


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
Autor Wiadomość
PostNapisane: 17 maja 2016, o 13:37 
Offline
Użytkownik

Dołączył(a): 01 lis 2015
Posty: 129
Pomógł: 0

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


W tym kodzie przerwanie występuje co 1 sek. I po 4 sekundach ma się zapalić dioda i powinna świecić aż x się wyzeruje i doliczy do 4 sekund i powinna zgasnąć. A u mnie dioda zapala się po 4 sekundach czyli dobrze i świeci ok 1 sekund i gaśnie.
Natomiast jak zrobię tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Dioda się zapali po 4 sekundach i świeci cały czas.
PYTANIE:
Dlaczego w 1 przypadku dioda gaśnie po 1 sekundzie?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 maja 2016, o 14:00 
Offline
Użytkownik
Avatar użytkownika

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

W czasie gdy x ma wartość równą cztery to stan diody w pętli while nie zmieni się jeden raz tylko tysiące razy. Zmienna x wartość równą cztery będzie miała na czas jednej sekundy. W tym czasie pętla while przekręci się tysiące razy. I za każdym razem zmieni się stan diody led. Czyli dioda tak naprawdę nie świeci światłem ciągłym tylko bardzo szybko miga.

Podejrzewam, że w momencie gdy x zmienia swą wartość z 4 na 5 dioda jest akurat wygaszona. Dlatego wydaje ci się, że dioda przez sekundę świeci a potem gaśnie.

Dla testu wstaw do pętli while opóźnienie np. 100ms aby to sprawdzić.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 maja 2016, o 14:05 
Offline
Użytkownik

Dołączył(a): 31 mar 2014
Posty: 55
Pomógł: 2

Dokładnie to co powiedział kolega Jacek, aby to co chcesz zrobić zadziałało powinieneś wg mnie dodać jakąś zmienną którą byś zmieniał w przerwaniu i sprawdzał dodatkowo w warunku np
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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

Wtedy dioda się zapali i nie zgaśnie dopiero przy następnym x==4 dioda zgaśnie czyli za ok 251 sekund


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 maja 2016, o 21:21 
Offline
Użytkownik

Dołączył(a): 01 lis 2015
Posty: 129
Pomógł: 0

Dziękuje o to chodziło. Mam jeszcze jedno pytanie odnośnie używania nawiasów klamrowych:

np. Jak zapisuje zmienne to:

int a, b, c; mogę oddzielić je przecinkami
np. jak mam if (x==2&&y==1)
{LED;
LED2;
}
jak mogę zapisać to bez nawiasów klamrowych? Jak bym miał tylko samo LED to bym zapisał:
if (x==2&&y==1) LED;
Oddzielenie przecinkami nie działa.

Pan Mirek w BB użył takiej makrodefinicji:
#define DC_LEWO PORTB &= ~WE_A; PORTB |= WE_B
Po WE_B nie powinno być; Czemu w zmiennych żeby oddzielić zmienne używamy przecinków a tutaj średników?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 maja 2016, o 05:03 
Offline
Użytkownik

Dołączył(a): 31 mar 2014
Posty: 55
Pomógł: 2

W przypadku if jeśli masz tylko jedną czynność do wykonania to nie musisz używać nawiasów klamrowych, jeśli masz więcej niż jedną to już musisz inaczej program pomimo nie zgodnego warunku wykona te czynności poza pierwszą leżącą za ifem. Co do #define (przepraszam za mój nie profesjonalny język itp.) po prostu w define możesz dać kilka linijek kodu działa to jak makro. Tak jak masz w przypadku z BB, dzięki czemu za jednym zamachem możesz ustawiać bity na kilku portach co ułatwia sprawę, musisz je oddzielać średnikiem poza ostatnią inaczej program zakomunikuje błąd. Średnik daje informację, że za nim jest kolejna funkcja. A przynajmniej ja to tak rozumuje. Generalnie Define ułatwia bardzo życie ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 maja 2016, o 07:13 
Offline
Użytkownik
Avatar użytkownika

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

Jeżeli korzystasz z if() to nawet dla jednej funkcji/polecenia używaj nawiasów {}. Po pierwsze program jest czytelniejszy. Po drugie, gdy trzeba dodać coś nie ma problemu, bo wstawiasz funkcje/polecenia w ten nawias (a przy braku {} często się o tym zapomina i program nie działa, tak jak chce się). Po trzecie, gdy wyrobisz sobie odruch, że po każdym if() dajesz {, to unikasz kolejnego częstego błędu, jakim jest wstawianie średnika po if() - wtedy warunek działa tylko dla średnika. Mało tego, jeśli nawet na końcu linijki z if(){ wstawisz średnik to program będzie działał dobrze, gdyż średnik (czyli pusta instrukcja) będzie w bloku obsługi polecenia if() - ot przykład:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
40-32:2=4!



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


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