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



Teraz jest 28 paź 2024, o 20:33


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 31 ]  Przejdź na stronę 1, 2  Następna strona
Autor Wiadomość
PostNapisane: 22 lut 2012, o 12:18 
Offline
Użytkownik

Dołączył(a): 20 lut 2012
Posty: 28
Pomógł: 0

Cześć wszystkim,

Chcę, by po wciśnięciu klawisza, na wyświetlaczu pojawiała mi się kolejna cyfra. Jeśli dorzucę pętlę np. for, usunę warunek if (przerwij1()) i _delay_ms(100) to wyświetlają mi automatycznie cyfry aż do osiągnięcia zadanej wartości. Ja chcę natomiast, by zliczało ręcznie (wyświetlało kolejną cyfrę po wciśnięciu klawisza). Ma ktoś pomysł, dlaczego to nie 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.


gdzie przerwij1

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: 22 lut 2012, o 12:55 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 gru 2011
Posty: 110
Lokalizacja: Dolnyśląsk
Pomógł: 0

Błąd znajduje się w funkcji przerwij1. Przypomnij sobie budowę warunków if.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2012, o 13:25 
Offline
Użytkownik

Dołączył(a): 20 lut 2012
Posty: 28
Pomógł: 0

Qurde, nie widzę.. :/ Funkcję przerwij1 zrobiłem na podstawie książki ze strony 180. Dodałem teraz dodatkowo '{}'nawiasy w wywołaniu funkcji "inkrement_switch" po IFie, ale też nie działa.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2012, o 13:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 gru 2011
Posty: 110
Lokalizacja: Dolnyśląsk
Pomógł: 0

To podpowiem że za każdym razy gdy funkcja się kończy zwraca wynik '0' a rozumiem że chcesz by zwracała 1 gdy klawisz jest wciśnięty.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2012, o 13:39 
Offline
Użytkownik

Dołączył(a): 20 lut 2012
Posty: 28
Pomógł: 0

zamieniłem na
Kod:
{_delay_ms(80);
if (SWITCH_ON1) return 0;
} return 1;
Wyświetla mi się "0", ale nie zlicza. Chyba coś jeszcze jest nie ok.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2012, o 13:46 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 gru 2011
Posty: 110
Lokalizacja: Dolnyśląsk
Pomógł: 0

Zostaw tak jak było i dodaj przed ostatnim returnem 'else' dalej spróbuj sam :)


edit: w sensie ta funkcja juz na oko powinna być ok.
A i przydały by się komentarze żeby wiadomo co ma co robić. Nie tylko dla nas ale dla samego siebie powinieneś komentować kod. Z resztą w książce była o tym mowa.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2012, o 14:30 
Offline
Użytkownik

Dołączył(a): 20 lut 2012
Posty: 28
Pomógł: 0

Kod:
uint8_t przerwij1(void)
{
   if (SWITCH_ON1)
      {
      _delay_ms(80);
      if (SWITCH_ON1) return 1;
      } else  return 0;
}

Dalej nie działa.. Jaka jest różnica między moją funkcją przerwij1 a tą z książki? Tam nie ma "else". Nie bardzo czaję jaka jest różnica. Jak używałem przerwij1 bez "else" w innych funkcjach, które sobie stworzyłem, to działała.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2012, o 14:37 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 gru 2011
Posty: 110
Lokalizacja: Dolnyśląsk
Pomógł: 0

Dobra wybacz mój błąd zapomniałem że 'return' kończy funkcje :P

w ramach przeprosin spróbuje się bardziej wgłębić w to i sprawdzić co jest nie tak.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2012, o 14:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 gru 2011
Posty: 110
Lokalizacja: Dolnyśląsk
Pomógł: 0

aaa panie po pierwszym ifie chyba zapomniałeś o klamrach

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


zwracasz do funkcji if '1' jeśli był wciśnięty guzik lub zero jeżeli nie.
U mnie to w ogóle się nie kompiluje



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2012, o 15:00 
Offline
Użytkownik

Dołączył(a): 20 lut 2012
Posty: 28
Pomógł: 0

Tak, tak, zorientowałem się po Twojej pierwszej podpowiedzi. Dałem coś takiego:
Kod:
if (przerwij1())
   {
   licznik4++;
   _delay_ms(1000);
   cy4=licznik4;
   }
Ale dalej nie działa. He, he, ale buła :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2012, o 15:08 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 gru 2011
Posty: 110
Lokalizacja: Dolnyśląsk
Pomógł: 0

A nie wydaje Ci się że za każdym razem gdy wywołujesz funkcje ' void inkrement_switch (void)' zerujesz wszystkie zmienne 'cyX' ? :)

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



Co w ogóle teraz się dzieje na wyświetlaczach ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2012, o 15:11 
Offline
Moderator
Avatar użytkownika

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

DidekxD napisał(a):
A i przydały by się komentarze żeby wiadomo co ma co robić. Nie tylko dla nas ale dla samego siebie powinieneś komentować kod. Z resztą w książce była o tym mowa.


A ja myślę, że od tego trzeba wręcz zacząć bo na prawdę przykro mi ale sam jestem pełen podziwu dla kolegi DidekxD, że coś podpowiada i widzi w tym kodzie - ja niestety na razie nie mogę się połapać - a nie mam na razie dużo czasu na analizę ..... dlatego mnie tu nie widać....

proszę jak dla mnie jeszcze raz określić cele

pokazać kod z kometarzami

umieścić go w znacznikach syntax = c zamiast code (tak jak to zrobiłem za kolegę w pierwszym poście) - nie czyta się go teraz lepiej ?

To potem postaram się pomóc o ile wcześniej się nie uda komuś innemu.

_________________
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: 22 lut 2012, o 15:25 
Offline
Użytkownik
Avatar użytkownika

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

A czy kolega nie zapomniał o pętli nieskończonej while?
Bo jeśli tak, to program wykona się raz zanim jeszcze wciśnie się przycisk i potem stoi.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2012, o 15:32 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 gru 2011
Posty: 110
Lokalizacja: Dolnyśląsk
Pomógł: 0

Sądzę że to tylko fragment większego kodu. Dla tego nie widać tego o czym wspomniałeś.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2012, o 15:40 
Offline
Użytkownik
Avatar użytkownika

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

Nie wykluczone, ale skoro nie widać, to warto zapytać.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2012, o 16:59 
Offline
Użytkownik

Dołączył(a): 20 lut 2012
Posty: 28
Pomógł: 0

Ok, a więc wklejam kod z dopisanymi komentarzami, mam nadzieje, ze w miarę zrozumiale opisałem (dla siebie w przyszłości też :D). Pousuwałem inne funkcje, by nie zamydlać interesującego kodu, mam nadzieję, że żadne starocia nie zostawiłem.
Chodzi mi o to, by każde wciśnięcie przycisku wyświetlało na wyświetlaczu cyfrę o 1 większą
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: 22 lut 2012, o 17:28 
Offline
Użytkownik
Avatar użytkownika

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

A dlaczego jest zakomentowana linijka nr 6 załączająca plik opóźnień?

I jeszcze jedno mi się rzuciło w oczy: każde wejście w funkcję obsługi przycisku
void inkrement_switch (void)
powoduje najpierw zerowanie wszystkich wyświetlaczy. A więc już przy drugim wciśnięciu klawisza licznik będzie nadal pokazywał 1.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2012, o 17:48 
Offline
Użytkownik

Dołączył(a): 20 lut 2012
Posty: 28
Pomógł: 0

Linijkę 6 zakomentowałem przypadkowo, jak wysyłałem post z kodem (podczas usuwania zbędnego kodu programu).
Cytuj:
I jeszcze jedno mi się rzuciło w oczy: każde wejście w funkcję obsługi przycisku
void inkrement_switch (void)
powoduje najpierw zerowanie wszystkich wyświetlaczy. A więc już przy drugim wciśnięciu klawisza licznik będzie nadal pokazywał 1
To było to :) Usunąłem zerowanie na starcie i śmiga tak jak chciałem:)
Wielkie dzięki wszystkim za zainteresowanie i okazaną pomoc :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2012, o 17:51 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 gru 2011
Posty: 110
Lokalizacja: Dolnyśląsk
Pomógł: 0

DidekxD napisał(a):
A nie wydaje Ci się że za każdym razem gdy wywołujesz funkcje ' void inkrement_switch (void)' zerujesz wszystkie zmienne 'cyX' ? :)

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




Czyli to o czym wspominałem wyżej :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2012, o 18:00 
Offline
Użytkownik
Avatar użytkownika

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

Cieszę się, że mogłem pomóc, choć ja też jestem początkującym i też często potrzebuję pomocy. Tak na marginesie powiem, że również jestem na etapie zabawy wyświetlaczami LED i również miałem zamiar pobawić się przyciskiem i licznikiem wciśnięć. Dlatego też pozwolę sobie skopiować pomysł kolegi i popracować na żywym organizmie. :mrgreen:



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2012, o 18:01 
Offline
Użytkownik

Dołączył(a): 20 lut 2012
Posty: 28
Pomógł: 0

Cytuj:
Czyli to o czym wspominałem wyżej
Faktycznie :D Tak się skupiłem na napisaniu komentarzy, że nie przetrawiłem trafnej uwagi. Thx :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2012, o 18:04 
Offline
Użytkownik
Avatar użytkownika

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

Jednak my, początkujący lepiej umieszczajmy całe swoje kody, bo po lekturze pierwszego postu nie wyłapałbym tego. A jak kolega już umieścił cały kod, to od razu wpadło w oczy.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2012, o 22:05 
Offline
Moderator
Avatar użytkownika

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

A ja się cieszę, że udało się rozwiązać problem bez mojej pomocy ;) SUPER! i gratulacje

przy okazji panowie podpowiem wam tajemnicę moją - mnie np najlepiej się uczy i utrwala materiał poprzez to że staram się kogoś uczyć lub podpowiadać - a nawet jeśli popełnię błędy i ktoś mnie poprawi - to co? to tylko z coraz większą korzyścią dla mnie.

Dlatego takie czynne pomaganie innym - wg mnie potęguje efekt uczenia się samemu ;) - dostrzegacie też to ?

_________________
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: 22 lut 2012, o 22:46 
Offline
Użytkownik
Avatar użytkownika

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

Oczywiście, że dostrzegamy zalety udzielania się na tymże forum w taki właśnie, a nie inny sposób, czyli poprzez pomaganie innym i braniem czynnego udziału w rozwiązywaniu problemów. Już kiedyś to napisałem: nie ma lepszego debbugera nad to forum! Basta.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lut 2012, o 11:49 
Offline
Użytkownik

Dołączył(a): 20 lut 2012
Posty: 28
Pomógł: 0

Żeby nie zakładać nowego wątku...
Zmodyfikowałem powyższy kod dodając funkcję dioda. Powoduje ona zaświecenie się diodek od lewej do prawej a potem od prawej do lewej. Chcę osiągnąć taki efekt, że cały czas będzie uruchomiona funkcja dioda() natomiast w momencie załączenia funkcji przerwij() - (wciśnięcie przycisku), wyskoczę z f. dioda() i będę w f. inkrement_switch(). Jeżeli umieszczę IF(przerwij) na końcu f. dioda(), to muszę się idealnie wstrzelić (aż się skończy wykonywać druga pętla for i nie zacznie pierwsza), by wyskoczyć z tej funkcji - w tej wersji wklejam kod.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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

to wyskoczę z FOR.
Jak sobie poradzić w takiej sytuacji? Każda sugestia mile widziana :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lut 2012, o 12:10 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2012
Posty: 193
Pomógł: 6

Myślę że w rozdziale pt. "Systemy czasu rzeczywistego" znajdziesz odpowiedz na nurtującą Cię zagadkę

Pozdrawiam
KoreX



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lut 2012, o 12:26 
Offline
Użytkownik

Dołączył(a): 20 lut 2012
Posty: 28
Pomógł: 0

Aha, jeszcze do niego nie doszedłem. Skoro tak, to odkładam to pytanie na potem :D
Pozdro!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lut 2012, o 12:48 
Offline
Użytkownik
Avatar użytkownika

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

Na samym początku powiem, że w wyniku instrukcji z linii 49 i 55 zapali się tylko 7 diod, i zgaśnie tylko 7, a dokładniej jedna zostanie zapalona. Przerabiałem to dość dokładnie. Warunek ten musi wyglądać mniej więcej tak:

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


Kluczową rolę odgrywa tu deklaracja zmiennej i. Musi ona być typu int, a nie uint.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lut 2012, o 13:31 
Offline
Użytkownik

Dołączył(a): 20 lut 2012
Posty: 28
Pomógł: 0

Hm, mi działa z uint8_t :) Przeanalizowałem post kolegi sprzed ok. miesiącahttp://forum.atnel.pl/topic128.html.
Zdaje mi się, że jest mała różnica między naszymi licznikami. Podałeś:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
ja natomiast
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Czyli wg. mnie moje "i" nie dochodzi do -1 (czyli de facto 255), czyli mieszczę się w zakresie uint8_t.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lut 2012, o 13:38 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 gru 2011
Posty: 110
Lokalizacja: Dolnyśląsk
Pomógł: 0

Tak ale zostaje Ci jedna dioda zapalona :) nie gasi wszystkich :) jak przeanalizujesz moje rozwiązania z tamtego tematu to zobaczysz że podałem dwa rozwiązania :) Takie jak podał kolega worner i takie jak ty, tyle że z dodatkową zmienną która sprawia że wszystkie diody się gaszą :)

Z resztą.
Jest na to 1000 sposobów :) (Jak powiedział sam Pan Mirek)



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: 31 ]  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 4 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