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] Przycisk a'la SHIFT do przyciskow wywolujacych przerwania INT0 i INT1

misiu_mietowy 02 Gru 2011 14:06 1173 9
REKLAMA
  • #1 10209163
    misiu_mietowy
    Poziom 16  
    Na wstepie przepraszam za brak polskich znakow, ale pisze z kompa, na ktorego Windowsie nie sa one ustawiojne.

    Problem jak w temacie - przyciski podpinam do portow PD0 (shift) i PD2("normalny" przycisk wywolujacy INT0) i ustawiam pull-up'y. Samo wywolanie przerwania dziala bez zarzutu, nie dziala natomiast wykrywanie wcisnietego shifta.
    Jak widac w pierwszej linijce kodu obslugi przerwania, sprobowalem sprawdzac zarowno dla wcisnietego tylko jednego przycisku (SHIFT) jak i dla wcisnietych obu (shift i klawisz zwiekszajacy zmienna). uC zawsze zachowuje sie tak, jakby shift byl wcisniety, niezaleznie od tego czy jest on naprawde wcisniety czy nie. Prosze o pomoc.

    Strategiczny fragment kodu:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    [/code]
  • REKLAMA
  • #2 10209205
    mmacura
    Poziom 18  
    Wyrzuć negację sprzed 0b00000001 i 0b00000011
  • REKLAMA
  • #3 10209232
    misiu_mietowy
    Poziom 16  
    mmacura napisał:
    Wyrzuć negację sprzed 0b00000001 i 0b00000011


    Na pewno? Przeciez mam ustawiuone pull-upy, wiec wywolanie bedzie stanem niskim.
  • REKLAMA
  • #4 10209284
    kriss68
    Poziom 20  
    Ok to ja Ci może dopisze komenty do Twojego kodu i zobaczysz co masz nie tak :)

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #6 10209313
    Konto nie istnieje
    Konto nie istnieje  
  • #7 10209396
    misiu_mietowy
    Poziom 16  
    albertb napisał:
    Na pewno musisz zrozumieć jak działają operatory:
    1. Na początek ~ i &
    2. || w następnej kolejności.

    Albert


    no to analiza krok-po-kroku:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    SHIFT_AND_INC_KEYS_PRESSED to wyrazenie logiczne, ktore bedzie rowne 1 jesli na porcie B pojawi sie wartosc 0b11111100 (zanegowane 0b00000011), czyli jesli zostana wcisniete 2 przyciski podczone do portow PB0 i PB1
    Analogicznie SHIFT_KEY_PRESSED bedzie mialo wartosc 1 jesli zostanie wcisniety (zwarty do masy) przycisk z portu PB0.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    da 1 jesli bedzie wcisniety przycisk z PB0 lub oba przyciski - z PB0 i PB1.
  • #8 10209439
    mmacura
    Poziom 18  
    Operator & to iloczyn bitowy czyli jeśli zrobisz

    0b11111100 & 0b11111100 = 0b11111100

    a jeśli zrobisz poniższe to otrzymasz to samo

    0b11111100 & 0b1111111 = 0b11111100
  • Pomocny post
    #9 10209457
    kriss68
    Poziom 20  
    misiu_mietowy napisał:
    albertb napisał:
    Na pewno musisz zrozumieć jak działają operatory:
    1. Na początek ~ i &
    2. || w następnej kolejności.

    Albert


    no to analiza krok-po-kroku:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    SHIFT_AND_INC_KEYS_PRESSED to wyrazenie logiczne, ktore bedzie rowne 1 jesli na porcie B pojawi sie wartosc 0b11111100 (zanegowane 0b00000011), czyli jesli zostana wcisniete 2 przyciski podczone do portow PB0 i PB1
    Analogicznie SHIFT_KEY_PRESSED bedzie mialo wartosc 1 jesli zostanie wcisniety (zwarty do masy) przycisk z portu PB0.

    No niestety milisz się bo owszem jest robiona operacja PIND & 0b11111100 ale da ona 1 gdy któryś z przycisków od PD7 do PD3 nie będzie wciśnięty (więc jego bit w rejestrze PIND będzie ustawiony) żeby to poprawnie sprawdzić to trzeba if(((~PIND) & 0b00000011) == 0b00000011) albo if(!(PIND & 0b00000011))

    Więc te definicje powinny tak wyglądać:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    A w if'ie dajesz tylko if(SHIFT_KEY_PRESSED) bo jak się domyślam wciśnięcie DEC_NUM_KEY wywołuje to przerwanie.
  • #10 10209661
    misiu_mietowy
    Poziom 16  
    Dziala! :)
REKLAMA