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



Teraz jest 20 kwi 2024, o 03:15


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
Autor Wiadomość
 Tytuł: Kod RC5
PostNapisane: 9 kwi 2013, o 08:57 
Offline
Użytkownik

Dołączył(a): 08 wrz 2012
Posty: 505
Pomógł: 6

Proszę o objaśnienie poniższego fragmentu kodu dotyczącego obsługi klawiszy w pilocie RC5. Chciałby wykorzystać to w innym projekcie ale nie za bardzo rozumiem co tu się dzieję.
Kod:
#define KEY1 (1<<PB1)
#define KEY2 (1<<PB3)
#define KEY3 (1<<PB4)

#define KEYS_MASK (KEY1|KEY2)


1.   uint8_t keys = PINB;

2.   if( (keys & KEYS_MASK) != KEYS_MASK ) {   // sprawdzamy czy wciśnięty jakikolwiek klawisz
3.   _delay_ms(50);         // eliminacja drgań styków
4.   keys = PINB;
5.   if( (keys & KEYS_MASK) != KEYS_MASK ) {   // sprawdzamy czy wciśnięty jakikolwiek klawisz

6.   do {

7.   if( !(keys & KEY1) ) command = _CMD1_RC5;
8.   else
9.   if( !(keys & KEY2) ) command = _CMD2_RC5;
10.   else
11.   keys = PINB;

12.   } while ( (keys & KEYS_MASK) != KEYS_MASK );   /* powtarzaj gdy wciśnięty */



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Kod RC5
PostNapisane: 9 kwi 2013, o 09:17 
Offline
Użytkownik

Dołączył(a): 08 wrz 2012
Posty: 505
Pomógł: 6

Nie rozumiem co się dokładnie dzieje w linijce np. 2 Jaka wartosc przyjmie KEYS_MASK w momencie naciśnięcia KEYS1?
Czy keys = PINB; to jest stan portu B potrzebny do maski?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Kod RC5
PostNapisane: 9 kwi 2013, o 09:35 
Offline
Moderator
Avatar użytkownika

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

KEYS_MASK nie przyjmuje jakiejś tam wartości w momencie wciśnięcia - przecież napisane jest to dużymi literami co w moich kodach zwykle świadczy iż jest to stała. Poszukaj wcześniej w kodzie definicji KEYS_MASK ... a zresztą widać przecież nawet w tym co pokazałeś - więc w czym kłopot ?

_________________
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  
 Tytuł: Re: Kod RC5
PostNapisane: 9 kwi 2013, o 09:51 
Offline
Użytkownik

Dołączył(a): 08 wrz 2012
Posty: 505
Pomógł: 6

Wiesz Mirek gdyby nie było kłopotu to nie zawracałbym wam głowy. Nie lubię wklejać gotowych kawałków kiedy nie rozumiem co tam się dzieję dlatego próbuje dojść z waszą pomocą do jakiegoś ładu.
ok. więc może po kolei.
Po co jest uint8_t keys = PINB; ?
KEYS_MASK odzwierciedla stan switchy, tak ?
Ja rozumiem, że do wielu z was jest to banalne, ale gdzieś się zakałapućkałem po drodze i nie mogę sobie tego rozpisać.
Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Kod RC5
PostNapisane: 9 kwi 2013, o 10:19 
Offline
Moderator
Avatar użytkownika

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

Ale jakie to zawracanie głowy? - po co się denerwujesz skoro grzecznie dopytuję w czym problem bo nie mogę zrozumieć też ciebie - więc można po prostu dopytać i wyjaśniać dalej na spokojnie. Skoro ja mogłem dla ciebie nie do końca przejrzyście coś opisać w książce to zrozum, że ktoś kto zadaje pytanie może równie niezbyt przejrzyście opisać swój problem. Jak widzisz to nie takie proste przekazać wszystko za pomocą tekstu. To tak na początek, a forum jest po to żeby pomagać i próbuję to robić.

keys jak widzisz pobiera wartość z rejestru PINB (czyli robimy odczyt tego co jest na wejściach tego rejestru ... gdybyś nie do końca wiedział do czego jest rejestr PINB to polecam też ten artykuł - bo niestety zabrakło tej informacji w książce mojej omyłkowo)

http://mirekk36.blogspot.com/2012/01/av ... stawy.html

więc skoro w zmiennej keys mamy już stany WEJŚĆ z PINB czyli stany wszystkich klawiszy to maskujemy wszystkie bity które nas nie interesują - żeby wziąć pod uwagę TYLKO te do których są podłączone klawisze zawarte w masce KEYS_MASK .....

(keys & KEYS_MASK)

gdy wykona się operacja maskowania to porównujemy wynik operacji z samą maską aby sprawdzić czy którykolwiek z klawiszy jest wciśnięty (oczywiście zareaguje to także wtedy gdy np będą wciśnięte dwa jednocześnie - ale to nie istotne na tym etapie) bo sprawdzamy tylko czy jest którykolwiek wciśnięty.

i wtedy jeśli tak to coś dalej robimy po IF

_________________
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  
 Tytuł: Re: Kod RC5
PostNapisane: 9 kwi 2013, o 11:06 
Offline
Moderator
Avatar użytkownika

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

squeez napisał(a):
Ja zazwyczaj jak czegoś nie rozumiem to staram się analizować kod jak kompilator (na kartce krok po kroku rozpisywać co się dzieje).

To jest bardzo dobra podpowiedź.

squeez napisał(a):
Czy operacje bitowe są dla ciebie zrozumiałem bo to podstawa żeby zrozumieć co się dzieje w tym warunku dokładnie tu: (PINB & ((1<<PB1) | (1<<PB3)))


A to jest bardzo dobre i ważne w tym przypadku pytanie. Bez zrozumienia tego ani rusz :( rzeczywiście.

_________________
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  
 Tytuł: Re: Kod RC5
PostNapisane: 9 kwi 2013, o 12:13 
Offline
Użytkownik

Dołączył(a): 08 wrz 2012
Posty: 505
Pomógł: 6

Nie Mirku, nie denerwuje się, wręcz przeciwnie. Zaglądam bardzo często na to forum ponieważ tu jest fajna atmosfera to nie to co elektroda gdzie łatwo "oberwać", po prostu zdaję sobie sprawę, że moje pytanie jest dla wielu banalne. Sam robię bardziej skomplikowane rzeczy a takiej podstawy nie mogę zrozumieć. Jestem bardzo wdzięczny za to że komuś się chce tłumaczyć ukłony po raz kolejny dla was koledzy.
Myślę, że rozumiem operację bitowe aczkolwiek gdzieś mógł się wkraść błąd. Również rozpisuję sobie to na kartce, łatwiej to ogarnąć ale jak napisałem wcześniej gdzieś mogłem strzelić babola

Wracając do meritum.
Rozpisałem sobie to tak:

nie naciśnięty żaden klawisz
Kod:
Wszystkie bity PINB off         1111 1111

więc
Kod:
keys=PINB

daje
Kod:
keys               1111 1111

a
Kod:
KEYS_MASK                        0000 0110

w warunku if
Kod:
keys & KEYS_MASK         0000 0110
wynik               0000 0110

if sie spełni zaneguje KEYS_MASK dając
Kod:
KEYS_MASK     1111 1001


i dalej ale tu chyba coś mieszam
naciskam KEY1
Kod:
keys                1111 1101

a
Kod:
KEY1               0000 0010

co daje mi
Kod:
keys & KEY1            0000 0000


tylko proszę się nie śmiać :P :oops:



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Kod RC5
PostNapisane: 9 kwi 2013, o 12:51 
Offline
Moderator
Avatar użytkownika

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

bez śmiania - ja sam teraz zacząłem "przez ciebie sobie rozpisywać to na operacje bitowe" i zbaraniałem, pod tytułem "co ja tam wymyśliłem? chyba coś rzeczywiście pokrębasiłem" ;) ale jednak nie ;) it's working

może spójrz na warunek pętli

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


i rozpatrzmy do kiedy ona będzie się wykonywać - a powinna się dotąd wykonywać dokąd chociaż jeden klawisz będzie naciśnięty prawda ? ;)

więc zgodnie z twoim założeniem nich keys = 1111 1011 gdzie keys_mask = 0000 0110

no to:

Kod:
1111 1011
0000 0110 AND
-----------------
0000 0010 wynik


prawda ? no i teraz porównujemy czy wynik jest równy keys_mask ;)

0000 0010 == 0000 0110 ??? chyba nie ;) a kiedy będzie równy ? no wtedy gdy żaden z dwóch klawiszy nie będzie wciśnięty

Kod:
1111 1111
0000 0110 AND
----------------
0000 0110 wynik


teraz widzisz że wynik = keys_mask prawda ? czyli żaden klawisz nie jest wciśnięty


Autor postu otrzymał pochwałę

_________________
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  
 Tytuł: Re: Kod RC5
PostNapisane: 9 kwi 2013, o 13:39 
Offline
Użytkownik

Dołączył(a): 08 wrz 2012
Posty: 505
Pomógł: 6

Kurczę jak się człowiek na coś uprze to sam się z tego nie wyprowadzi. Źle interpretowałem to:
Kod:
if( (keys & KEYS_MASK) != KEYS_MASK )

wymyśliłem sobie że warunkiem jest
Kod:
(keys & KEYS_MASK)

i jeśli jest spełniony to
Kod:
!= KEYS_MASK

ma się zanegować.
Jakoś nie widziałem że jest to otoczone nawiasami a nie klamrami.
Jak sobie człowiek coś wbije do głowy to bez młotka wybić się nie da. :)
Musze to sobie jeszcze "przewinąć" od początku i przećwiczyć na żywym organizmie (procesorze)
Bardzo dziękuję za tak szczegółowe wyjaśnienia.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Kod RC5
PostNapisane: 9 kwi 2013, o 13:44 
Offline
Moderator
Avatar użytkownika

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

Nie ma za co - sam czasem tak mam że zatnę się na prostej rzeczy i wtedy stoję w miejscu ;) ... dokładnie chyba coś ci ten wykrzyknik przestawił w głowie bo kojarzyłeś go z jakąś negacją ;)

_________________
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: 10 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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