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.

Zmiana taktowania zegara mikrokontrolera?

mperlam 27 Kwi 2012 14:27 1202 2
  • #1 27 Kwi 2012 14:27
    mperlam
    Poziom 8  

    Cześć. Mam spory problem z moim Arduino. Napisałem prosty kod, który umożliwia symulowanie pilota (38kHz). Wszystko byłoby fajnie gdyby nie fakt, że chcę jednocześnie odbierać sygnał z innego pilota. Do obioru i dekodowania sygnału używam biblioteki <IRremote.h> ale niestety po jej zastosowaniu Arduino przestaje "pilnować" czasu, tak, jakby takty zegara się zmieniały. Niestety skutkuje to tym, że kod "nadawający" przestaje działać (dioda IR mruga za szybko). Czy znacie może rozwiązanie problemu? Może są inne biblioteki dekodujące? Proszę o pomoc.

    0 2
  • #2 27 Kwi 2012 16:10
    tmf
    Moderator Mikrokontrolery Projektowanie

    A nie możesz tego sam napisać? To nie jest rocket science. Jeśli oczekujesz pomocy to podaj też jakieś konkrety, a przyjmuj, że ktoś wie co to jest irremote i jak to działa. Pokaż istotne fragmenty kodu.

    0
  • #3 27 Kwi 2012 22:55
    mperlam
    Poziom 8  

    Woooow, mogę napisać, o ile się dowiem jak działa całe to dekodowanie. W chwili obecnej udało się znaleźć kod dekodujący z innego źródła, jednak mam innego rodzaju problem. W głównym loopie wywołując funkcję (poniżej) niestety cały kod się zatrzymuje (bo funkcja ma nieskończoną pętlę). Czy jest możliwość uruchomienia tej funkcji jakoś w tle?

    Code:
    int listenForIR(void) {
    
      currentpulse = 0;
      while (1) {
        uint16_t highpulse, lowpulse;
        highpulse = lowpulse = 0;
        while (PIND & (1 << irr)) {
           highpulse++;
           delayMicroseconds(RESOLUTION);
           if (((highpulse >= MAXPULSE) && (currentpulse != 0))|| currentpulse == NUMPULSES) {
             return currentpulse;
           }
        }
        pulses[currentpulse][0] = highpulse;
        while (! (PIND & _BV(irr))) {
           lowpulse++;
           delayMicroseconds(RESOLUTION);
            if (((lowpulse >= MAXPULSE)  && (currentpulse != 0))|| currentpulse == NUMPULSES) {
             return currentpulse;
           }
        }
        pulses[currentpulse][1] = lowpulse;
        currentpulse++;
      }
    }

    0