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

AVR - odmierzenie sekundy

25 Sty 2009 18:58 2945 21
  • Poziom 9  
    Chciałbym użyć wewnetrzny czasomierz do obliczenia sekundy. Przeglądałęm już forum i dowiedziałem się, że nie ma mowy o dokładym czasie ale chociaz w celach edukacyjnych chętnie bym poznał jak to się robi. Swoją drogą z czego ta niedokłądność wynika? Czy chodzi o to, że między taktami kontrollera występują różnicę czasowe wynikające z czynników zewnętrznych?
    Jednak przechodząc do rzeczy - przeczytałem dokumentacje 4 razy (dział o czasomierzu) i udało mi się uruchomić zegar:
    Code:

       TCNT0 = 0x0;
       TCCR0 = ( 1 << 2 ) | 0x1;
       TIMSK = 0x2;

    Wg. specyfikacji moja ATMega 8515 jest taktowana 16Mhz, użyłem prescalera 1024 i z bardzo prostego wyliczenia wynika, ze 16mln/1024 = 15625 dzielac wynik przez liczbe taktow potrzebnych do przepelnienia 15626 / 256 = 22 wychodzi, ze bede mial okolo 22 przepelniej na sekunde. Niestety musialem cos zle zrozumiec bo tak chyba nie jest. Na syganł SIG_OVERFLOW0 inkrementuje licznik a w nieskończonej pętli w głownym kodzie programu ciągle wyświetlam wynik. Wygląda to na jakieś 3 przepełnienia na sekundę a nie 22.
    Mam więc dwa pytania - gdzie w moim ograniczonym rozumowaniu pomyliłem się w obliczeniach i jaki jest najlepszy sposób na obliczenie sekundy?

    Dziękuje za odpowiedzi.
  • Poziom 18  
    A wiec tak:
    Cytat:
    Wg. specyfikacji moja ATMega 8515 jest taktowana 16Mhz,


    Według specyfikacji? Specyfikacja swietnie podaje zakresy czestotliwosci w jakich moze pracowac Twój uC. Jezeli nie podłaczyłeś zewnetrznego zrodla sygnalu zegarowego / kwarcu, to Twoja AtMega pracuje na wbudowanym wen oscylatorze. Jezeli nie grzebałeś w fuse bit'ach to czestotliwosc tego oscylatora wynosi 1MHz.
    Wewnetrzny oscylator mozna ustawic na 1,2,4,8 MHz.

    Niestety stabilnosc tego cuda pozostawia wiele do zyczenia, jest bardzo uzalezniona od czynników takich jak temperatura itp.

    Lepsza stabilnosc uzyskasz stosując zewnetrzne żrodlo synału zegarowego (np kwarc, wtedy max 16MHz) lub używając timera w trybie asynchronicznym, wtedy podłączasz kwarc zegarowy do wejsc TOSC1 i TOSC2 (kwarc 32768h).
    Niestety w tym modelu (o ile kojaze, sprawdź w specyfikacji) te wejscia pokrywają sie z wejsciami sygnału taktujacego procesor (XTAL1, XTAL2), tak wiec uC musiałby pracowac na wewnetrznym oscylatorze.
  • Poziom 39  
    lukeuk napisał:
    ...15626 / 256 = 22 ...

    Nie wiem jakiego systemu liczbowego używasz, ale w systemie dziesiętnym
    15625/256=61.03515625 :!:
  • Poziom 9  
    W zasadzie nie odpowiedziales na moje pytanie natomiast zwrociles moja uwage na cos rownie interesujacego. Faktycznie dzial o System Clock jest na samym poczatku - przyda sie zbadac.
    btw. a czemu wewnetrzy oscylator pozostawia wiele do zyczenia ?

    Dodano po 2 [minuty]:

    @zumek:
    zong.. faktycznie musialem miec wlaczony inny system na kankulatorze bo na szybko to liczylem he he he moja wina zupelnie bezmyslnie.
  • Poziom 32  
    Cytat:
    Lepsza stabilnosc uzyskasz stosując zewnetrzne żrodlo synału zegarowego (np kwarc, wtedy max 16MHz) lub używając timera w trybie asynchronicznym, wtedy podłączasz kwarc zegarowy do wejsc TOSC1 i TOSC2 (kwarc 32768h).
    Niestety w tym modelu (o ile kojaze, sprawdź w specyfikacji) te wejscia pokrywają sie z wejsciami sygnału taktujacego procesor (XTAL1, XTAL2), tak wiec uC musiałby pracowac na wewnetrznym oscylatorze.


    Bzdura. Ten uc nie ma nawet Timera2. Tak jak już wspomniał kolega korzystasz z wew. oscylatora domyślnie ustawionego na 1MHz. Niestety ten oscylator jest niedokładny ale jest na to rada. Istnieje specjalny rejestr dzięki któremu można owy oscylator skalibrować a nazywa się on OSCCAL. Wpisanie odpowiedniej wartości do tego rejestru jest w stanie poprawić dokładność oscylatora. Nie mniej jednak polecam abyś zastosował zew. kwarc.
  • Poziom 9  
    czy ta niedokladnosc pochodzi od temperatury i wachania napiecia ?

    wracajac do pytania. Zanim zaczne montowac krysztaly o ktorych na dzien dzisiejszy nic nie wiem :] chcialbym lepiej poznac wewnetrzny zegar. Czy najdokladniejszym rozwiazaniem w sytuacji 1Mgz bedzie ustawienie prescalera na 1 i odliczanie miliona taktow czy jest moze wydajniejsza metoda ?
  • Poziom 18  
    dawid512 - Dlatego kazałem mu sprawdzic specyfikacje, cóż nigdy nie używałem tego uC.

    Pytanie, czemu sam nie zauwazyłem błedu w dzieleniu ;]

    Jak widac i od temperatury i od napięcia zasilania.

    AVR - odmierzenie sekundy
  • Poziom 21  
    Prescaler nie zmienia dokładności ;) tylko rozdzielczość czasu możliwego do zmierzenia, wew oscylator zmienia częstotliwość względem napięcia i częstotliwości poza tym nie jest to dokładnie 1MHz już fabrycznie! ps. ma ktoś jakiś dobry sposób kalibracji czasu aby 1s = 1s? chodzi o zastosowanie zegarowe (kwarc w końcu też nie ma idealnej częstotliwości fabrycznie)

    Dodano po 1 [minuty]:

    Ten obrazek to akurat do oscylatora od WTD jest;) A to inny oscylator:)
  • Poziom 18  
    O kurka, przepraszam, nie zauwazyłem ze to watchdog. ;)

    Poprawka, wewnetrzny oscylator, dla 8MHz.
    AVR - odmierzenie sekundy
  • Poziom 9  
    To ma byc zabawka do celow edukacyjnych. Nie bede mieszal w bit fusach zostane przy 1Mhz. Dam preskalera na 32 a OCR0 na 250 co daje rowno 125 przepelnien na sekunde. Jesli uda mi sie korzystac z zegara przy 25 stopniach celciusza bedzie dobrze :D

    Dodano po 27 [minuty]:

    ah no tak nie ma 32.. wiec 8 musi wystarczyc
  • Poziom 36  
    [quote="dawid512"]
    Cytat:
    Lepsza stabilnosc uzyskasz.......

    Bzdura. Ten uc nie ma nawet Timera2. Tak jak już wspomniał kolega korzystasz z wew. oscylatora domyślnie ustawionego na 1MHz. Niestety ten oscylator jest niedokładny ale jest na to rada. Istnieje specjalny rejestr dzięki któremu można owy oscylator skalibrować a nazywa się on OSCCAL. Wpisanie odpowiedniej wartości do tego rejestru jest w stanie poprawić dokładność oscylatora. Nie mniej jednak polecam abyś zastosował zew. kwarc.


    Moze to jest bzdura, a moze nie calkiem..
    Mozesz powiedziec po co bylby mu potrzebny Timer2?
    Ma przeciez Timer0 i Timer1.
    Sam fakt ze wybral Timer0 do "dokladnego" odmierzenia 1 sekundy oraz ze nie jest zorientowany ze pracuje z uC przy fabrycznym ustawieniu fusebitow dajace mu wew. oscylator 1 Mhz, vs. max16 MHz, wskazuje ze nie jest zbyt mocny w dziedzinie. Odsylanie go wiec do kalibrowania wew. oscylatora poprzez OSCCAL nie jest najlepszym wyjsciem.
    Ponadto taka kalibracja/trimming nie jest procesem prostym (wymaga wpisu do eeprom lub flash i programowo wywolania kalibracji przy starcie) a jej skutek jest watpliwy. Pod kazdym wzgledem jest latwiej i obecnie relatywnie tanio zastosowac zewn. kwarc/rezonator/a nawet oscylator.
    Pozwole sobie przytoczyc fragment odnosnie wew. osc; (str. 39/40 Datasheet)
    "Note that the Oscillator is intended for calibration to 1.0, 2.0, 4.0, or 8.0 MHz. Tuning to other values is not guaranteed, as indicated in Table 14."

    Ktos wspomnial o wykorzystaniu TOSC1 i TOSC2. Na nieszczescie ten uC nie ma takiej opcji, owszem inne z tej rodziny AVR Atmega8, czy tez 16 lub 168 maja.
    Wydaje mi sie ze najczestszym problemem z jakim wiekszosc ludzi spotyka sie to brak prawidlowego poznania i zrozumienia Datasheet.
    Tam jest wszystko na temat budowy i funkcji poszczegolnych blokow uC!

    Nie wiem czy ktos w Polsce zadal SOBIE na tyle trudu aby dokonac tlumaczenia czegos co sluzyloby INNYM... (obie srony za darmo).

    Z mojej strony doradzilbym autorowi watku aby na razie zadowolil sie eksperymentami z Timerem1 (nawet przy taktowaniu 1 MHz) - ma on o wiele wiecej funkcji niz Timer0 lub Timer2 w innych uC. W drugiej kolejnosci praca nad konfiguracja fusebitow - bedzie potrzebne przy przejsciiu na zewn osc. i nie tylko.
    Na poczatek odpuscilbym sobie ambicje o "super dokladnosci" ale raczej zwrocil uwage na praktyczna znajomosc tematu. Zdobycie konfidencji, byc pewny ze wie sie co sie robi i ze robi sie to dobrze!

    emarcus
  • VIP Zasłużony dla elektroda
    emarcus napisał:
    doradzilbym autorowi watku aby na razie zadowolil sie eksperymentami z Timerem1 (nawet przy taktowaniu 1 MHz) - ma on o wiele wiecej funkcji niz Timer0 lub Timer2 w innych uC.

    Warto poczytać o trybie CTC Timera1. Przy nominalnej f = 1MHz i preskalerze 64 wpisanie do rejestru OCR1A (lub ICR1, zależy od trybu) wartości 1e6/64 - 1 = 15624 pozwoli Ci na generowanie przerwania co sekundę. Zmiana wyliczonej wartości o +/- 1 to zmiana odmierzanego czasu o ok. +/- 64us, albo ok. 0,55 sekundy na dobę. O super dokładności/stabilności nie ma co mówić, ale dostrojenie możesz przeprowadzić w sposób wystarczający dla zabawek.

    Czekamy na wyniki eksperymentów :)

    Pozdrawiam,
    Dr.Vee
  • Poziom 9  
    Dr. Vee tak wlasnie zrobilem - napisalem w poscie wyzej ze bede CTC uzywal jako proste rozwiazanie.

    Emarcus twoja porada odzwierciedla moje intencje. Elektronika zainteresowałem sie bardzo niedawno a na poważnie przysiadłem gdzieś tydzień temu. Podłaczenie uC pod LCD było dla mnie ogromnym osiagnięciem dającym duża sadysfakcji. Siedzę z dokumentacją i testuję możliwości mojego uC w swoich małych śmiesznych projektach. Język angielski nie jest dla mnie problemem - raczej natłok informacji technicznych i małych nic nie znaczących z początku skrutów. Chce dobrze poznać podstawy i przyczyny zanim będę zagłębiał się w temat.
  • Poziom 27  
    Cytat:
    Nie wiem czy ktos w Polsce zadal SOBIE na tyle trudu aby dokonac tlumaczenia czegos co sluzyloby INNYM... (obie srony za darmo).

    ktoś przetłumaczył dokumentację do ATmegi16 (fakt, nie zdanie po zdaniu, ale gdzieś w 80-90% najważniejsze rzeczy).

    Pytanie do autora: czy to ma być czynność powtarzająca się na okrągło, czy może rzadko i dodatkowo w tym czasie nie musi być nic innego wykonywane? Bo jeśli ta druga opcja, to wpisz zwykłą funkcę opóźniającą - bawiąc się w debuggerze AVRStudio można sobie ładnie dopasować. To jest rozwiązanie brzydkie (procesor jest zawieszony w tym czasie).
    JEśli ma być ładnie: użyj timera 16bitowego, ustaw mu preskaler 256, do rejestrów wpisujesz 34285, i na przerwaniu robisz obsługę co ma się wydarzyć po tej 1 sekundzie. Wszelkie niedokładności osługujesz albo zmieniając powyższą wartość, albo przerwaniu dodając minimalne opóźnienia na 1 cykl zegarowy (komenda "WDR" lub "nop" assemblera, np: asm("nop"); )
  • Poziom 9  
    Noo zegarek jest podlaczony do LCD dodatkowo ma jeszcze obslugiwac przyciski do zmiany godziny. Sprawdze timer 16 bitowy z przyjemnoscia. AVR Studio nie uzywam poniewaz pracuje pod linuksem. Jesli juz mowimy o pelnej funkcionalnosci napotkalem smieszny problem. Chce zrobic obsluge przyciskow zewnetrznych na przerwaniach a wlasciwie przerwaniu bo moj biedny uC posiada tylko jeden pin na zewnetrzne przerwanie co nie jest raczej problemem bo kazdy guzik moze wywolywac to samo przerwanie a dodatkowo podlaczyc je z osobna do roznych wolnych portow ale problem jest taki, ze jak uziemiam PIN od tego zewnetrznego przerwania (PE0) to dzieje sie znacznie wiecej niz oczekiwalem. Z tego co zaobserwowalem przerwanie jest wywolywane na zmiane stanow czyli podlaczony/rozlaczony a nie na stan jakim jest uziemienie. Co gorsza nawet jesli bede bardzo szybki :D i tak zostanie wywolane przynajmiej z 2 raz a czaasem w ogole! przynajmiej licznik tak mowi hehe
  • Poziom 21  
    Dodaj filtr RC albo programowe opóźnienie;) Z przyciskami jest taki problem ze złącza drgają a uC potrafi to wychwycić i potraktować jako kilka przyciśnięć

    Ponawiam pytanie ma ktoś pomysł na skalibrowanie RTC:] Bo mi się mija jakieś 2 min na dzień:/
  • Poziom 36  
    lukeuk napisał:

    ....
    Chce zrobic obsluge przyciskow zewnetrznych na przerwaniach a wlasciwie przerwaniu bo moj biedny uC posiada tylko jeden pin na zewnetrzne przerwanie co nie jest raczej problemem bo kazdy guzik moze wywolywac to samo przerwanie a dodatkowo podlaczyc je z osobna do roznych wolnych portow


    Czyzbys w ostanich minutach zmienil pocessor?
    O ile pamietam to zaczynales pracowac nad projektem z uC ATMega 8515 a ten ma az 3 zewnetrzne przerwania nie liczac Reset.
    Int0 - na porcie PD2 (pin12)
    Int1 - na porcie PD3 (pin13)
    Int2 - na porcie PE0 (pin31)
    Jest to wiecej niz mozesz na razie potrzebowac
    Nie jest jednak prawda ze "kazdy guzik moze wywolac to samo przerwanie.. itd ".
    Wydaje sie ze mylisz pojecie przerwania (INT) ze zwyklym wejsciem, ktorym istotnie moze byc niemal kazdy pin odpowiednio skonfigurowany.
    Ponadto wydaje mi sie ze powinienes zaznajomic sie z terminem "DEBOUNCING"
    Co to jest, co sie z tym robi i jak z tym walczyc? Czy droga 'negocjacji' poprzez software czy tez doraznie przez hardware?
    Nieco wiecej o switch debouncing znajdziesz tu:

    http://www.ganssle.com/debouncing.pdf

    albo prostszy tu:
    http://www.all-electric.com/schematic/debounce.htm

    emarcus
  • Poziom 18  
    OldSkull napisał:
    Cytat:
    Nie wiem czy ktos w Polsce zadal SOBIE na tyle trudu aby dokonac tlumaczenia czegos co sluzyloby INNYM... (obie srony za darmo).

    ktoś przetłumaczył dokumentację do ATmegi16 (fakt, nie zdanie po zdaniu, ale gdzieś w 80-90% najważniejsze rzeczy).


    Czy mógłbys podac wiecej szczegółów ?
    Cho znam angielski w miare dobrze to jednak techniczne słownictwo i mnie rozbraja. Zresztą nie tylko mi pomógłby ten tekst. Szczególnie młodzi w tej dziedzinie mogliby przestac się zrażac do uC na początku zabawy.
  • Poziom 27  
    http://www.pg.gda.pl/~zbczaja/pdf/atmega16mmr.pdf

    podeszłem jednak do tego hurraoptymistycznie ;) pominięto sporo,długie opisy streszczono, nie ma przykładów kodu - ale jego przecież nie poddaje się translacji. Jakoś nie przeszkadzają mi te braki - autorzy pominęli te informacje, które poczatkującego nie interesują.
  • Poziom 18  
    Cóż okaże się - w konfrontacji z oryginalną dokumentacją, może pomoże.

    Dodano po 12 [minuty]:

    Hmm, specjalnych rewelacji tam nie ma, to akurat jestem w stanie sam wyczytać, natomiast myślę ze było by to dużym ułatwieniem dla początkujących. Szczególnie dobrze opisane porty, timery, przerwania. Najwięcej pytań dotyczy tych podstaw.

    Regulamin p.15
    Proszę zwracać uwagę na pisownię - poprawiłem.
    [zumek]


    Dodano po 34 [minuty]:

    Ehh, przepraszam, klawiatura mi nawala i w natłoku podkreśleń literówek nie zauważam własnych ortów.
  • Poziom 36  
    Osmo napisał:
    Cóż okaże się - w konfrontacji z oryginalną dokumentacją, może pomoże.

    Dodano po 12 [minuty]:

    Hmm, specjalnych rewelacji tam nie ma, to akurat jestem w stanie sam wyczytać, natomiast myślę ze było by to dużym ułatwieniem dla początkujących. Szczególnie dobrze opisane porty, timery, przerwania. Najwięcej pytań dotyczy tych podstaw.


    Tez "to" przegladnalem..
    Nie komentuje bo......\
    Najbardziej podobala mi sie strona tytulowa. Brzmi bardzo technicznie, fachowo i obiecujaco. Chyba tu dolozono najwiecej uwagi.
    Przykro mi stwierdzic, ale nie traktowalbym tego materialu jako podrecznik/zrodlo informacji nawet przy rekreacyjnym (hobby)projektowaniu dla zabawy.
    Jezeli w tytule podaje sie ze jest to :
    "Dokumentacja mikrokontrolera Atmega16 firmy Atmel"
    to niech ona bedzie pelna a nie wyrywkowe streszczenia fragmentow.

    emarcus