logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Atmega8][C]Problem z Przyciskami!!

rozumek 26 Sie 2008 14:34 2202 13
REKLAMA
  • #1 5476389
    rozumek
    Poziom 10  
    Witam

    Jestem tu nowy na forum, i mikrokontrolery to zupelnie nowa dziedzina dla mnie, więc prosze o wyrozumiałosc.

    Pojawił mi sie problem właściwie techniczny. Posiadam zestaw uruchomieniowy mikrokontrolera Atmega8 AVR ZL2AVR. Opis pod poniższym linkiem.

    pdf z opisem układu

    Problem mam taki ze nie wiem jak podłaczyc do zestawu przycisk o oznaczeniu "S2", a konkretnie nie wiem do czego podlaczyc jego koncówki o oznaczeniach "R1" i "C1". Sam juz wywnioskowałem zeby "C1" podłączyc do przykładowego portu np PORTB pin 0. Nie wiem teraz co zrobic z druga końcówka, "R1". Do czego mam ją podłączyc, do GND, +5V, VCC, czy moze jeszcze do czegos innego.

    Prosze wybaczyc jesli moje pytanie jest zbyt głupie, ale jak pisałem jest to moja pierwsza przygoda z mikrokontrolerami wogole.

    Prosze o pomoc!!!
  • REKLAMA
  • REKLAMA
  • #3 5476405
    Samuraj
    Poziom 35  
    Podłącz do GND. W programie ustaw podciąganie wejścia do "1" logicznej.
    1 - przycisk nie wciśnięty natomiast po wciśnięciu przycisk zewrze wejście do masy, czym samym 0 to będzie oznaczać wciśnięty przycisk.
  • #4 5476514
    rozumek
    Poziom 10  
    Samuraj napisał:
    Podłącz do GND. W programie ustaw podciąganie wejścia do "1" logicznej.
    1 - przycisk nie wciśnięty natomiast po wciśnięciu przycisk zewrze wejście do masy, czym samym 0 to będzie oznaczać wciśnięty przycisk.


    Nie bardzo rozumiem jak to mam ustawic. Czy chodzi o to ze mam pisac program w taki sposób ze 0 oznacza wcisniety, a 1 nie?

    A włąsnie przy okazji, port do ktorego podłączam ma byc ustawiony jako input?
  • REKLAMA
  • #6 5476890
    rozumek
    Poziom 10  
    Wszystko fajnie, wielkie dzieki. Pojawił mi sie jednakze nowy problem:

    Chciałem zrealizowac program który przy kliknięciu przycisku zmienia stan diody na przeciwny. zbudowałem wiec odpowiednia funkcje wewnątrz której jest odpowiednia instrukcja:

     PORTB ^= _BV(1)


    Przy czym jak sie mozna domyslic, do portu B jest podłączona dioda, a makro _BV(1) odpowiada 1<<1, a dioda jest podpieta na drugim pinie.

    Jednakze problem jaki sie pojawił to taki ze klikajac przycisk zmienia sie stan diody, ale jak nim troche "pokrece" na boki, to dioda sie zapala na stałe i na dodatek mocniej niz poprzednio, i klikniecia przycisku w celu zmiany stanu diody powoduze ze w momencie jego przytrzymania pali sie "mniej jasno". Dopiero jak znowu tym przyciskiem "pokrece" to wraca do normy. Wychodzi na to ze bardzo ostroznie musze naciskać przycisk, ale ja chce miec program ze przy kliknieciu poprostu sie zmienia stan diody.

    Pojawia mi sie więc pytanie, jak to zrobic? Pamiętam ze na uczelni, kiedy programowalismy 8051 (czego sie niezbyt nauczylem:cry:) tez było cos podobnego i wydaje mi sie ze trzeba bylo ten przycisk zrobic na przerwaniach, ale nie mam pewnosci.

    Prosiłbym o jakies wskazówki, co robic.
  • #7 5476926
    acid12
    Poziom 21  
    sprobuj z opóźnieniem, czyli spr stan przycisku, odczekaj np 100ms i spr jeszcze raz, jeżeli dalej będzie '0' znaczy ze przycisk 'na prawdę' jest przyciśnięty, ze to nie drgania, i sprawdź lutowania
  • #8 5476974
    rozumek
    Poziom 10  
    na przykład zastosowac funkcje _delay_ms()?
  • #9 5477002
    acid12
    Poziom 21  
    dokładnie _delay_ms() z util/delay.h
    np
    _delay_ms(100);
  • #10 5477051
    rrata
    Poziom 19  
    To co kolego opisujesz to ciągle zmieniające się stany logiczne na wejściu. Piszesz, że słabiej świeci, a ona w rzeczywistości mruga. Przyciski podłącza się tak: jeden pin przycisku do GND, drugi pin przycisku do portu uC (np. PD2), a tenże pin (nasz PD2) podłączasz przez rezystor (10k) do VCC. Jak puścisz przycisk to na pinie będzie napięcie równe VCC (działanie rezystora), a jak wciśniesz to napięcie będzie równe 0 bo zewrzesz do masy.
  • REKLAMA
  • #11 5477342
    Rysiek_XL
    Poziom 14  
    Zgadza się. Dobrze kolega mówi. Ja tylko mogę skromnie dodać, że dla przycisku wystarczy _delay_ms(20); a jeśli chodzi o przyciski to cóż nawet bez zewnętrznego podciągania portu do Vcc powinno zadziałać i działa wiem o tym :). Port na port wejściowy ,włączyć podciąganie wewnętrzne portu do "1" (ponieważ uC ma już w sobie rezystorki podciągające do Vcc) , a drugi pin switcha do GND i już. Masa bez kłopotu po wciśnięciu przycisku "ściągnie" port do logicznego "0".

    Pozdrawiam
  • #12 5480329
    Tomator.pl
    Poziom 11  
    Ja bym proponował podłączyć równolegle z tym przyciskiem kondensatorek 100nF i wtedy nie będzie już 'iskrzyć'.
  • #13 5483430
    Geralt
    Poziom 14  
    To tzw. "iskrzenie" zwane profesjonalnie drganiami zestyków likwiduje się na drodze programowej (kolega ma zestaw rozwojowy i pewno nie będzie tam dolutowywał kondensatora). Wprowadza się tak jak moi poprzednicy pisali opóźnienie i sprawdza czy rzeczywiście przycisk został wciśnięty. Ja w przypadku większych klawiatur obsługiwanych matrycowo obsługuje przyciski w przerwaniu. Do czasu obsłużenia przycisku mogę zablokować przerwanie i nie mam efektu drgań zestyków.

    Natomiast jeśli by to nie był mikrokontroler i nie mógłbyś wyeliminować tego efektu na drodze programowej polecam za przyciskiem filtr RC a następnie bramkę Shmitta wprowadzającą pewną strefę nieczułości. Efekt ustąpi całkowicie. Filtr wyeliminuje szpilki, zaś bramka zrobi nam ładny prostokątny impuls.

    pozdrawiam i życzę owocnej zabawy
  • #14 5506115
    rozumek
    Poziom 10  
    wielkie dzięki, za cała mase opcji i za rozwiązanie problemu:D
REKLAMA