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.

[ATmega32][avr-gcc] - Błędne taktowanie - budowa zegara czasu rzeczywistego

milo_ns 15 Paź 2015 22:41 891 17
  • #1 15 Paź 2015 22:41
    milo_ns
    Poziom 7  

    Witam serdecznie.

    Rozpocząłem jakiś czas temu zabawę z mikrokontrolerem ATmega.
    Posiadam model ATmega32-16PU. Buduję zegar czasu rzeczywistego. Chciałem do tego wykorzystać przerwania z wbudowanego timera (przepełnienie).
    Po wielu nieudanych próbach synchronizacji ATmegi z rzeczywistym czasem postanowiłem policzyć taktowanie swojego mikrokontrolera.
    Podane przez producenta i ustawione przeze mnie 16MHz nie wychodzi mi z obliczeń.
    Na płytce z kontrolerem posiadam 8 diod led - wykorzystuję je do pomiaru.

    -ustawiam timer w tryb FCPU/8
    -zliczam przepełnienia timera (timer 8-bitowy)
    -gdy dochodzę do 60000 zapalam kolejną diodę
    Zapalenia 8 diod zajmuje mi ~36.8 sekund (sprawdzone kilkukrotnie).

    Moim zdaniem czasie pomiaru zegar ATmegi powinien uderzyć:
    8 * 256 * 60 000 * 8 = 983 040 000 razy.
    Po podzieleniu przez czas 36.8 wychodzi:
    26 713 043 Hz (~26.5 MHz).

    Czy z moją ATmegą jest coś nie tak czy ja nie potrafię ustawić odpowiedniego taktowania? Ewentualnie może źle coś teraz liczę?

    Pozdrawiam wszystkich i z góry dziękuję za pomoc :)

    Kod programu:


    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 17
  • #2 16 Paź 2015 01:51
    strikexp
    Poziom 27  

    Z ATmega wszystko jest w porządku, winny jest układ generujący impulsy czasowe. Czyli rezonator kwarcowy który w typowym modelu rozsynchronizowuje się o +/- 5% rocznie. Jak masz tani rezonator to nawet więcej niż napisałem.
    Jak potrzebny ci zegar czasu rzeczywistego to kup gotowy układ RTC do Arduino lub Raspberry Pi.

    -2
  • #3 16 Paź 2015 07:43
    milo_ns
    Poziom 7  

    Wiesz, nie chodzi o zrobienie zegara, raczej o nauczenie się jak to dokładnie działa.
    Poza tym platformę mam narzuconą "z góry" - będę na niej pracował na zajęciach na uczelni.
    Używam generatora wbudowanego w ATmegę, nie mam zewnętrznego rezonatora.
    Co więcej +/- 5% nie powino chyba dac 26Mhz. Co radzisz więc zrobić?

    0
  • #4 16 Paź 2015 08:32
    Andrzej__S
    Poziom 28  

    strikexp napisał:
    rezonator kwarcowy który w typowym modelu rozsynchronizowuje się o +/- 5% rocznie.

    Mógłbyś podać źródło tej informacji?

    milo_ns napisał:
    Podane przez producenta i ustawione przeze mnie 16MHz nie wychodzi mi z obliczeń.
    .....
    Używam generatora wbudowanego w ATmegę, nie mam zewnętrznego rezonatora.

    Coś chyba źle zrozumiałeś. Maksymalna częstotliwość wewnętrznego oscylatora wynosi 8MHz. Nie da się ustawić 16MHz z wewnętrznego oscylatora. Napisz, jak ustawiłeś fuse bity.

    0
  • #5 16 Paź 2015 11:10
    strikexp
    Poziom 27  

    Andrzej__S napisał:
    strikexp napisał:
    rezonator kwarcowy który w typowym modelu rozsynchronizowuje się o +/- 5% rocznie.

    Mógłbyś podać źródło tej informacji?


    Faktycznie coś mi się pomyliło, zmiana jest temperatorowa na poziomie +/- 0.01% a ta roczna znacznie mniejsza.Przynajmniej w donrych rezonatorach bo w chińszczyźnie to sprawa wygląda znacznie gorzej.
    Tak to jest pisać posty w środku nocy.

    0
  • #6 16 Paź 2015 12:05
    milo_ns
    Poziom 7  

    Witam ponownie.

    Rzeczywiście mój błąd - wewnętrzny rezonator to max 8Mhz.
    Fuse Bity (z programu mkAVR Calculator:
    LOW: 0xE4
    HIGH: 0xC0

    Źródło taktowania:
    -Wewnętrzny oscylator 8Mhz.


    zmieniłem w kodzie programu
    #define F_CPU na 8000000
    oraz w Makefile
    F_CPU = 8000000

    Teraz wydaje się działać dobrze: 8. dioda zapala się po 125 sekundach co w przybliżeniu odpowiada częstotliwości 8Mhz.

    Jak to możliwe, że po ustawieniu FCPU na 16Mhz ATmega taktowała się jakąś oderwaną od rzeczywistości częstotliwością?

    0
  • #8 16 Paź 2015 12:55
    strikexp
    Poziom 27  

    Zdaje się że w ATmega jest wbudowany oscylator RC. Widocznie na złych ustawieniach zaczął działać z dziwną częstotliwością, ale to tylko moja teoria.

    -4
  • #9 16 Paź 2015 13:05
    milo_ns
    Poziom 7  

    Dziękuję za cenne uwagi.
    Programmers Notepad połączony z avrdude.
    Programator USBasp

    0
  • #10 16 Paź 2015 13:09
    szczywronek
    Poziom 27  

    @strikexp - obalam teorię :) Częstotliwość wbudowanego oscylatora na pewno nie zależy od wartości jakiejkolwiek definicji preprocesora. F_CPU to tylko informacja dla programu o częstotliwości pracy mikrokontrolera. Jest wykorzystywana np. w funkcjach delay.

    W pokazanym programie wartość F_CPU nie powinna nic zmieniać... jeśli zmienia to jest to jakaś wielka niegodziwość ze strony kompilatora.

    0
  • #11 16 Paź 2015 13:26
    milo_ns
    Poziom 7  

    Problem wydaje się rozwiązany - urządzenie działa poprawnie.
    Wciąż jednak nie wiem skąd taka częstotliwość.

    0
  • #12 16 Paź 2015 13:29
    Andrzej__S
    Poziom 28  

    Cieszy mnie, że działa lepiej, ale chciałbym jeszcze zwrócić na coś uwagę.

    Atmel napisał:

    Calibrated Internal
    RC Oscillator

    .....
    The CKOPT Fuse should always be unprogrammed when using this clock option.

    Czyli raczej powinno być:
    HIGH: 0xD0

    milo_ns napisał:
    ...po ustawieniu FCPU na 16Mhz...

    Czyli dokładnie jak to zrobiłeś?
    Zdefiniowanie F_CPU = 16000000 jest tutaj bez znaczenia (jak już napisał wyżej kolega szczywronek), ponieważ nie wykorzystujesz tej wartości w kodzie do wykonywania jakichś obliczeń i generowania opóźnień. F_CPU służy w zasadzie tylko do tego. Jej wartość nie wpływa na rzeczywistą częstotliwość taktowania mikrokontrolera. Istotne są fuse bity i schemat podłączenia.

    0
  • #13 16 Paź 2015 13:41
    milo_ns
    Poziom 7  

    A czy wpis w Makefile coś zmienia?

    0
  • #15 16 Paź 2015 13:44
    milo_ns
    Poziom 7  

    W takim razie wciąż nie wiemy co jest powodem tych dziwnych zachowań?

    0
  • #16 16 Paź 2015 14:09
    strikexp
    Poziom 27  

    szczywronek napisał:
    @strikexp - obalam teorię :) Częstotliwość wbudowanego oscylatora na pewno nie zależy od wartości jakiejkolwiek definicji preprocesora. F_CPU to tylko informacja dla programu o częstotliwości pracy mikrokontrolera. Jest wykorzystywana np. w funkcjach delay.

    W pokazanym programie wartość F_CPU nie powinna nic zmieniać... jeśli zmienia to jest to jakaś wielka niegodziwość ze strony kompilatora.


    Podzielić można owszem, ale pomnożyć się nie da. Więc częstotliwość 26MHz jest błednie zmierzona...

    0
  Szukaj w 5mln produktów