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

Atmega 128L i int7, brak obsługi przerwania - dlaczego?

karaka 02 Maj 2008 15:27 1583 4
  • #1 02 Maj 2008 15:27
    karaka
    Poziom 2  

    Witam


    Klawiatura zbudowana jest za pomocą sześciu przycisków monostabilnych, podłączonych do portu PF0-PF5. Równolegle z każdym przyciskiem jest włączony kondensator elektrolityczny o pojemności 1µF w celu eliminacji wpływu drgań styków. Aby nie odczytywać stanu linii cały czas, zdecydowałem się na wykorzystanie przerwania zewnętrznego !INT7. Jest to zrealizowane poprzez dołączenie do przycisków rezystora podciągającego poprzez diody półprzewodnikowe. Wciśnięcie któregokolwiek z przycisków spowoduje przejście linii !KLAW w stan niski. W stanie niskim będzie również odpowiadająca wciśniętemu klawiszowi linia portu PF. Pozostałe linie pozostaną w stanie wysokim.

    Nie moge uruchumoc przerwania int7 piszac program w C. Ponizej przedstawiam kod w C i dodaje ze programujac uklad przez ISP Programmer FUSE BIT o nazwie JTAGEN =0.

    Procedura przerwania(dla uproszczenia podaje tylko jedna mozliwosc wcisnietego kalwisza):

    Code:
    SIGNAL(SIG_INTERRUPT7) //klaw
    
    {
       CZEKAJ(10);   
       switch(PINF)
       {
          case 0x3E:         
             OK = 1;
             ESC = 0;
             UP = 0;
             DOWN = 0;
             RIGHT = 0;
             LEFT = 0;
          break;
          
       }
    }


    ORAZ INICJALIZACJA:
    Code:

    //PRZERWANIA
       DDRE = 0x0F;      //ustawienie linii przerwań jako wejścia
       PORTE |= 0xF0;      //podciagniecie do plusa zasilania
       EICRB = (1<<ISC71)|(0<<ISC70)|(1<<ISC61)|(0<<ISC60)|(1<<ISC51)|(0<<ISC50)|(1<<ISC41)|(0<<ISC40);   //przerwania od INT4..INT7 na opadającym zboczu
       EIMSK = (1<<INT7)|(1<<INT6)|(1<<INT5)|(0<<INT4)|(0<<INT3)|(0<<INT2)|(0<<INT1)|(0<<INT0);   //zezwolenie na przerwania od INT7(KLAWISZE), INT6, INT5, INT4

    //KLAWISZE
       DDRF &= 0x00;   //port F jako wejścia klawiszy F0-OK , F1-ESC , F2-UP , F3-DOWN , F4-RIGHT , F5-LEFT
       PORTF |= 0xFF;
       MCUCSR = (1<<JTD);   //wyłączenie interfejsu JTAG dwa razy w ciągu 4 cykli zegara
       MCUCSR = (1<<JTD);   //w celu umozliwienia odczytu klawiszy


    Oczywiście mam inne dodatkowe przerwania uruchomione ale one i tak nie wplywaja na dzialanie tego przerwania.
    Nawet przy maksymalnie uproszczonej obsludze przerwania- ustawiam zmienna globalna na wartosc 1, a w maine sprawdzam czy ta zmienna jest =1, to zmienna ta nigdy nie przechodzi na =1, wiec wnioskuje ze przerwanie nie zostalo obsluzone. Wg mnie w tej konfiguracji obsluga przerwania nie zostaje wywolana w momecie przyjscia int7 na zboczu opadajacym...

    Bardzo prosze o pomoc!!


    Proszę umieszczać listingi programów w znacznikach "Code". [c_p]

    0 4
  • #2 04 Maj 2008 21:18
    voytaschec
    Poziom 24  

    Nie tak się eliminuje drgania zestyków na uprocesorze. Można to zrobić dużo prościej - poprzez zastosowanie opóźnienia ok. 80ms. Aby zadziałało przerwanie wyzwalane zboczem to zbocze to musi mieć odpowiednią stromość. Jeżeli wygładzisz je kondensatorem to już takie strome nie będzie.
    Spróbuj zrobić tak: usuń kondensator, a zamiast niego w procedurze obsługi przerwania w miejscu CZEKAJ(10) daj opóźnienie 80-100ms.

    0
  • #3 04 Maj 2008 21:27
    Balu
    Poziom 38  

    Cytat:

    a zamiast niego w procedurze obsługi przerwania w miejscu CZEKAJ(10) daj opóźnienie 80-100ms.

    PROCEDURY PRZERWAŃ PISZE SIĘ OPTYMALNIE!!! TAK, ABY SIĘ WYKONYWAŁY JAK NAJKRÓCEJ!!!
    Ludzie!!! Bez takich rzeczy, blagam...
    100ms w procedurze przerwania od int...
    M128 ma 8 intów to już bym po Twojemu stracił 800ms... SUPER!

    0
  • #4 04 Maj 2008 23:02
    nsvinc
    Poziom 35  

    w takich sprawach stosuje sie TIMER nie zadne delaye. Po prostu w momencie nacisniecia przycisku samplujesz go z 100 razy i jesli stan sie nie zmienil to wtedy dopero kierujesz do programu fakt ze cos zostalo wcisniete.

    ->balu
    nie denerwuj sie...:D

    0
  • #5 04 Maj 2008 23:08
    Balu
    Poziom 38  

    Albo delaye w pętli głównej a w przerwaniu używa się jedynie znacznika "button_change" , który się następnie testuje w pętli głównej:)
    A jeszcze lepiej nie dość że flagę, to w pętli głównej kilka ticków odczekać i jak się nie zmieniło to stabilne :)

    0