Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

C - Włączanie i wyłączanie diody za pomocą jednego przycisku

szymon12w 30 Mar 2013 17:25 3441 16
  • #1 30 Mar 2013 17:25
    szymon12w
    Poziom 17  

    Witam, od ostatniego czasu uczę się C, po przeczytaniu części kursu ze strony hobby.abxyz.bplaced.net postanowiłem poćwiczyć trochę to czego właśnie się dowiedziałem, więc złożyłem na płytce stykowej układ taki jak na schemacie.
    Chciałem zrobić diodę włączaną i wyłączaną jednym przyciskiem monostabilnym. Program oczywiście nie do końca spełnia swoją rolę, tylko oświeca diodę lecz już jej nie gasi i właśnie chciałbym się was poradzić co jest nie tak z programem.
    PS: szukałem po google, lecz nie znalazłem rozwiązania.


    Kod: c
    Zaloguj się, aby zobaczyć kod


    C - Włączanie i wyłączanie diody za pomocą jednego przycisku

    0 16
  • #2 30 Mar 2013 19:40
    Steryd3
    Poziom 31  

    szymon12w napisał:
    a = a++;


    Ten twór mnie zaintrygował. Jeżeli chcesz inkrementować zmienną (zwiększyć o 1) to zwykli szarzy programiści robią to na 2 sposoby:
    1. a=a+1; (opcja w C mało używana )
    2. a++;

    Co prawda mimo, że Twój sposób jest dziwny też powinien działać.
    Co do reszty programu- wygląda ok.
    Jedyne co mogę podpowiedzieć, to to, że styki takich mono-stabilnych przycisków drgają i ich stan może zmienić się nawet dobre kilka razy podczas jednego przyciśnięcia dlatego przy obsłudze przycisków trzeba zrobić sprzętową (mało popularny sposób) lub programową obsługę tego problemu. Polega to na tym, że po zdekodowaniu, że stan przycisku się zmienił należy poczekać od kilku do kilkudziesięciu ms i znów sprawdzić stan na wejściu. Jeżeli jest taki sam to znaczy, drgania się skończyły i można zaliczyć jedno przyciśnięcie guzika.

    0
  • #3 30 Mar 2013 19:46
    szymon12w
    Poziom 17  

    Nawet jeżeli zmienie to na a++ to program działa bez zmian, dioda dalej nie gaśnie

    0
  • #4 30 Mar 2013 19:55
    excray
    Poziom 39  

    Przenieś temat do mikrokontrolerów.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #5 30 Mar 2013 19:55
    Steryd3
    Poziom 31  

    No i jeszcze jedno. Zmienne globalne deklaruje się przed funkcją main! (przenieś deklarację zmiennej a wraz z wpisaniem jej wartości przed main)

    0
  • #6 30 Mar 2013 19:59
    excray
    Poziom 39  

    Steryd3 napisał:
    No i jeszcze jedno. Zmienne globalne deklaruje się przed funkcją main!

    A gdzie tam jest jakaś zmienna globalna?

    0
  • #7 30 Mar 2013 20:02
    Steryd3
    Poziom 31  

    excray napisał:
    A gdzie tam jest jakaś zmienna globalna?

    Właśnie nie ma.

    0
  • #8 30 Mar 2013 20:08
    szymon12w
    Poziom 17  

    No ok, wszystko działa lecz nie do końca rozumiem jak, skoro do zmiennej "a" przy każdorazowym naciśnięciu przycisku dodaje się 1, a dioda oświeca się gdy "a" wynosi 1 to gdzie się jej wartość resetuje?

    0
  • #9 30 Mar 2013 20:11
    Steryd3
    Poziom 31  

    Jeżeli deklarujesz zmienną "a" wewnątrz pętli while a dodatkowo wpisujesz do niej 0... to tak jak byś na początku każdej pętli zerował zmianą "a". Na marginesie-zmienne globalne na wstępie są zerowane. Zmienne lokalne po deklaracji mogą przyjmować dowolną wartość.

    0
  • #10 30 Mar 2013 20:31
    Sparrowhawk
    Poziom 21  

    Excray, twój kod zadziała raz na 255, zapomniałeś zerować zmiennej a :P

    A może by to tak zrobić:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #11 30 Mar 2013 20:33
    szymon12w
    Poziom 17  

    Chodzi mi teraz o program od excray, każdorazowe naciśnięcie przycisku dodaje 1 do "a", a dioda świeci tylko wtedy gdy "a" wynosi 1 więc kiedy zmienna się zeruje?


    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #12 30 Mar 2013 20:33
    excray
    Poziom 39  

    Sparrowhawk napisał:
    Excray, twój kod zadziała raz na 255, zapomniałeś zerować zmiennej a :P

    Mylisz się. Po prostu nie zrozumiałeś jak działa ten kod. Nie trzeba zerować tutaj żadnej zmiennej.

    W zasadzie kod można jeszcze bardziej uprościć:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Jak widać żadne zmienne ani globalne ani lokalne nie są potrzebne :-P

    0
  • #13 30 Mar 2013 20:36
    Sparrowhawk
    Poziom 21  

    Zmienna a jest typu char czyli jest to zmienna 8 bitowa. A więc jej wartość zmienia się od -128 do +127. Jeżeli będziemy ją inkrementować, to co 256 razy będziemy mieć wartość 0.

    Excray zwracam honor. Oczywiście będzie to działać poprawnie. Czasami trzeba dokładniej spojrzeć ile jest tych krzaczków & :D.

    Ostatnie rozwiązanie jest najbardziej eleganckie, nie wymaga żadnej dodatkowej zmiennej.

    0
  • #14 30 Mar 2013 20:41
    excray
    Poziom 39  

    Ale się uparliście na tą biedną zmienną. Po pierwsze to nigdzie nie jest napisane: a==0x01 tylko jest napisane a & 0x01 a to jest różnica. Nie sądzicie? Po drugie nie trzeba nigdzie zerować tej zmiennej.

    0
  • #15 30 Mar 2013 20:54
    szymon12w
    Poziom 17  

    Dziękuje wszystkim za wypowiedzi, chociaż nie do końca rozumiem zasadę działania pierwszego programu excray to drugi w pełni jest zrozumiały i spełnił moje oczekiwania.

    0
  • Pomocny post
    #16 30 Mar 2013 21:02
    excray
    Poziom 39  

    Chodzi o zapis bitowy. Warunek przeze mnie stworzony sprawdza stan najmłodszego bitu. Przelicz sobie na binarny zapis kolejne liczby 0,1,2,3,4... i zobacz sobie jak zmienia się najmłodszy bit. W skrócie pisząc, warunek a & 0x01 sprawdza czy liczba a jest parzysta czy nie.

    0
  • #17 30 Mar 2013 21:39
    szymon12w
    Poziom 17  

    No i teraz wszystko jasne. Dzięki!

    0