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.

Atmega128 + PCF8583 Obsługa przerwania zewnętrznego

Jablonaack 14 Mar 2017 23:29 648 9
  • #1 14 Mar 2017 23:29
    Jablonaack
    Poziom 7  

    Chciałbym dostać przerwanie od PCF po 15 sekundach. Więc ustawiam rejestry następująco:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Pin PE4 jako ustawiam jako wejście i podciągam do vcc. Obsługa przerwania poniżej. Coś jest nie tak i zmienna zwiększa się przy każdym wykonaniu instrukcji.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Gdzie popełniam błąd ?

    0 9
  • #2 15 Mar 2017 01:16
    Jablonaack
    Poziom 7  

    Tak wygląda część z przerwaniem. Cały kod jest dość długi i działa poprawnie, tylko z tym mam problem. Nie jestem w stanie wykryć co robię źle.


    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #4 15 Mar 2017 13:48
    Jablonaack
    Poziom 7  

    Przeniosłem sei() pod ustawienie wywołania. Sprawdziłem multimetrem stan na wyjściu INT z PCF i ciągle buja się od 0 do 5 niezależnie jak ustawie rejestry w PCF. Źle je ustawiam ? Czy może z PCF jest coś nie tak ? Godzinę wpisuje i odczytuje bez problemu.

    0
  • #5 15 Mar 2017 14:14
    michalko12
    Specjalista - Mikrokontrolery

    Jablonaack napisał:
    PCF8583_write(0x00,00000100); //Control status register
    PCF8583_write(0x08,11001010); //Alarm control register

    Gcc? Jeśli tak to liczby binarne maja inny format.
    00000100 -> 0b00000100
    11001010 -> 0b11001010

    Dodano po 1 [minuty]:

    A, jednak znasz ten format zapisu
    Jablonaack napisał:
    EICRB = 0b00000010; //wywołanie zboczem opadającym
    EIMSK = 0b00010000; //aktywacja INT4

    0
  • #6 15 Mar 2017 15:45
    Jablonaack
    Poziom 7  

    Zmieniłem sposób wpisywania danych na taki:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Co prawda coś ruszyło bo k zwiększa się po 4 sekundach ale tylko raz. Próbowałem wpisywać inne wartości. Dziwne ale do 9 inkrementowało jednokrotnie, a po wpisaniu większej liczby już zero odzewu. Na INT po opadnięciu na stan niski już w nim zostaje.

    0
  • #7 15 Mar 2017 17:00
    michalko12
    Specjalista - Mikrokontrolery

    Chyba nie wiesz do końca co robisz. Przeczytaj dokładnie datasheet tego układu, a zwłaszcza opis rejestrów i zachowanie i działanie alarmów i flag. Jak na razie to wszystko wskazuje, że czekasz, aż ktoś za Ciebie rozwiąże problem.

    0
  • #8 15 Mar 2017 17:11
    Jablonaack
    Poziom 7  

    Nie do końca ogarniam ten datasheet i korzystałem z tego co znalazłem w innym temacie. W takim razie będę próbował dalej.

    0
  • #10 15 Mar 2017 21:43
    Jablonaack
    Poziom 7  

    Dzięki za instrukcję. Zrozumiałem, że chce dostać przerwanie z timera za zrównanie wartości rejestru timera 0x07 z rejestrem 0x0f 'timer alarm'. W Control Status Register 0x00 ustawiam 0d00000100 czyli clock mode i bit alarm enable. W Alarm Control Register 0x08 ustawiam 0d11000 010 co powinno mi dać funkcję zliczania sekund i zezwolenie na przerwanie spowodowane alarmem timera. Zeruje timer register 0x07 i wpisuje liczbę do porównania do timer alarm 0x0f. Czyli jeśli dobrze rozumiem to czas leci od 0 do np. 5 sekund i występuje przerwanie. Jeśli wpisuje liczbę >=9 wszystko działa ale dalej nie rozumiem czemu w przypadku większej liczby nie występuje przerwanie. Mógłby mi ktoś to wytłumaczyć jak chłopu na granicy?

    0