logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Atmega88PA - Jak zwiększyć taktowanie do 8MHz dla USART 10400 baud?

kotrix_ 28 Gru 2013 13:30 1431 6
REKLAMA
  • #1 13107095
    kotrix_
    Poziom 9  
    Używam poniższego kodu do inicjalizacji połączenia z komputerem samochodu (według protokołu kw2000). Używam tam komunikacji USART 10400baud 8n1.
    Chciałem zwiększyć taktowanie do 8MHz i usunąłem programowo dzielnik fusebita CLKDIV8 zmieniając na początku funkcji main() rejestr CLKPR w ten sposób:
    CLKPR|= _BV(CLKPCE); CLKPR&=~ _BV(CLKPS1); CLKPR&=~ _BV(CLKPS0);
    i zmieniając F_CPU w Makefile na 8MHz.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Jednak diody wciąż mrugają 8 razy wolniej niż powinny według _delay_ms()
    Naczytałem się mnóstwo o poprawnym definiowaniu F_CPU i timingu avrów jednak nie mogę zrozumieć co się dzieje. Otrzymuję poprawne timingi jedynie dla F_CPU = 1MHz w Makefile. Oczywiście brak warningów przy kompilacji.

    Czy do komunikacji z prędkością 10400 baud i zachowaniu dokładności +-1ms przy 25ms delayu (wymagania WAKE_UP pattern) wystarczy mi wewnętrzny oscylator 1MHz (lub 8MHz jeśli rozwiążę ten problem) czy konieczny będzie zewnetrzny kwarc (czego chciałem uniknąć)
  • REKLAMA
  • REKLAMA
  • #3 13107240
    wiere
    Poziom 11  
    A przestawiłeś fuse bits? Domyślnie chyba jest ustawiony prescaler przez 8.
  • REKLAMA
  • #4 13107332
    kotrix_
    Poziom 9  
    tronics napisał:
    http://embdev.net/topic/291954
    Może to coś pomoże.


    Bardzo przydatny link. Dzięki!

    wiere napisał:
    A przestawiłeś fuse bits? Domyślnie chyba jest ustawiony prescaler przez 8.


    Przecież napisałem, że chcę ten preskaler z fusebits usunąć programowo.


    Pozostaje jeszcze pytanie czy wewnętrzny oscylator 8MHz da radę z uartem 10400 (UBRR=8MHz/(8*10400)-1 = 95.154, czyli dokładność błąd jakieś 0.2%) ? Czy jestem zmuszony użyć kwarcu?
  • REKLAMA
  • #5 13107876
    yokoon
    Poziom 29  
    Witam.

    Fuse bit (prescaler /8) istniejący (włączony) fizycznie w mikrokontrolerze chcesz usunąć (wyłączyć) programowo ?

    Tak to zrozumiałem z Twego postu.
  • #6 13107925
    tmf
    VIP Zasłużony dla elektroda
    yokoon napisał:
    Witam.

    Fuse bit (prescaler /8) istniejący (włączony) fizycznie w mikrokontrolerze chcesz usunąć (wyłączyć) programowo ?

    Tak to zrozumiałem z Twego postu.


    Ten fusebit w ATMega88 powoduje tylko zmianę domyślnego ustawienia preskalera zegara, program może sobie sam wartość preskalera zmienić i olać ten fusebit.
    Więc tak, da się w tym przypadku wyłączyć programowo działanie tego bezpiecznika.
  • #7 13108007
    yokoon
    Poziom 29  
    tmf napisał:
    yokoon napisał:
    Witam.

    Fuse bit (prescaler /8) istniejący (włączony) fizycznie w mikrokontrolerze chcesz usunąć (wyłączyć) programowo ?

    Tak to zrozumiałem z Twego postu.


    Ten fusebit w ATMega88 powoduje tylko zmianę domyślnego ustawienia preskalera zegara, program może sobie sam wartość preskalera zmienić i olać ten fusebit.
    Więc tak, da się w tym przypadku wyłączyć programowo działanie tego bezpiecznika.


    Dzięki za podpowiedź, nie wiedziałem.
REKLAMA