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

przerwanie od timera i odczyt pinu

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

    a w przerwaniu
    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
  • REKLAMA
  • REKLAMA
  • Pomocny post
    #3 8044655
    tmf
    VIP Zasłużony dla elektroda
    Właściwie nie musi mieć. Jeśli przerwania są co kilka-kilkanaście ms to eliminacja drgań robi się niejako przy okazji.
  • #4 8044774
    panbosman
    Poziom 12  
    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?
  • #5 8044803
    tadzik85
    Poziom 38  
    Widocznie nigdy twoja zmienna nie będzie równa 2, gdzieś się zeruje niepostrzeżenie
  • REKLAMA
  • #6 8044817
    panbosman
    Poziom 12  
    zeruje się jedynie w przerwaniu gdy przycisk jest wolny. Zobacz w pierwszym poście.
  • REKLAMA
  • Pomocny post
    #7 8044893
    _Robak_
    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.
  • #8 8044933
    panbosman
    Poziom 12  
    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).
  • #9 8044941
    _Robak_
    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.
  • #10 8044967
    panbosman
    Poziom 12  
    To fakt. Ale przy następnym przerwaniu za 1 s już nie będzie drgań. Czyli po kilku sekundach powinno być ==2.
  • #11 8045063
    ksarim
    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
    #12 8045082
    tadzik85
    Poziom 38  
    A, że tak głupio spytam przerwanie w ogóle jest wywoływane?
  • #13 8045131
    panbosman
    Poziom 12  
    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.
REKLAMA