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

przerwanie od timera i odczyt pinu

06 Maj 2010 21:14 1385 12
  • Poziom 11  
    witam.
    Czy poprawne jest odczytywanie stanu pinu w przerwaniu?
    np. w pętli głównej
    Code:
     if((bit_is_clear(PINC,przycisk_plus)) && (czas_przyciskania_plus==2)) 
    


    a w przerwaniu
    Code:
    if (bit_is_clear(PINC,przycisk_plus))
    
                {
                czas_przyciskania_plus++;// odliczaj czas przyciśnięcia plus
                }
             else
                {
                czas_przyciskania_plus=0;
                }

    Zmienna czas_przyciskania_plus jest volatile
  • Pomocny post
    Poziom 42  
    Jak najbardziej jest poprawne, tyle że zauważ że w obydwu przypadkach nie masz zrealizowanej programowej eliminacji drgań styków
  • Poziom 11  
    Przerwanie jest co 1 sekundę. Niby wszystko jest ok a nie działa.
    W pętli głównej nie dochodzi do spełnienia ifa.
    Jakieś sugestie?
  • Poziom 38  
    Widocznie nigdy twoja zmienna nie będzie równa 2, gdzieś się zeruje niepostrzeżenie
  • Poziom 11  
    zeruje się jedynie w przerwaniu gdy przycisk jest wolny. Zobacz w pierwszym poście.
  • Pomocny post
    Poziom 33  
    Zawsze można dodać rezystor i kondensator i po problemie. A w tym przypadku w najgorszym razie pierwsze przyciśnięcie zostanie odrzucone.
  • Poziom 11  
    Chodzi Ci o opóźnienie odczytu? To na nic, ponieważ w programie ten przycisk jeżeli zostanie naciśnięty krótko wywołuje inny podprogram( który działa) a jeżeli długo ma być inny podprogram ( który nie działa).
  • Poziom 33  
    panbosman napisał:
    Chodzi Ci o opóźnienie odczytu? To na nic, ponieważ w programie ten przycisk jeżeli zostanie naciśnięty krótko wywołuje inny podprogram( który działa) a jeżeli długo ma być inny podprogram ( który nie działa).

    Chodzi o to, że może się trafić tak, że akurat sczytasz stan portu w momencie drgań zestyków i mimo wciśniętego przycisku będziesz miał 1 na pinie.
  • Poziom 11  
    To fakt. Ale przy następnym przerwaniu za 1 s już nie będzie drgań. Czyli po kilku sekundach powinno być ==2.
  • Poziom 15  
    Może przerwania wcale nie są generowane co 1s i inkrementacja zmiennej czas_przyciskania_plus odbywa się tak szybko, że szybko jest ona większa od 2? Twój warunek może być maksymalnie spełniony przez 1s w przypadku ciągłego wciśnięcia przycisku.

    Nie zamieściłeś całego kodu ale może zastąp warunek czas_przyciskania_plus==2 warunkiem czas_przyciskania_plus>=2.

    Fajnie byłoby również gdybyś wstawił na chwilkę zapalanie jakiejś diody wraz z inkrementacją zmiennej czas_przyciskania_plus oraz gaszenie tej diody w przypadku wyzerowania tej zmiennej. Wtedy widać by było dokładnie czy przerwanie i sprawdzanie stanu na pinie działa poprawnie.
  • Pomocny post
    Poziom 38  
    A, że tak głupio spytam przerwanie w ogóle jest wywoływane?
  • Poziom 11  
    Kod ma ponad 2000 linijek. Wszystko działa Ok. Czepiłem się pomysłu z tym długim przyciśnięciem tylko dlatego, że nie lubię zostawiać niewyjaśnionych spraw. Mogę znaleźć inną metodę i ją zastosować ale przecież nie dam za wygraną :)

    Dodano po 12 [minuty]:

    tadzik85 dzięki, że się tak głupio pytasz. Przejrzałem kod i rzeczywiście jest wstawione cli(). Dzięki wszystkim za pomoc.
    Zamykam temat.