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

[ATmega128] czujka ruchu, INT0, GND, działa podwójnie.

herszt 13 Lis 2009 01:35 1854 10
  • #1 7253460
    herszt
    Poziom 18  
    Witam!

    Mam dość nietypowy problem z czują ruchu i ATmegą. Podłączyłem ją (czujkę) do INT0 jedną stroną drugą do GND dodatkowo INT0 podciągnąłem pod 1 przez rezystor. Czujka działa w ten sposób, że jak nie widzi ruchu to jest zwarcie (czyli 0 na INT0), a jak jest ruch to rozwarcie (1 na wejściu). I sobie ustawiłem, aby program (przerwanie) reagował na zbocze narastające. Wszystko działa, tylko co dziwne działa podwójnie (w obsłudze przerwania dałem po prostu zwiększanie jednej zmiennej) i zawsze zwiększa o 2 jakby były dwa zbocza. Zrobiłem podobny eksperyment ze zwykłym przyciskiem i on działał poprawnie. Może jakieś sugestie? Bo nie mam pojęcia jak to się dzieje...

    z góry dzięki
    pozdrawiam
    herszt
  • Pomocny post
    #2 7253691
    _Robak_
    Poziom 33  
    Najlepiej jak bys na oscyloskopie zobaczyl jakie sa te zbocza. Jesli nie mozesz moze pusc przez przerzutnik, tak jak sie to robi przy draganiach stykow.
  • Pomocny post
    #3 7253774
    micha_
    Poziom 11  
    sprubuj go troche przychamowac.po wykryciu int przechodzi do podprogramu co wylacza int robi co ma -> mala przerwa(ms)-> wlacza int no i z powrotem.powinno funkcjonowac.
  • Pomocny post
    #4 7253859
    _Robak_
    Poziom 33  
    No dawanie w przerwaniu delaya to nie jest dobry pomysl ;)
  • Pomocny post
    #5 7253930
    tmf
    VIP Zasłużony dla elektroda
    Ta czujka PIR ma na wyjsciu zapewne maly przekaznik, a ten jako element mechaniczny generuje drgania przy wlaczaniu i wylaczaniu. Doloz jakis maly kondensatorek, robiacy jako filtr i powinno byc ok.
  • #6 7255514
    herszt
    Poziom 18  
    Dałem 100nF i w sumie nic się nie zmieniło. Może zrobiłem jakiś błąd w (jakże prostym) kodzie:

    
    volatile int i;
    /*
    OBSLUGA PRZERWANIA SPRZETOWEGO Z CZUJKI
    */
    
    static void IrqHandler(void *arg)
    {
    	i += 1 ;
    }
    
    [...]
    
    int main()
    {
    	confcom.baud = 115200;  // UART speed
    	
    	DDRD =  0x00 ; // PORTD jako wejscie
    	//PORTD = 0xFF ; // podciagniecie wejsc do 1
    	//EICRA = 0xAA ; // wejscie reaguje na opadajace zbocze
    	EICRA = 0xFF ; // wejscie reaguje na zbocze rosnace
    	EIMSK = 0x0F ; // odblokowuje przerwania na wejsciach INT0...INT3
    	
       NutRegisterIrqHandler(&sig_INTERRUPT0, IrqHandler, NULL); // obsluga przerwania
    [...]
    


    z góry dzięki
    pozdrawiam
    herszt
  • Pomocny post
    #7 7265713
    micha_
    Poziom 11  
    delay nie w przerwaniu.po po wykryciu przerwania nastepuje tylko ustawienie znacznika przerwania, a w prog glownym wylaczenie przerwania mala przerwa i skok do podprogramu w zaleznosci od znacznika
  • Pomocny post
    #9 7267146
    _Robak_
    Poziom 33  
    To jest pisane pod os`em? W kazdym razie, przerwanie sie wywoluje bo autor pisal to, nawet dobrze dziala dla przycisku wiec mysle ze sprawa samej deklaracji przerwania jest jasna ;) Jesli nie masz oscyloskopu to zastosuj uklad do eliminowania drgan stykow.
  • Pomocny post
    #10 7270919
    AVRowiec
    Poziom 18  
    ja to robie tak:

    if NACIŚNIĘTY_GUZIK
    {
    while (!NACIŚNIĘTY_GUZIK);
    ...
    }

    W ten sposób masz wstrzymaną pracę do momentu w którym nie puścisz guzika.
    Oczywiście w przerwaniu to nie będzie tak działać bo ono się wykonuje przy każdym impulsie ale może warto sprawdzić..
    Albo zamiast w przerwaniu INT dać w jakimś innym (timer?)

    pozdro
  • #11 7271159
    herszt
    Poziom 18  
    _Robak_ napisał:
    To jest pisane pod os`em?


    Tak dokładnie pod OSem - Ethernut.
    Ogólnie same problemy z nim, bo albo działają przerwania zewnętrzne (tak jak opisałem - czyli nie za dobrze) albo działają inne komponenty systemu, a momencie pojawienia się przerwania wszystko się wiesza... No ale póki co będę pracował nad wersją tylko z przerwaniami a resztę później dorzucę ;) Może w końcu coś wykombinuję. Może dać większy kondensator?

    pozdrawiam
    herszt
REKLAMA