Skocz do zawartości

[AVR] Oscylator + Timer = ?


mag32

Pomocna odpowiedź

Zasadniczo chodzi mi o pewien drobny problem algorytmiczny. Mianowicie, gdy zastosować kwarc o częstotliwości 11059200Hz to za pomocą timera i przerwania przezeń generowanego po przepełnieniu da się uzyskać dokładnie 1200 odczytów/zapisów portu na sekundę.

Ale to dość dziwny kwarc, choć jest w sprzedaży, czy można zatem uzyskać te 1200 odczytów/zapisów na sekundę przy standardowej częstotliwości ?

8000000 czy 16000000Hz

Problem jest dość poważny, gdyż musi to być zawsze dokładnie 1200 a jest to związane z prędkością transmisji niesynchronicznej.

Nie bardzo wiem jak wymyślić takowy algorytm, pomóżcie koleżanki/koledzy.

Pozdrawiam. Michał.

Link do komentarza
Share on other sites

Program w języku C++ pod kontrolery AVR ATMega. Ale nie wydawało mi się to specjalnie istotne, gdyż pytałem o Algorytm nie zaś o kod programu. Ale faktycznie, jak się uda wymyślić algorytm to i można by się pokusić o przykładowy program dla ogółu.

Link do komentarza
Share on other sites

Niestety nie da się tak, mógłbyś wygenerować taką częstotliwość przy kwarcu innym niż 11,0592 MHz tylko dysponując układem PLL lub jakimś podobnym (z dwoma dzielnikami częstotliwości, aby móc uzyskać podział ułamkowy). Inaczej jesteś skazany na podział częstotliwości przez liczbę całkowitą zależną od wartości zapisanej w timerze. Jeśli chodzi Ci o transmijsję UART to w dokumentacji masz rozdział "Example Baud Rates" i masz podane ustawienia rejestru UBRR dla danej częstotliwości kwarcu i wybranej prędkości transmisji oraz względny błąd częstotliwości. Jeśli jest on poniżej 1% to śmiało możesz używać takich ustawień.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

W pewnym sensie procesor jest od tego by myślał, więc może da się go tego nauczyć by jednak potrafił korygować błąd do zera nawet przy częstotliwości względnie nie dopasowanej.

Oczywiście to o czym piszę to faktycznie transmisja szeregowa podobna do UART, niestety UARTa nie da się tu wykorzystać ze względu na specyficzny protokół. AX25 dla systemu APRS. Odbiór i transmisja.

Link do komentarza
Share on other sites

Polecam ARMy, gdzie masz układ PLL i taktowanie rdzenia ustawiasz sobie w zależności od wymagań, przy pewnym zakresie kwarców dałoby się to korygować.

Z drugiej strony, kwarc 11,0592 MHz jest bardzo pospolity (co najmniej od czasów MCS-51) =]

Link do komentarza
Share on other sites

A gdyby problem nie jako ominąć ?

przy taktowaniu 8MHz czyli 8000000Hz podzielone przez Timer 256 da nam to 31250 pps.

Wykorzystując przepełnienie Timera 8 bitowego dodajemy do rejestru 1 licząc od 230 da nam to generację przerwania przepełnienia 1250 razy na sekundę. Czyli o 50 razy za dużo.

Więc trzeba się pozbyć tych 50.

Więc co 24 przerwanie przepełnienia liczymy od 229 co da nam 50 wydłużonych przepełnień na sekundę redukując do 1200 przepełnień czyli to, o co nam chodzi.

Z drugiej strony, te 50 nadmiarowych przepełnień można by rozpisać inaczej, po równo na każde 1200. Daje to 0.041666 przepełnienia na sekundę. Gdyby zatem wydłużyć o tyle każde przepełnienie Timera to również dało by to nam równe 1200 pps. Jak wydłużyć?

Tu nie bardzo wiem, ale myślałem by po uzyskaniu przerwania przepełnienia rejestru Timera przerwać na chwilę jego działanie i włączyć ponownie dodając tam ewentualnie instrukcje .nop dla wyrównania i włączyć ponownie Timer, to powinno nam wystarczyć do przedłużenia każdego licznika o ten współczynnik korekcji błędu, czyli 0,041666

Co Wy na to ?

Link do komentarza
Share on other sites

Naprawdę nie możesz kupić odpowiedniego kwarcu?

Przypomina mi to wyważanie otwartych drzwi, najprostsze rozwiązanie sam podałeś w swoim pierwszym poście...

Link do komentarza
Share on other sites

Mogę kupić, oczywiście, ale nie w tym rzecz. Zauważ, że mimo wszystko komplikuje to układ. Zależy mi na tym by był jak najmniejszy więc chcę wykorzystać jego wewnętrzne możliwości czyli wewnętrzny układ taktujący. Poza tym, nie uważasz, że warto, choć by dla treningu zająć się teoretycznym rozwiązaniem problemu ?

Link do komentarza
Share on other sites

Skoro masz ograniczoną ilość miejsca, to oczywiście, że warto.

A i teoretycznie również miło nad tym posiedzieć, po prostu gdyby nie powyższe ograniczenie chyba niepotrzebnie byś komplikował kod.

A tak...

Przy generacji przerwań musisz uwzględnić jeszcze czas wykonania procedury przerwania o ile się nie mylę, tak więc może Ci wyjść nieco mniej niż te 1250 przerwań / sekundę.

edit: Przy zliczaniu od 229 otrzymujesz 1201,92 przerwania :]

Link do komentarza
Share on other sites

Mam bardzo ograniczoną, ponieważ chcę całość systemu zaaplikować w mikrofon od RTXa.

Jest tam zasilanie, audio in/out oraz sterowanie PTT.

Musze tam wcisnąć uCPU i elementy dopasowujące sygnał oraz podłączyć to jakoś z GPSem.

Albo zastosuje mini moduł OEM Blue2 albo wmontuje tam nano GPSa. Też są takie, zobaczymy, to na przyszłość, teraz muszę zrobić mózg tej zabawki, czyli procek z oprogramowaniem.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.