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



Teraz jest 10 sty 2025, o 22:00


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 16 ] 
Autor Wiadomość
PostNapisane: 12 sty 2016, o 21:47 
Offline
Użytkownik

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

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


Jeśli klawisz nie wciśnięty a key_lock = 0 to ustaw key_lock = 1
jeśli klawisz puszczony a key_lock różna od zera (będzie różna bo ma 1) to wykonaj kod:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Aby wykonać if warunek musi być spełniony a jak on może być spełniony jak 1 po preinkrementacji wynosi 2. Negujemy logicznie 2 czyli !2 to mamy false. Czyli dioda się nie zapali.
Co rozumiem błędnie?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 sty 2016, o 08:50 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 162
Pomógł: 6

Zapali się jak key_lock się zawinie o będzie 0 - czyli po 254 obrotach pętli while. Tu zapewne chodzi o takie proste ignorowanie drgań styków przycisku.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 sty 2016, o 09:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 lis 2012
Posty: 298
Pomógł: 13

Wszystko tak jak kolega aaadamw napisał.
key_lock w mgnieniu oka się przekręci - dojdzie do 255 i kolejną wartością będzie 0, wtedy warunek się wykona.
To jest coś na podobieństwo opóźnienia ( np. _delay_ms() ) dla wyeliminowania drgań styków, tyle że nie blokuje procesora na czas czekania, robi inne rzeczy a za każdym obiegiem inkrementuje tą zmienną.
Jak trwa to za długo, to do zmiennej możesz wstępnie zamiast 0 wpisać np. 100. A jeśli za krótko, to zamiast zmiennej uint8_t wykorzystaj uint16_t - będzie się przekręcał 256 razy dłużej.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 sty 2016, o 10:25 
Offline
Użytkownik

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

A czemu p. Mirek użył ++zmienna a nie zmienna++ ? Przecież to tylko różnica w jednym obiegu? Czy to ma AŻ takie znaczenie?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 sty 2016, o 19:56 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 162
Pomógł: 6

jakby była zmienna++ to nigdy by się warunek nie wykonał
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

powiedzmy że key_lock jest 255, wtedy warunek else if( key_lock && (PINC & KEY1 ) ) jest spełniony, i
warunek poniżej zostanie wykonany, bo najpierw key_lock zostanie zwiększony co da nam key_lock=0.
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 sty 2016, o 12:05 
Offline
Użytkownik

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

aaadamw napisał(a):
jakby była zmienna++ to nigdy by się warunek nie wykonał
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

powiedzmy że key_lock jest 255, wtedy warunek else if( key_lock && (PINC & KEY1 ) ) jest spełniony, i
warunek poniżej zostanie wykonany, bo najpierw key_lock zostanie zwiększony co da nam key_lock=0.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

A jakim cudem key_lock ma być 255. Tam jest wpisywana 1 i nie ma żadnego zwiększania tej zmiennej.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sty 2016, o 12:45 
Offline
Użytkownik

Dołączył(a): 08 mar 2014
Posty: 398
Lokalizacja: Głogów
Pomógł: 11

Zwrot ++ oznacza zwiększanie zmiennej ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sty 2016, o 12:58 
Offline
Użytkownik

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

A jak będzie tak:
if( !key_lock++ )

to nie zadziała? Ja w pre i postinkrementacji widzę różnicę w obiegu jednej pętli. Dlatego może, źle to rozumiem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sty 2016, o 13:03 
Offline
Użytkownik

Dołączył(a): 08 mar 2014
Posty: 398
Lokalizacja: Głogów
Pomógł: 11

Postinkrementacja najpierw sprawdza warunek potem zwiększa zmienną, preinkrementacja najpierw zwiększa potem sprawdza. Tutaj nie ma znaczenia co najpierw bo przecież zmienna i tak przyjmuje wartości od 0 do 255 i potem znów 0 itd.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sty 2016, o 22:41 
Offline
Użytkownik

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

No właśnie nad tym się zastanawiałem dlaczego jest preinkrementacja a nie postinkrementacja. Wychodzi na to, że dobrze to kminiłem jak zrobię eclipse bo mam z nim problem nadal to, wgram program i sprawdzę. Dziękuje za pomoc.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lut 2016, o 20:54 
Offline
Użytkownik

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

I jestem w kropce dzisiaj badam ten program i z ++keylock działa a z keylock++ nie działa więc czy ktoś może wytłumaczyć dlaczego jest różnica w jednej pętli i program nie działa?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lut 2016, o 21:26 
Offline
Moderator
Avatar użytkownika

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

elektronikq napisał(a):
I jestem w kropce dzisiaj badam ten program i z ++keylock działa a z keylock++ nie działa więc czy ktoś może wytłumaczyć dlaczego jest różnica w jednej pętli i program nie działa?


Zacznij od podstaw i poczytaj czym różni się pre- i post- inkrementacja

_________________
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: 8 lut 2016, o 21:42 
Offline
Użytkownik

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

mirekk36 napisał(a):
elektronikq napisał(a):
I jestem w kropce dzisiaj badam ten program i z ++keylock działa a z keylock++ nie działa więc czy ktoś może wytłumaczyć dlaczego jest różnica w jednej pętli i program nie działa?


Zacznij od podstaw i poczytaj czym różni się pre- i post- inkrementacja


Rozumiem co robi post - i pre - inkrementacja. W preinkrementacji najpierw zwiększamy o 1 i pobieramy do wyrażenia a w postinkrementacji pobieramy liczbę która ma aktualną wartość a dopiero potem ją zwiększamy.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lut 2016, o 22:11 
Offline
Użytkownik
Avatar użytkownika

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

Przeanalizuj co się stanie gdy zmienna key_lock będzie miała wartość równą 255 i użyta będzie postinkrementacja.

1. Pierwszy if nie będzie spełniony.
2. Warunek w drugim if-ie (po else) będzie prawdziwy więc sprawdzony zostanie warunek w trzecim if-ie.
3. Skoro użyta został postinkrementacja to najpierw zostanie sprawdzone czy key_lock ma wartość zero (nie ma) a potem jej wartość zwiększy się o jeden. Key_lock się przekręci i będzie mieć wartość równą zero.
4. W następnym obiegu pierwszy if nadal nie będzie spełniony (bo przycisk nie jest wciśnięty), drugi if ten po else też nie bo key_lock ma wartość zero. Jeśli ten if się nie wykona to nie zostanie sprawdzony warunek w trzecim if-ie i stan diody LED nie zostanie zmieniony na przeciwny.

A teraz to samo ale z użyciem preinkrementacji.
1 i 2 to samo co poprzednio.
3. W trzecim if-ie najpierw zostanie zwiększona wartość key_lock a potem sprawdzone czy zmienna ma wartość równą zero. Zmienna miała wartość 255. Po zwiększeniu o jeden ma wartość równą zero. Warunek jest prawdziwy i stan diody LED zostanie zmieniony na przeciwny.
4. Również to samo co poprzednio.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lut 2016, o 23:44 
Offline
Użytkownik

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

Rozumiem rozpisałem to na wartościach np. 100 i 255. Dziękuje Jacek. Super to wytłumaczyłeś. Ale ta pętla musi zapierniczać bo to szybko się przekręca... ile to ms trwa?



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

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

Może Ci się przyda:
http://forum.atnel.pl/topic5339.html

Przeczytaj sobie jeszcze komentarze pod tym artykułem (szczególnie ten: Anonimowy1 marca 2014 09:47):
http://mirekk36.blogspot.co.uk/2012/10/obsuga-klawiszy-drgania-stykow-cd2.html



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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