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



Teraz jest 8 lis 2024, o 15:19


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 39 ]  Przejdź na stronę 1, 2  Następna strona
Autor Wiadomość
PostNapisane: 15 sty 2012, o 19:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 gru 2011
Posty: 449
Pomógł: 4

Witam
Doszedłem do rozdziału w książce traktującego o obsłudze klawiszy typu micro-switch. No i nie mogę zrozumieć jednej rzeczy w funkcji sprawdzania, czy klawisz został wciśnięty, czy nie został wciśnięty (chodzi o listing ze strony 179).

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

Wszystko dotyczy makrodefinicji o następującej składni:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Mój tok rozumowania jest następujący:
Makro ma sprawdzać, czy występuje jedna z dwóch możliwości:
1. przycisk wciśnięty, a więc na pinie PC6 występuje stan niski
2. przycisk NIE wciśnięty, a więc na pinie PC6 występuje stan wysoki

Ponieważ chyba nigdzie wcześniej nie wystąpił opis dotyczący "zwrotu" PINC, sprawdziłem w nocie ATmegi 32, że o ile dobrze odczytałem angielski opis, jest to jedno-bajtowy rejestr tylko do odczytu zwracający wartość jaką przyjmuje PORT C.

Tak więc idąc tym tropem rozpisałem dwie możliwości, jakie może przyjąć powyższa makrodefinicja:
1. Dla wciśniętego przycisku wartości poszczególnych bajtów wynoszą:
PINC 0b 0000 0000
(1<<PC6) 0b 0100 0000 następnie wykonywany jest bitowy iloczyn logiczny
AND 0b 0000 0000 wynik iloczynu, po czym jego negacja
! 0b 1111 1111

Czyli wartość całego wyrażenia wynosi 0b1111 1111.

2. Dla NIE wciśniętego przycisku wartości poszczególnych bajtów wynoszą:
PINC 0b 0100 0000
(1<<PC6) 0b 0100 0000 następnie wykonywany jest bitowy iloczyn logiczny
AND 0b 0100 0000 wynik iloczynu, po czym jego negacja
! 0b 1011 1111

Czyli wartość całego wyrażenia wynosi 0b1011 1111.

No i teraz prawdopodobnie gdzieś robię błąd w logice moich rozważań, gdyż w dalszej części programu występuje pętla główna, a w niej warunek:

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


I tego nie mogę zrozumieć:
Warunek przyjmuje albo argument 1, czyli PRAWDA, albo argument 0, czyli FAŁSZ. Ale jeśli wartość wyrażenia, które wcześniej wyliczyliśmy ma wartość całego bajtu, to w takim razie warunek zawsze jest prawdziwy, bo wartość tego bajtu jest w każdym przypadku większa od 0.
Z tego wynika, że w tym przypadku warunek ten zawsze ma być prawdziwy, czy tak?

Czy ktoś może mi to łopatologicznie wyłożyć? Z góry dziękuję.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 sty 2012, o 19:42 
Offline
Moderator
Avatar użytkownika

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

Posłuchaj:

jeśli klawisz nie wciśnięty na PC6 to mamy:

0b 0100 0000

prawda ?

no i teraz wyrażenie (PINC & (1<<PC6) co przekłada się na taką operację:

0b 0100 0000 - PINC &
0b 0100 0000 - (1<<PC6)
----------------
0b 0100 0000

czyli UWAGA! (Bo tu robisz błąd myślowy - tak podejrzewam - myląc operator logicznej negacji ! z operatorem negacji bitowej ~)

mamy wyrażenie !( 0b 0100 0000 )

co oznacza, że wygląda to tak: zaneguj( PRAWDA )

w wyniku otrzymasz wartość już całego wyrażenia po zanegowaniu: FAŁSZ bo przecież zanegowana PRAWDA to FAŁSZ

zgadza się ?

A ty wplątałeś po prostu negację w postaci wykrzyknika ! - którą przyjąłeś w rozważaniach jako negację bitową.

czy teraz jaśniej ?

PS tak dla uzupełnienia rozpatrzmy w ten sam sposób przypadek gdy klawisz wciśnięty:

0b 0000 0000 - PINC &
0b 0100 0000 - (1<<PC6)
-------------
0b 0000 0000

zatem mamy: !( 0b 0000 0000 ) czyli: zaneguj( FAŁSZ ) co w efekcie daje nam: PRAWDA ;) prawda ?

_________________
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: 15 sty 2012, o 19:58 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 gru 2011
Posty: 449
Pomógł: 4

PRAWDA.
No tak, teraz dopiero uświadomiłeś mi, że chodzi o logiczną negację, a nie bitową negację. Dlatego nie mogłem dojść, jakim cudem warunek if może przyjmować wartość PRAWDA, albo FAŁSZ.

Dziękuję za wyjaśnienia.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 maja 2014, o 18:10 
Offline
Użytkownik

Dołączył(a): 30 sie 2012
Posty: 226
Pomógł: 11

Witam,
mam problem ze zrozumieniem dokładnie jednej linijki w obrazku od Pan Mirka:
http://www.atnel.pl/download/poradniki/ ... vr_big.jpg

Mianowicie:
!(PIND & (1<<PD0))

Mam bluebooka, jednak też nie znalazłem szczegółowej odpowiedzi na moje wątpliwości.
Tutaj kolega wcześniej pisał, że są rozpatrzone 2 warunki:

1. Jak klawisz jest wciśnięty
2. Jak klawisz nie jest wciśnięty

Jeśli mamy ustawiony kierunek pinu PD0 jako wejście, następnie podciągamy programowo linijkę PD0 do VCC,
to nie rozumiem tego zapisu:
!(PIND & (1<<PD0))
(1<<PD0) - oznacza że PIND ma wartość 0b 0000 0001 ???
Wygląda to tak, że na PIND ustawiamy wartość 1 dla najmłodszego bajtu

Nie rozumiem dlaczego powinno być:
1. Dla wciśniętego klawisza:
PIND 0b 0000 0000 (ponieważ jak klawisz wciśnięty, to zawsze jest 0 na wszystkich pinach PINu D??)

2. Dla nie wciśniętego klawisza
PIND 0b 0000 0001 (ponieważ jak klawisz nie wciśnięty, to 1 będzie ustawiona tam, gdzie mamy podciągnięty PIN do VCC??,
w naszym przypadku PIN PC0??)

Do czego w takim razie służy zapis: (1<<PD0)??

Co by się stało, gdyby warunek wyglądał tylko tak:
!(PIND)

Rozumiem, że operacja:
& to bitowy iloczyn logiczny, a && to iloczyn logiczny,

Jeśli chodzi o wyrażenie typu:
!(0b 0000 0001) - oznacza to zawsze Zaneguj Prawdę?? (ponieważ PRAWDA oznacza, że w tym bajcie wystąpiła minimum jedna 1??)

!(0b 0000 0000) - oznacza to zawsze Zaneguj Fałsz?? (ponieważ FAŁSZ oznacza, że w tym bajcie wszystkie wartości są 0??)

Prosiłbym o łopatologiczne wyjaśnienie moich wątpliwości.
Z góry dziękuję



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 maja 2014, o 19:24 
Offline
Moderator
Avatar użytkownika

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

piotr8605 napisał(a):
mam problem ze zrozumieniem dokładnie jednej linijki w obrazku od Pan Mirka:


No dobrze a powiedz mi czy przeczytałeś chociaż to co napisałem DWA posty wyżej w tym wątku ?

------------------------ [ Dodano po: 3 minutach ]

piotr8605 napisał(a):
Do czego w takim razie służy zapis: (1<<PD0)??


maskowanie bitu wybranego klawisza ?

_________________
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: 24 maja 2014, o 19:54 
Offline
Użytkownik

Dołączył(a): 30 sie 2012
Posty: 226
Pomógł: 11

Tak przeczytałem dokładnie.
Jeśli klawisz nie wciśnięty to:
0b 0100 0000 - PINC &
0b 0100 0000 - (1<<PC6)
----------------
0b 0100 0000


Jeśli klawisz wciśnięty:
0b 0000 0000 - PINC &
0b 0100 0000 - (1<<PC6)
-------------
0b 0000 0000


Czyli taki sam wynik daje !(PD0), co !(PIND & (1<<PD0)), bo wynik bitowy w obu przypadkach jest taki sam..



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 maja 2014, o 20:12 
Offline
Moderator
Avatar użytkownika

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

Cytuj:
Czyli taki sam wynik daje !(PD0)


to teraz mi powiedz co będzie gdy w PIND będzie taka wartość?

0b00110011

???

Jak myślisz po co na takiej wartości stosujemy maskę bitową ? (1<<PDx) ?

a może wiesz co ? weź obejrzyj najpierw DOKŁADNIE w takim razie ten poradnik ok?

http://mirekk36.blogspot.com/2014/03/ma ... m-oka.html

bo to jednak warto RAZ a DOBRZE zrozumieć - co to jest maskowanie i dlaczego to:

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


jest bzdurny zapis ... w tym przypadku sprawdzania stanu WYBRANEGO klawisza (bzdurny bo brak maskowania właśnie)

_________________
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: 25 maja 2014, o 14:36 
Offline
Użytkownik

Dołączył(a): 30 sie 2012
Posty: 226
Pomógł: 11

Oglądnąłem poradnik o maskowaniu bitów, myślę, że pomogło.
Na obrazku załączam przykład na uC Atmega 88P.
Prosiłbym o sprawdzenie poprawności moich zapisków na kartce.
Jeśli nie ma błędów, to zrozumiałem maskowanie bitów ;)
Z góry dziękuję za pomoc :)

Obrazek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 maja 2014, o 14:42 
Offline
Moderator zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 18 lip 2012
Posty: 3203
Lokalizacja: Kraków - obok FAB5 ATMEL'a
Pomógł: 90

A potrafisz coś odczytać z tego obrazka?? Bo my nie. :lol:

_________________
http://www.jaglarz.info



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 maja 2014, o 14:52 
Offline
Użytkownik

Dołączył(a): 30 sie 2012
Posty: 226
Pomógł: 11

Przepraszam :)

Obrazek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 maja 2014, o 10:17 
Offline
Użytkownik

Dołączył(a): 19 paź 2012
Posty: 79
Zbananowany użytkownik

Pomógł: 1

Wyglada ok jesli chodzi o maske. Ustawiania portow etc. nie analizowalem. To 0x31 mozna zapisac tez w postaci:

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


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


to bedzie:
00000001
or
00010000
or
00100000
=
00110001

czyli nasze 0x31

wtedy nawet jeśli zapomnimy w komentarzu opisać czego dotyczy maska - od razu będziemy widzieć, że maska jest ustawiona na piny PC0, PC4, PC5 bez
zbędnego przeliczania miedzy systemami liczbowymi ;) Choć ja preferuje opisanie sobie tego w komentarzu np.

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


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


bo latwiej dac to 0x3E i opisac to sobie w komentarzu ;) Ale to juz moje preferencje ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 maja 2014, o 10:35 
Offline
Moderator
Avatar użytkownika

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

Dokładnie jak pisze kolega wyżej - ale można jeszcze sobie uprościć i dać makro dla preprocesora

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


a później się nią w kodzie posługiwać, np:

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


jak widać - nie trzeba ŻADNYCH ale to żadnych przeliczeń, dziesiętnych na hexy, hexsów na binarne , binarnych ma hexy itp itd ... po co? ;)

_________________
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: 26 maja 2014, o 11:07 
Offline
Użytkownik

Dołączył(a): 19 paź 2012
Posty: 79
Zbananowany użytkownik

Pomógł: 1

Tak, preprocesor ułatwia nam zdecydowanie życie - w szczególności jeśli takiej maski używamy w wielu miejscach kodu :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 maja 2014, o 23:13 
Offline
Użytkownik

Dołączył(a): 30 sie 2012
Posty: 226
Pomógł: 11

Dziękuję kolegom za cenne i praktyczne uwagi :)

Poniżej przedstawiam kod z eclipsa jako przykład użycia klawisza.
Może komuś się przyda.
Sprawdzałem na Atmega 88P i działa.


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


Dioda miga szybciej, gdy nie naciskamy klawisza, dioda miga wolniej, gdy klawisz będzie cały czas wciśnięty.
Jak mogę przerobić ten program, abym mógł np. po jednorazowym wciśnięciu klawisza zmienić sobie częstotliwość świecenia diody? Np. wciśnięcie raz klawisza powoduje zaświecenie diody na stałe, wciśnięcie drugi raz powoduje miganie diody co 1 sek., wciśnięcie 3 raz powoduje miganie diody co 100ms, a wciśnięcie 4 raz powoduje zgaszenie diody i tak od początku.
Dziękuję za pomoc i pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 maja 2014, o 00:11 
Offline
Użytkownik

Dołączył(a): 19 paź 2012
Posty: 79
Zbananowany użytkownik

Pomógł: 1

Troszke naprowadzenia masz tutaj:
http://mirekk36.blogspot.com/2012/10/dr ... ak-to.html
To taka wedka ;) Zamiast wylaczania,wlaczania diody zrob po prostu zwiekszanie/zmniejszanie czestotliwosci :)

W BlueBooku o ile pamietam to w okolicy opisywania SuperDebouncer troche bylo na ten temat (ale moge sie mylic :P)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 maja 2014, o 10:11 
Offline
Użytkownik
Avatar użytkownika

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

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


Do obsługi klawisza zastosowałem funkcję, którą Mirek opisał na swoim blogu. Zamiast opóźnień typu delay zastosowałem timery programowe.

Potraktuj ten program jako zachętę do własnych eksperymentów :-) Miłej zabawy :-)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 maja 2015, o 14:39 
Offline
Nowy

Dołączył(a): 14 maja 2015
Posty: 6
Lokalizacja: Północ Polski
Pomógł: 0

Cześć wszystkim,
Jestem początkujący jeżeli chodzi o programowanie, więc proszę o wyrozumiałość:)
Modyfikuję właśnie program dotyczący obsługi wyświetlacza 7segmentowego z BB. Dopisałem funkcję która obsługuje dwa przyciski i w zależności od ich stanu zwiększa lub zmniejsza wyświetlaną liczbę.
Napotkałem problem przy obsłudze przycisku - program nie zauważa, że przycisk jest ciągle wciśnięty i zmienia mi wartość liczby o wiele więcej niż o 1 podczas jednego naciśnięcia.
Do zabezpieczenia funkcji użyłem fragmentu kogu z artykułu Pana Mirka o obsłudze klawiszy, ale widocznie nie zrozumiałem czegoś do końca bo ciągle występuję ten błąd.
Kod poniżej:

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



Czy możecie mi podpowiedzieć co robię źle?

pozdrawiam
Łukasz



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 maja 2015, o 15:43 
Offline
Użytkownik

Dołączył(a): 25 lut 2015
Posty: 252
Lokalizacja: Lublin
Pomógł: 23

Ależ wręcz przeciwnie.
Program zauważa, że masz wciśnięty przycisk cały czas,
a ponieważ wywołuje ciągle w pętli funkcję sprawdzania klawisza - "klawisz_wcisniety",
ciągle zwraca też 1, co powoduje inkrementację licznika.
Nie wykorzystujesz wcale zmiennej key_lock, tak w ogóle, jeśli chcesz z niej korzystać w funkcji main i klawisz_wcisniety,
zadeklaruj ją przed main.

------------------------ [ Dodano po: 2 minutach ]

Przy zmniejszaniu podobnie, dostajesz ciągle 0 i dekrementujesz z szybkoscią obiegu pętli while.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 maja 2015, o 16:03 
Offline
Nowy

Dołączył(a): 14 maja 2015
Posty: 6
Lokalizacja: Północ Polski
Pomógł: 0

Ale dlaczego program zwraca mi 1 gdy przycisk jest wciśnięty a zmienna key_lock jest różna od 0?
W takim wypadku program nie powinien wejść do pętli if( !key_lock && !(PINC & klawisz)) a powinien zwracać 0.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 maja 2015, o 16:34 
Offline
Użytkownik

Dołączył(a): 25 lut 2015
Posty: 252
Lokalizacja: Lublin
Pomógł: 23

Sorry odnośnie deklaracji, jest ona u Ciebie też poza ciałem funkcji, ale tak wrzucona, że moje stare oczy to przegapiły.
Powinna być dla porządku na górze programu.
Niestety jestem w pracy i rzucam tylko w wolnej chwili okiem na Twój kod.
Zaraz się przyjrzę dokładniej.

------------------------ [ Dodano po: 10 minutach ]

Ale jak key_lock = 1
to zawsze masz spełniony drugi warunek i zawsze masz dekrementację licznika i inkrementację key_lock

------------------------ [ Dodano po: 16 minutach ]

Raczej musisz pójść drogą dwóch zmiennych dla obydwu klawiszy - modyfikacja kodu Mirka:
http://mirekk36.blogspot.com/2012/10/ob ... w-cd2.html



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 maja 2015, o 17:00 
Offline
Nowy

Dołączył(a): 14 maja 2015
Posty: 6
Lokalizacja: Północ Polski
Pomógł: 0

Żeby drugi warunek był spełniony i licznik key-lock był inkrementowany musi być też zwolniony przycisk ( key_lock && (PINC & klawisz ) ).
Wydaje mi się, że powinno to działać na jednej zmiennej, zakładając że w jednej chwili naciskam tylko jeden przycisk.



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

Dołączył(a): 25 lut 2015
Posty: 252
Lokalizacja: Lublin
Pomógł: 23

Masz racje, brak wykrzyknika.
Jednak praca nie jest dobrym miejscem do takich analiz. Potrzeba spokoju.
Zwróć uwagę, że zwracanie 0 przez funkcje nic nie zmienia w Twoim programie.
W kolejnym obiegu masz znowu zwracaną jedynkę. Itd - 0/1/0/1



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 maja 2015, o 17:26 
Offline
Nowy

Dołączył(a): 14 maja 2015
Posty: 6
Lokalizacja: Północ Polski
Pomógł: 0

Zwracam 0 tak długo aż licznik key-lock przepełni rozmiar zmiennej czyli 255. Dopiero wtedy key_lock jest 0 i sprawdzany jest przycisk w pierwszym warunku if funkcji.



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

Dołączył(a): 25 lut 2015
Posty: 252
Lokalizacja: Lublin
Pomógł: 23

Chyba nie zdajesz sobie sprawy z szybkości tych pętli.
Dlatego przy wyzerowaniu masz znowu zwróconą jedynkę i inkrementację/decrementację licznika przy cały czas wciśniętym przycisku.
Daj sobie delay w głównej, to zobaczysz zmianę



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

Dołączył(a): 31 mar 2015
Posty: 310
Pomógł: 18

kamer napisał(a):
Zwracam 0 tak długo aż licznik key-lock przepełni rozmiar zmiennej czyli 255. Dopiero wtedy key_lock jest 0 i sprawdzany jest przycisk w pierwszym warunku if funkcji.

A pro po - na którym pinie i jakiego portu masz KEY1_PIN bo nie widzę definicji klawiszy - czy to kompiluje się?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 maja 2015, o 19:48 
Offline
Użytkownik

Dołączył(a): 25 lut 2015
Posty: 252
Lokalizacja: Lublin
Pomógł: 23

Przecież przyciski działają, jak Kolega napisał. Definicja pewnie w d_led.h.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 maja 2015, o 20:38 
Offline
Nowy

Dołączył(a): 14 maja 2015
Posty: 6
Lokalizacja: Północ Polski
Pomógł: 0

Przyciski, tak jak kolega wspomniał, są zadeklarowane w pliku d_led.h i działają poprawnie.

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


Co do opóźnień to nie widzę sensu ich użycia - one jedynie opóźnią narastanie/opadanie licznika a nie o to chodzi. Chciałbym żeby przycisk wciśnięty i trzymany powodował tylko jedną zmianę licznika.
Wydaje mi się że wszystko rozumiem z tego kodu i że powinno działać ok, a tak nie jest.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 maja 2015, o 21:32 
Offline
Użytkownik

Dołączył(a): 25 lut 2015
Posty: 252
Lokalizacja: Lublin
Pomógł: 23

Masz Bluebooka, że tak zapytam?
Jak go masz, to masz i biblioteki, możesz zrobić obsługę nieblokującą przycisków wg Mirka.
Jeśli nie, to pozostaje Ci na początek standardowa obsługa "drgań styków" na delay-ach.
Możesz oczywiście znależć bez problemu przykłady w sieci nieblokującej obsługi przycisków na timerach i przerwaniach.
Nie ma siły, aby zrobić nieblokującą obsługę bez tych drugich - oprócz koncepcji Mirka z przekazywaniem zewnętrznych funkcji do funkcji obsługi klawisza:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Drugie pytanie, dalej nie rozumiesz, dlaczego zmienia Ci się licznik o ileś tam cyfr przy przytrzymaniu przycisku?

------------------------ [ Dodano po: 27 minutach ]

Ponieważ multipleksujesz wyswietlacze wstaw sobie tam swoją funkcję i będzie ok zapewne (jak jest wystarczająco często odpalane przerwanie).
Oczywiscie musisz dać deklarację volatile dla funkcji i zmiennych tam wykorzystywanych.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 maja 2015, o 23:43 
Offline
Użytkownik

Dołączył(a): 25 lut 2015
Posty: 252
Lokalizacja: Lublin
Pomógł: 23

Zapodaję Ci przetestowany kod nieblokującej obsługi klawiszy pod Twój przykład na bazie kodu MK:

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


Uwaga na inne piny - u mnie PD0 i PD1 - zmieniasz na swoje.
PORTD i PIND zmieniasz na PORTC i PINC.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 maja 2015, o 06:14 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 mar 2015
Posty: 310
Pomógł: 18

kamer napisał(a):
Przyciski, tak jak kolega wspomniał, są zadeklarowane w pliku d_led.h i działają poprawnie.
Wydaje mi się że wszystko rozumiem z tego kodu i że powinno działać ok, a tak nie jest.

Hmm. Deklaracje są, reset ustawia wejścia, a podciąganie wejść jak rozwiązałeś?



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: 39 ]  Przejdź na stronę 1, 2  Następna strona

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