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.

Bascom zmiana częstotliwości

Uzi103 20 Cze 2014 20:25 798 3
  • #1 20 Cze 2014 20:25
    Uzi103
    Poziom 11  

    Atmega32 ma obsługiwać enkoder oraz odbiornik rc5.
    Enkoder obsługiwany jest dla mnie w najlepszy sposób (i chyba najprostszy) by nie gubił impulsów. Używam wewnętrznego oscylatora 1MHz, jest także podłączony 16MHz - jest to zestaw uruchomieniowy.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Obsługa rc5 wygląda nastepująco:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Tylko mam taki problem, że obsługa rc5 działa mi tylko gdy wartość $crystal = 16000000 (bez ustawiania fusebitów). I tutaj jest właśnie sedno tematu. Bo gdy ustawię crystal na 16000000 to enkoder praktycznie nie zlicza impulsów, musi być 1Mhz. Nie bawiłem się jeszcze z ustawieniem fusebit, bo po prostu nie chciałem niczego popsuć, dlatego chciałbym zapytać doświadczonych kolegów czy przy zmianie na zewnętrzy oscylator i taktowanie 16Mhz enkoder nadal będzie się tak gubić? Dlaczego odbiornik rc5 nie działa gdy ustawione jest mniejsze taktowanie? Pomóżcie jak z tego wybrnąć

    0 3
  • Pomocny post
    #2 20 Cze 2014 21:24
    ZbeeGin
    Poziom 38  

    Wpisywanie $CRYSTAL bez rzeczywistej zmiany taktowania procesora będzie powodować, że wszelkie opóźnienia i obliczenia kompilatora dotyczące liczników nie będą zgodne ze stanem faktycznym.

    GETRC5() korzysta aktywnie z licznika TIMER0. Tak manewruje wartością wpisaną do rejestru licznika oraz preskalerem by otrzymać jednakowe odcinki czasu zliczane później w kilku pętlach oczekiwania na zmiany stanu. Jedno niepowodzenie zliczania i procedura biblioteczna _GETRC5 skacze do _IR_CODE_WRONG i wychodzi z błędnymi danymi.

    Kod: asm
    Zaloguj się, aby zobaczyć kod

    Podobnie dzieje się w poleceniach WAITMS, które nie korzystają z liczników sprzętowych, ale również zachodzi potrzeba obliczenia ile wykonać pętli. Zmiana wzorcowej wartości taktowania przez $CRYSTAL na większą niż rzeczywistą powoduje, że pętlę się wydłużają.

    Najbardziej podatne na zmiany jest nieopublikowane makro @genus, często używane w rozwinięciach bibliotecznych wielu z poleceń.

    Do enkodera lepiej zastosować własną procedurę opierającą się na przerwaniu z PCINT z sprzętową filtracją drgań styków, jeśli wbudowana 4 taktowa byłaby niewystarczająca. Niestety do dziś przerwania te nie doczekały się żadnego oficjalnego wsparcia ze strony poleceń CONFIG, ENABLE/DISABLE czy ON INTERRUPT.

    0
  • Pomocny post
    #3 20 Cze 2014 21:47
    zulusj23
    Poziom 21  

    Witam,

    też aktualnie bawię się impulsatorem na EVB4.3 M32 16MHz. Fajnie działa sterowanie w przerwaniu:

    https://www.elektroda.pl/rtvforum/topic1425879.html

    Dołączyłem kondensatory 68 nF równolegle do styków. Na kwarcu 16 MHz nie ma żadnego problemu z liczeniem impulsów w obie strony. Musiałem tylko dokonać modyfikacji kodu ponieważ trafił mi się impulsator, który w pozycji spoczynkowej ma oba styki zwarte do wspólnego pinu. Też będę "spinał" impulsator z IR ale najprawdopodobniej nie z RC5 tylko z transmisją NEC-a.

    Pozdrawiam.

    0
  • #4 20 Cze 2014 22:55
    Uzi103
    Poziom 11  

    Dzięki wielkie za wyjaśnienie i naprowadzenie ;)
    Musze zatem w końcu zmierzyć sie z fusebitami.
    Obroty enkodera nie będą zbyt duże bo ok 25 obr/min zatem nie powiano gubić sygnałów. Również podłączyłem kondensatory 100nF pod impulsator i nie odczuwałem różnicy. Ale moze faktycznie zrobię zliczanie na przerywaniu. Oby tylko mi wszystko poprawnie działało

    0