Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla 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

30 Mar 2013 17:25 3849 16
  • 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
  • Poziom 33  
    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.
  • Poziom 17  
    Nawet jeżeli zmienie to na a++ to program działa bez zmian, dioda dalej nie gaśnie
  • Poziom 39  
    Przenieś temat do mikrokontrolerów.
    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Poziom 33  
    No i jeszcze jedno. Zmienne globalne deklaruje się przed funkcją main! (przenieś deklarację zmiennej a wraz z wpisaniem jej wartości przed main)
  • Poziom 39  
    Steryd3 napisał:
    No i jeszcze jedno. Zmienne globalne deklaruje się przed funkcją main!

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

    Właśnie nie ma.
  • 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?
  • Poziom 33  
    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ść.
  • 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
  • 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
  • Pomocny post
    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
  • 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.
  • 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.
  • 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.
  • Pomocny post
    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.
  • Poziom 17  
    No i teraz wszystko jasne. Dzięki!