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



Teraz jest 28 mar 2024, o 18:25


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 24 ] 
Autor Wiadomość
PostNapisane: 25 cze 2018, o 10:32 
Offline
Użytkownik

Dołączył(a): 06 wrz 2017
Posty: 93
Pomógł: 0

Witam.Mam pytanko odnośnie parametrów.Dlaczego w wywołaniu funkcji muszę wpisywać (0,0) żeby kompilator nie wyrzucał błędu?Podam 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.


A jak zrobię tak to funkcja oblicza wartość.

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

Pozdrawiam.

------------------------ [ Dodano po: 8 minutach ]

A jak wpisze tak to wartości są brane z wewnątrz funkcji?A wartości są pomijane(100,100).

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: 25 cze 2018, o 10:56 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 sty 2016
Posty: 1146
Lokalizacja: Kraków
Pomógł: 93

wrctomi napisał(a):
Dlaczego w wywołaniu funkcji muszę wpisywać (0,0) żeby kompilator nie wyrzucał błędu?
Ponieważ funkcja przyjmuje dwa argumenty (oba typu uint8_t). A jeżeli funkcja jest zadeklarowana z argumentami, więc musisz je podać przy wywołaniu funkcji.
wrctomi napisał(a):
A jak wpisze tak to wartości są brane z wewnątrz funkcji?A wartości są pomijane(100,100).
Tak się dzieje, ponieważ przy wywołaniu funkcji zmienne a i b mają wartości 100 i 100. Natomiast niżej przypisujesz tym zmiennym nowe wartości. Więc te nowe będą brane pod uwagę przy obliczeniu wyniku.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 cze 2018, o 11:27 
Offline
Użytkownik

Dołączył(a): 06 wrz 2017
Posty: 93
Pomógł: 0

Czyli jeśli chcę wywołać funkcje która posiada wewnątrz jakieś parametry np.2 to wywołuje ją tak funkcja(0,0);??Żeby zwróciła to co ma w środku?.
A jeśli wewnątrz nie ma żadnych innych wartości np.przy dodawaniu funkcja(100,100).Przy wywołaniu funkcja zwróci wartość 200 ?

------------------------ [ Dodano po: 19 minutach ]

Czy dobrze rozumuje?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 cze 2018, o 12:08 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 sty 2016
Posty: 1146
Lokalizacja: Kraków
Pomógł: 93

Chyba nie do końca. Jeśli chcesz, żeby funkcja coś zwróciła, to w funkcji używasz "return" (w Twoim przypadku return a+b -> zwraca sumę a i b)
Jeżeli chcesz przekazać do funkcji jakieś zmienne, na których będziesz wykonywał obliczenia, to wtedy przy deklaracji funkcji zaznaczasz, ile i jakiego typu zmiennych chcesz używać. A potem wywołujesz funkcję z wartościami, na których chcesz operować.
Spróbuj jaśniej opisać, jak to widzisz



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 cze 2018, o 14:58 
Offline
Użytkownik

Dołączył(a): 06 wrz 2017
Posty: 93
Pomógł: 0

Jeśli chcę przekazać jakieś zmienne do funkcji muszą to być zmienne globalne tak?I je można użyć jako parametry funkcji?

------------------------ [ Dodano po: 12 minutach ]

uint8_t funkcja(uint8_t,uint8_t);
Funkcja która zwraca uint8_t a parametry do czego służą?Mógłby ktoś napisać przykład?I wyjaśnić.Z góry dziękuje za cierpliwość.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 cze 2018, o 15:32 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

wrctomi napisał(a):
Jeśli chcę przekazać jakieś zmienne do funkcji muszą to być zmienne globalne tak?I je można użyć jako parametry funkcji?
Nie. Zmienne globalne są widoczne w całym projekcie, więc ich nie musisz przekazywać (choc to nie jest zabronione). Przekazuje się zmienne lokalne.
wrctomi napisał(a):
uint8_t funkcja(uint8_t,uint8_t);
Funkcja która zwraca uint8_t a parametry do czego służą?Mógłby ktoś napisać przykład?I wyjaśnić.Z góry dziękuje za cierpliwość
To jak z obiadem. Masz wyjście (zwracany parametr), czyli coś co uzyskałeś w garnku. Ale aby funkcja mogła robić coś co nie jest zawsze tym samym obiadem, to musisz móc wkładać jej dane wejściowe poprzez parametry.
Przekazując składniki jako parametry do funkcji gotuj obiad, dostajesz z niej wynik czyli obiad na talerzu :).

--
Pozdrawiam,
Robert

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

Jak nie przekazujesz parametrów przy wywołaniu funkcji nie ma wejściowych parametrów. Czyli przy wywołaniu nie dostarczasz jej zmiennych danych do działania. Oczywiście funkcja może bazować na zmiennych globalnych, ale nie jest to porządne rozwiązanie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 cze 2018, o 15:59 
Offline
Użytkownik

Dołączył(a): 06 wrz 2017
Posty: 93
Pomógł: 0

wkładać jej dane wejściowe poprzez parametry. A skąd te dane spływają.Proszę o jakiś praktyczny przykład .



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 cze 2018, o 16:29 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1020
Lokalizacja: Trójmiasto
Pomógł: 188

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


Teraz gdy chcemy zapalić diodę led o numerze 2 poprostu wywołujemy funkcję z numerem tej diody, wywołana funkcja porówna przekazany parametr z warunkami, i jeśli któryś warunek będzie spełniony wykona instrukcję czyli zapali diodę.

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

Tu masz z kolei bardziej rozbudowaną funkcję do której przekazujesz dwa parametry - numer diody i czy ma zostać zapalona czy zgaszona (0 zgaś, 1 i więcej - zapal), natomiast przed nazwą funkcji nie ma void tylko jest uint8_t co oznacza że funkcja coś zwraca - w tym wypadku stan całego portu - czyli podłączonych wszystkich ledów.



Ostatnio edytowano 25 cze 2018, o 16:39 przez xentis, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 cze 2018, o 16:32 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

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


--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 cze 2018, o 17:36 
Offline
Użytkownik

Dołączył(a): 06 wrz 2017
Posty: 93
Pomógł: 0

Zaczynam rozumieć. A jak zrobić żeby funkcja jeśli się wykona dała jak gdyby potwierdzenie wykonania,zakończenia np do zmiennej globalnej w postaci np 1.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 cze 2018, o 17:39 
Offline
Użytkownik
Avatar użytkownika

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

witam,
albo funkcja która nic nie zwraca, ale na podstawie parametrów coś wykonuje.

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

wkodzie wpis

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

taki przykład. :)

albo np. funkcja zwracająca stan na porcie B, funkcji nie podajemy parametrów.

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


albo funkcja zwracająca stan bitu 0 na porcie B, funkcji nie podajemy parametrów bo np. nie potrzebujemy.

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


......................................................
wrctomi napisał(a):
A jak zrobić żeby funkcja jeśli się wykona dała jak gdyby potwierdzenie wykonania,zakończenia np do zmiennej globalnej w postaci np 1.


a można w funkcji przecież zmienić jakąś zmienną globalną na 1. np. flaga_mojej_funkcji.

pozdrawiam.

------------------------ [ Dodano po: kilkunastu sekundach ]

dopiszę................w ostatnim przykładzie.



Ostatnio edytowano 25 cze 2018, o 18:26 przez Daro69, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 cze 2018, o 18:16 
Offline
Użytkownik

Dołączył(a): 06 wrz 2017
Posty: 93
Pomógł: 0

Muszę poćwiczyć.Dziękuje Wszystkim za podpowiedzi.Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 cze 2018, o 18:24 
Offline
Użytkownik

Dołączył(a): 06 wrz 2017
Posty: 93
Pomógł: 0

Witam.Czy można w tej funkcji zrobić while (ms++). Jak to zrobić?


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: 28 cze 2018, o 22:21 
Offline
Użytkownik
Avatar użytkownika

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

Witam,
Tak zetknąłem na kod i ...
Po pierwsze primo:
Z tego co pamiętam to funkcji _deay_ms nie podajemy parametrów z przecinkiem.
Po drugie primo:
Czy kolega ma świadomość że w funkcji bodajże "licz", blokuje pętlę główna pętlą while.?
Po trzecie primo:
... hmm... Z uwagi na te delaye ...
Chyba czas zainteresować się timerami i przerwaniami. :) Powaga. :)
I wszystko stanie się prostsze. ;)
Pozdrawiam.

Wysłane z mojego Lenovo K33a42 przy użyciu Tapatalka



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 cze 2018, o 22:24 
Offline
Użytkownik
Avatar użytkownika

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

W drugim primo,
chodziło mi i funkcję "moja_fun" a nie o licz.

Wysłane z mojego Lenovo K33a42 przy użyciu Tapatalka



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lip 2018, o 07:39 
Offline
Użytkownik

Dołączył(a): 06 wrz 2017
Posty: 93
Pomógł: 0

Witam.A jak zrobić żeby funkcja nie blokowała głównej pętli (while).A co do przecinka to tam go nie ma.Jest makro definicja
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Chyba nazwa może być z _ ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lip 2018, o 09:34 
Offline
Użytkownik

Dołączył(a): 20 sty 2014
Posty: 56
Pomógł: 4

Kolega wyżej napisał: przerwania, timery.
Co do przecinka to chodzi o tą linię:
_delay_ms(0.95); -> zły argument funkcji
Tak nazwa makra może zawierać '_'

Proponuję zacząć od nauki języka, jakaś książka, tutorial :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lip 2018, o 09:56 
Offline
Użytkownik

Dołączył(a): 06 wrz 2017
Posty: 93
Pomógł: 0

Dzięki.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lip 2018, o 19:06 
Offline
Użytkownik

Dołączył(a): 22 gru 2013
Posty: 296
Lokalizacja: Szczecin
Pomógł: 47

Panowie nie wprowadzajcie w błąd.
Funkcja _delay_ms() może przyjmować argumenty z "przecinkiem"
Taki jest prototyp (deklaracja): void _delay_ms(double __ms).
https://www.microchip.com/webdoc/AVRLibcReferenceManual/group__util__delay_1gad22e7a36b80e2f917324dc43a425e9d3.html



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lip 2018, o 20:12 
Offline
Użytkownik
Avatar użytkownika

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

krish napisał(a):
Panowie nie wprowadzajcie w błąd.

no tak, :) double.
z tym że w tym przypadku i tak potraktuje to 0.95 jako 1. :P
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

ale fakt, przyjmuje parametr double. czyli źle pamiętałem , a zapis "_delay_ms(0.95);" jest poprawny. 8-)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lip 2018, o 22:09 
Offline
Użytkownik

Dołączył(a): 22 gru 2013
Posty: 296
Lokalizacja: Szczecin
Pomógł: 47

Faktem jest, że później te funkcje mogą się różnie zachowywać (np. różna dokładność) i nie informować o tym.
W pewnych szczególnych przypadkach dokumentacja wskazuje, że nawet nie będzie opóźnienia.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lip 2018, o 09:18 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Daro69 napisał(a):
z tym że w tym przypadku i tak potraktuje to 0.95 jako 1.

Chyba niekoniecznie. Zwróć uwagę, że w miejscu, które zaznaczyłeś w kodzie, to __tmp jest porównywane z wartością1.0, a __tmp != __ms, chyba że F_CPU=4000, co jest raczej rzadko spotykane ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lip 2018, o 10:08 
Offline
Użytkownik
Avatar użytkownika

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

O kurczaki, ...
Racja!!!
dzięki @andrews. :)

Wysłane z mojego Lenovo K33a42 przy użyciu Tapatalka



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lip 2018, o 16:51 
Offline
Użytkownik
Avatar użytkownika

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

Korekta do pierwszego primo. :oops:
Po przeanalizowaniu na spokojnie. :)
założenia: taktowanie 8MHz,

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

__tmp = (8e6 / 4e3) *1 = 2000.
ticks = __temp.
_delay_loop_2(2000) , trwa 4cykle razy 2000, = 8000 cykli. 8000/8000000 = (0,001 s).

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

__tmp = (8e6 / 4e3) * 0.95 = 1900.
ticks = __tmp.
_delay_loop_2(1900) , trwa 4cykle razy 1900, = 7600 cykli. 7600/8000000 = (0,00095 s).

dzięki @krish, dzięki @andrews,
sorka @wrctomi.
musiałem naprostować.
:mrgreen:



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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