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



Teraz jest 19 lut 2026, o 09:44


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 
Autor Wiadomość
PostNapisane: 15 sie 2016, o 09:16 
Offline
Użytkownik

Dołączył(a): 28 maja 2016
Posty: 469
Lokalizacja: Katowice
Pomógł: 1

Cześć.
analizuję kod z bluebooka ze strony 190.
W górnej części programu jest definicja dla preprocesora odnosząca się do diody led oraz klawisza - i to jest dla mnie zrozumiałe.
Pytanie moje dotyczny deklaracji funkcji:
Kod:
unit_t klawisz_wcisniety (void);


wertując książkę i czytjąc informację o tej deklaracji wywnioskowałem ,że nie ma ona żadnej wartości, co oznacza,że jest równa 0. czy to prawda?

w pętli głównej jest wywołana ta funkcja po if
Kod:
if(klawisz_wcisniety() )    //jeśli klawisz wciśnięty


rozumiem to następująco:

do mikrokontrolera jest podłączona dioda led, aby diodę zaświecić musimy podać stan niski, ponieważ jest podłączona katodą.
Na innym pinie jest wejście i podciągnięty wewnętrzny rezystor, który wymusza stan wysoki - do tego pinu jest podłączony klawisz.

I teraz aby włączyć diodę, to użyjemy naszej funkcji ''klawisz wcisniety" ( która ma wartość zero). czyli po nasićnięciu klawisza podajemy właśnie to zero z funkcji i dioda się zapali.
Kod:
while (1)
{
if( klawisz_wcisniety() )
{
LED_TOG;
_delay_ms(200);


Pytanie nr 2. czy to jest koniec programu? Pytam , ponieważ na kolejnej stronie jest kolejny kod i zastanawiam się czy to jest druga część tego kodu, czy już całkiem coś innego.


Wojtek:)

_________________
Nikt nie mówił,że będzie łatwo...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 sie 2016, o 09:25 
Offline
Użytkownik

Dołączył(a): 10 lip 2015
Posty: 334
Pomógł: 32

Mocno się pogubiłeś. Funkcja klawisza zwraca 0, gdy klawisz nie jest wciśnięty, a jakąś wartość, gdy jest wciśnięty.
Czyli dla wyrażenia warunkowego jest fałszem (zerem), lub prawdą (liczbą inną niż zero).
Sprawdź, co kryje się pod magicznym LED_TOG, a zobaczysz co dzieje się w tym kodzie ze stanem wyjścia.

Co do drugiego pytania. Potrzebujesz jeszcze definicji funkcji obsługi klawisza i LED_TOG, ustawienia wyjścia portu dla diody i musisz dopisać funkcję main.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 sie 2016, o 11:03 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 sty 2013
Posty: 1760
Pomógł: 196

Witam
wojciechgorzolka napisał(a):
Pytanie moje dotyczny deklaracji funkcji:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


wertując książkę i czytjąc informację o tej deklaracji wywnioskowałem ,że nie ma ona żadnej wartości, co oznacza,że jest równa 0. czy to prawda?

Jak podkreślił kol.HomoChemicus troszkę Cię poniosło, a zaczęło się od czytania o deklaracji.
Jeśli przed "klawisz_wciśnięty" znajduje się uint8_t to jednak jakąś wartość ma ( zwraca ).
Deklaracja jak to deklaracja - coś tam wspomina o funkcji, ale należy przyjrzeć się samej funkcji a tam już widzimy że:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

...i te "returny" są wartością "klawisz_wciśnięty".

Pozdr.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 sie 2016, o 12:50 
Offline
Użytkownik

Dołączył(a): 28 maja 2016
Posty: 469
Lokalizacja: Katowice
Pomógł: 1

a czy możecie (tak na chłopski rozum) wyjaśnić mi wyrażenie :
Kod:
!(PINC & KEY_PIN)


ja to rozumiem tak,że całe wyrażenie jest zanegowane:
Na pinie PC6 jest stan wysoki,
PINC - czyli jest podciągnięty wewnętrzny rezystor

_________________
Nikt nie mówił,że będzie łatwo...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 sie 2016, o 14:09 
Offline
Użytkownik

Dołączył(a): 10 lip 2015
Posty: 334
Pomógł: 32

PINC, to rejestr stanu pinów portu C. W tym fragmencie sprawdzasz, czy na PC6 jest stan wysoki, a następnie negujesz (bo stan wciśnięcia klawisza, to stan niski).


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 sie 2016, o 14:19 
Offline
Użytkownik

Dołączył(a): 28 maja 2016
Posty: 469
Lokalizacja: Katowice
Pomógł: 1

dziękuję za to logiczne wytłumaczenie. :)

_________________
Nikt nie mówił,że będzie łatwo...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 sie 2016, o 16:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

cześć,
wojciechgorzolka napisał(a):
a czy możecie (tak na chłopski rozum) wyjaśnić mi wyrażenie :
Kod:
!(PINC & KEY_PIN)

To może teraz tak trochę obrazowo. :)
Jeżeli kolega już załapał, to może komuś kiedyś coś rozjaśni. :D

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
/*w rejestrze DDRC noga PC6 jako wejście, _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 rejestrze PORTC noga PC6 do vcc- (delikatnie podciągana do vcc żeby nie pływało napięcie jeżeli nic nie podłączysz)*/

/*PINC - to rejestr wejściowy - przechowuje stan na nóżkach,*/
/*ponieważ wyżej wpisaliśmy podciąganie na PB6, to w rejestrze PINC _1__ ____, */
/*a teraz jeżeli wciśniesz klawisz na PB6, to wymusi w rejestrze PINC _0__ ____ */
/*KEY_PIN w tym przykładzie to PB6 czyli 0100 0000 */
/* PINC & KEY_PIN */
/* ( _0__ ____ & 0100 0000 ) jeżeli wciśnięty to wynikiem jest 0000 0000 -fałsz 0*/
/* ( _1__ ____ & 0100 0000 ) jeżeli nie wciśnięty to wynikiem jest 0100 0000 -prawda 1*/

/*po operacji ! wyniki się negują - czyli w wyrażeniu
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
prawdą (1) jest wciśnięty, a fałszem (0) nie wciśnięty*/

Reasumując: sprawdzamy czy jest nie prawdą że na wejściu PINC jest stan wysoki w miejscu określonym przez KEY_PIN, :roll:
pozdrawiam Darek


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 sie 2016, o 18:28 
Offline
Użytkownik

Dołączył(a): 28 maja 2016
Posty: 469
Lokalizacja: Katowice
Pomógł: 1

no teraz to już chyba każdy zrozumie. jestem pod wrażeniem:) , to jeszcze poprosiłbym kolegę Darka o wyjaśnienie w podobny sposób przykładu ze strony 190 bluebooka , odnośnie przykładu z :
Kod:
unit8_t klawisz_wcisniety(void)

_________________
Nikt nie mówił,że będzie łatwo...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 sie 2016, o 19:31 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 sty 2013
Posty: 1760
Pomógł: 196

Witam
Co prawda nie Darek, ale:
...oj nie chce się czytać, albo kartki się posklejały ;)
Przecież na samym początku masz:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

a we właściwej funkcji w miejsce KEY_DOWN... a zresztą sam chyba sobie dopowiesz cd.

Pozdr.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 sie 2016, o 19:45 
Offline
Użytkownik
Avatar użytkownika

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

Przykład ze strony 190 BB nie zawiera wyrażenia "unit8_t", natomiast jest uint8_t(unsignet integer 8-bitowy). Jest to informacja dla kompilatora - jaką wartość może posiadać funkcja klawisz_wcisniety() - 0000 0001 lub 0000 0000. "void" - funkcja pusta - nie jest modyfikowana żadna zmienna wcześniej deklarowana.



Ostatnio edytowano 15 sie 2016, o 20:26 przez Wirnick, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 sie 2016, o 19:51 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

:) A proszę.
Jeszcze trochę i napiszemy tu BB od nowa - tak na chłopski rozum.
Oby tylko nie wyszło "uczył Marcin Marcina" :lol: bo ja tez początkujący :P
A.. w razie czego .. Ktoś mnie naprostuje ;)


To jest dla przykładu funkcja która także sprawdza stan na pinie - dokładnie jak w poprzednim poście.
dodatkowo odczekuje XXms i jeżeli po tym czasie nadal jest stan niski na pinie zwraca wartośc 1, jeżeli nie to wartość 0.

Cały warunek został dla lepszej czytelności zastąpiony w makro na jedno krótkie KEY_DOWN. (BB. w linijce #define ....)
Teraz zamiast pisać:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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

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

to przy wywołaniu funkcji w pętli, w momencie naciśnięcia przycisku na dłużej niż te ms , będzie się wykonywać TOGowanie, a po TOG ponowne odczekanie z ifa w pętli ms200.

:) czyta czyta ;) , tylko powoli pisze. :(
a.. to do kolegi. :D
W sumie to ja nie mam monopolu na pomaganie :D - może każdy po swojemu tłumaczyć, aż dotrze ;)


Autor postu otrzymał pochwałę


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

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