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



Teraz jest 29 mar 2024, o 09:45


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 16 ] 
Autor Wiadomość
PostNapisane: 12 kwi 2020, o 10:29 
Offline
Nowy

Dołączył(a): 11 kwi 2020
Posty: 12
Pomógł: 0

Witam kolegów i koleżanki. Nie tak dawno temu postanowiłem zgłębić tajniki programowania w języku C. Napisałem mega prosty program który ma zliczać kliknięcia od 0 do 9 jednym przyciskiem( to działa ), a drugim przyciskiem w drugą stronę (nie działa).
Problem w tym, że kiedy przyciskiem- zejdę do 0 i naciskam dalej, wyświetlacz pokazuje 0 (i to jest dobre, rzekł Pan) ale kiedy wcisnę przycisk+ to nie wskakuje 1 jakby można było się spodziewać tylko wskakuje 9 ?!? Dlaczego ja się pytam? :(.
Pomijam fakt optymalizacji kodu ( 3.6kB ), ani dlaczego nie udało mi się wstawić LICZNIKA do funkcji( wywala błąd ).

Coś o mnie: Przesiadłem się z Arduino (jakąś tam wiedzę posiadam), posiadam zestaw uruchomieniowy firmy innej, czekam na zamówioną książkę BB , piszę w MKClipsie, wiedzę do tej pory czerpie z poradników internetowych( jak na razie poradniki pana Mirka są dla mnie najbardziej zrozumiałe w porównaniu do innych dlatego zamówiłem BB). Liczę na jasne wytłumaczenie mojego błędu. Dziękuje.

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: 12 kwi 2020, o 10:43 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

Źle zadeklarowałeś typ zmiennej LICZNIK.
kompilator traktuje je jako zmienna bez znaku czyli masz tylko liczby dodatnie.
Nigdy nie będzie spełniony warunek LICZNIK <0.
Zamiast -1 będzie 255, czyli LICZNIK >9 stąd LICZNIK =9.

Co do optymalizacji zamiast 2x10 if'ów stwórz sobie tablicę.

------------------------ [ Dodano po: 5 minutach ]

Zamiast testować czy LICZNIK po odejmowaniu jest ujemny.
Odejmowanie zrób dopiero po sprawdzeniu czy LICZNIK > 0.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 kwi 2020, o 10:51 
Offline
Nowy

Dołączył(a): 11 kwi 2020
Posty: 12
Pomógł: 0

Faktycznie zmiana na int zmiennej LICZNIK pomogła :) Dziękuje. Co do tablic to jeszcze nie za bardzo rozumie ich działanie, czekam na książkę w celu dalszej edukacji.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 kwi 2020, o 11:03 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

Pokaż jak ten licznik próbowałeś wstawić do funkcji.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 kwi 2020, o 12:21 
Offline
Nowy

Dołączył(a): 11 kwi 2020
Posty: 12
Pomógł: 0

mniej więcej w taki sposób, ale mnie to pokonało :(

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


A tutaj LOG:

compiling process, please wait...
"C:\Users\dom\OneDrive\Dokumenty\MkClipse\AVR Toolchain\bin\avr-gcc" -Wall -Os -Wstrict-aliasing=1 -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega32 -DF_CPU=8000000UL -MMD -MP -MF"Release/main.d" -MT"Release/main.o" -c -o "Release/main.o" "main.c""
main.c: In function 'main':
main.c:54:13: warning: implicit declaration of function 'L_DISPLAY' [-Wimplicit-function-declaration]
L_DISPLAY( LICZNIK );
^
main.c: In function 'L_DISPLAY':
main.c:106:9: error: expected declaration or statement at end of input
}
^
main.c: In function 'main':
main.c:106:9: error: expected declaration or statement at end of input
"C:\Users\dom\OneDrive\Dokumenty\MkClipse\AVR Toolchain\bin\avr-gcc" -Wall -Os -Wstrict-aliasing=1 -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega32 -DF_CPU=8000000UL -MMD -MP -MF"Release/mk_build.d" -MT"Release/mk_build.o" -c -o "Release/mk_build.o" "mk_build.c""

----------------
WARNING --> main.c --> Line: 54



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 kwi 2020, o 12:27 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

Wywołujesz funkcję przed jej deklaracją.
Kompilator nie wie co to jest L_DISPLAY,

Odkomentuj:
//void L_DISPLAY(LICZNIK);
i w nawiasie dopisz typ zmiennej LICZNIK;



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 kwi 2020, o 12:44 
Offline
Nowy

Dołączył(a): 11 kwi 2020
Posty: 12
Pomógł: 0

dalej nic, nie wiem o co mu chodzi z tym nawiasem...

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


LOG:

compiling process, please wait...
"C:\Users\dom\OneDrive\Dokumenty\MkClipse\AVR Toolchain\bin\avr-gcc" -Wall -Os -Wstrict-aliasing=1 -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega32 -DF_CPU=8000000UL -MMD -MP -MF"Release/main.d" -MT"Release/main.o" -c -o "Release/main.o" "main.c""
main.c: In function 'L_DISPLAY':
main.c:106:9: error: expected declaration or statement at end of input
}
^
main.c: In function 'main':
main.c:106:9: error: expected declaration or statement at end of input
"C:\Users\dom\OneDrive\Dokumenty\MkClipse\AVR Toolchain\bin\avr-gcc" -Wall -Os -Wstrict-aliasing=1 -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega32 -DF_CPU=8000000UL -MMD -MP -MF"Release/mk_build.d" -MT"Release/mk_build.o" -c -o "Release/mk_build.o" "mk_build.c""

----------------
ERROR --> main.c --> Line: 106



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 kwi 2020, o 12:51 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

Brakuje ci nawiasów }
- zamykającego funkcję main
- zamykającego funkcję L_DISPLAY


Tak dla porządku, w deklaracjach funkcji dobrze używać tych samych nazw zmiennych co w ich definicjach.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 kwi 2020, o 13:15 
Offline
Nowy

Dołączył(a): 11 kwi 2020
Posty: 12
Pomógł: 0

Teraz działa jak należy :) (chociaż musiałem dodać jeszcze funkcje ZGAS_C; w obsłudze klawiszów, bo zapomniałem o tym i wychodziła kaszanka). Dziękuję za pomoc i cenne wskazówki teraz to będę sobie analizował dogłębnie, by opanować te pisanie funkcji.
Jakby kolega jeszcze wyjaśnił mi o co chodzi w tym zdaniu: "
Tak dla porządku, w deklaracjach funkcji dobrze używać tych samych nazw zmiennych co w ich definicjach." Tzn gdzie?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 kwi 2020, o 13:25 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

W deklaracji czyli tu:
void L_DISPLAY( int LICZNIK );
masz LICZNIK

W definicji czyli tam gdzie zaczyna się ciało funkcji:
void L_DISPLAY( int L_SCAN ) {
masz już L_SCAN

kompilator nie krzyczy bo dla niego najważniejszy jest typ, ale dobrze jest mieć porządek.

Natomiast już jak wywołujesz funkcję to możesz tam wstawiać zmienną o innej nazwie niż w samej deklaracji i to jest normalne.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 kwi 2020, o 13:39 
Offline
Nowy

Dołączył(a): 11 kwi 2020
Posty: 12
Pomógł: 0

Dziękuję koledze za okazaną pomoc w moim problemie, teraz będę działał dalej próbując uruchamiać dalsze pozycje wyświetlacza :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 kwi 2020, o 13:47 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

Poczytaj o tablicach, bo na piechotę z samymi if-ami daleko nie zajedziesz.
Przemyśl jeszcze raz sterowanie portem, bo ta funkcja ZGAS_C jet niepotrzebna.
Powinieneś od razu ustawiać port tak jak Ci potrzebny.
Przemyśl jeszcze raz te definiecje:
#define CYFRA0 PORTB &= 0xC0 // Wlacz Cyfry PORT B0-B6
czy na pewno tam powinien być operator &?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 kwi 2020, o 14:07 
Offline
Nowy

Dołączył(a): 11 kwi 2020
Posty: 12
Pomógł: 0

auers napisał(a):
Poczytaj o tablicach, bo na piechotę z samymi if-ami daleko nie zajedziesz.
Przemyśl jeszcze raz sterowanie portem, bo ta funkcja ZGAS_C jet niepotrzebna.
Powinieneś od razu ustawiać port tak jak Ci potrzebny.
Przemyśl jeszcze raz te definiecje:
#define CYFRA0 PORTB &= 0xC0 // Wlacz Cyfry PORT B0-B6
czy na pewno tam powinien być operator &?



Tak, tak na pewno będę czytać kiedy przyjdzie książka :) a co do operatora & to jaki powinienem zastosować? przecież na każdą cyfrę muszę ustawić stan niski na konkretnych bitach i wysoki na innych na jednym porcie tak jak w tym przykładzie cyfry 0 tzn
0xC0-----> 0b11000000, cały port B mam ustawiony na cyfry które ustawiam stanem niskim, a że tak to rozumie iż cały PORTB jest ustawiony na stan wysoki to tym operatorem & wstawiam w konkretne bity stan niski. Czy źle to rozkminiam?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 kwi 2020, o 14:16 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

Na początek spróbuj z samym =
Operator & stosujesz np jak chcesz wygasić konkretne bity nie zmieniając innych.
Jeżeli tego portu nie wykorzystujesz do innych celów, to Cię nie interesuje co na nim było.
Po prostu ustaw to co potrzebujesz.

A jak opanujesz podstawy to poczytaj o maskowaniu.
Wówczas & będzie już niezbędny.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 kwi 2020, o 14:27 
Offline
Nowy

Dołączył(a): 11 kwi 2020
Posty: 12
Pomógł: 0

o kurka... działa bez &.... hmm... no jeszcze sporo nauki mam w tym temacie:) Czyli za każdym razem ten port się ustawia w stan wysoki przy zmianie cyfry tak? a ja samym = gaszę tylko te bity które potrzebuje tak?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 kwi 2020, o 14:37 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

Za bardzo kombinujesz.
Nic się samo z siebie nie ustawia.
Po prostu jak masz = to na porcie ustawia się to co wymuszasz przez = .
Jak dałeś &= to najpierw sprawdzany jest poprzedni stan PORT'u , a dopiero później kasowane były te PINY którym odpowiadało 0 za &=
Jak miałeś wcześniej cały port wyzerowany to już nic Ci się ni zapalało.



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 7 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