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

Atmega328p: Zmiana szybkości transferu w Bascom AVR przy 4MHz

Romek2100 30 Lis 2013 12:52 3222 28
  • #1 13008707
    Romek2100
    Poziom 10  
    Witam,
    Co może być przyczyną zmiany szybkości transferu ?
    Mam AVR przestawionego programowo na 4MHz, fragment kodu:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    a Bascom sam przestawia niepotrzebnie U2X0 na 2x czyli 38400.
  • #2 13008911
    yokoon
    Poziom 29  
    Witam.

    Czy w fuse bitach też masz ustawione 4MHz ?

    Fabrycznie jest ustawiony na 8MHz (oscylator wewnętrzny) i włączony bit CKDIV8, czyłi pracuję na 1MHz.
  • #3 13009361
    Romek2100
    Poziom 10  
    Fusy są ustawione na zewnętrzny kwarc, który nadaje na 8MHz. Przy starcie jest bez dzielenia tej częstotliwości.
  • #4 13009411
    Wojtek75
    Poziom 24  
    Spróbuj to wpisać tak:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    lub bezpośrednio:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #5 13009469
    piotrva
    VIP Zasłużony dla elektroda
    Wojtek75 napisał:
    Spróbuj to wpisać tak:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    lub bezpośrednio:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    No raczej tylko tak:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Ta druga opcja nie zadziała - pierwsze do rejestru musi być wpisana kombinacja 0b10000000 a potem 0b0000XXXX, gdzie XXXX to prescaler.
  • #6 13009583
    Romek2100
    Poziom 10  
    Tylko, że ja pytam o problemy Bascoma z USARTem. Procek bez problemu działa na 4MHz.
  • #7 13009595
    Mundi1970
    Poziom 24  
    Sprawdzałem na dwóch wersjach BASCOM'a 2.0.3.0 i 2.0.7.7 i opisywany problem nie występuje. Ucsr0a.u2x0 ma wartość 0 i wszystko prawidłowo działa.

    EDIT: Sprawdź czy zewnętrzny kwarc ma na pewno 8Mhz a nie 16Mhz
  • #9 13009778
    M. S.
    Poziom 34  
    Cytat:
    $crystal to chyba tylko informuje program


    Prawidłowo powinno być "$crystal to na pewno tylko informuje program".

    Prawdziwą częstotliwość zegara ustala się w fuse bitach i nie jest to żadna samowolka Bascoma.
  • #10 13009854
    Wojtek75
    Poziom 24  
    Romek2100 napisał:
    Tylko, że ja pytam o problemy Bascoma z USARTem. Procek bez problemu działa na 4MHz.

    Jednak pokaż jak masz ustawione fuse?

    PiotrPitucha napisał:
    $crystal to chyba tylko informuje program jak taktowany jest procesor a nie przestawia jego częstotliwości, wpisz 8000000 i powinno zadziałać prawidłowo.

    To się zgadza ale, w tym uC masz specjalny rejestr "CLKPR – Clock Prescale Register" który daje dodatkowe możliwości konfiguracji częstotliwości na jakiej pracuje uC.
  • #12 13010270
    piotrva
    VIP Zasłużony dla elektroda
    PiotrPitucha napisał:
    Witam
    Robisz błąd myślowy bo najpierw informujesz kompilator że masz kwarc 4MHz a potem ustawiasz prescaler, po tej informacji kompilator myśli że procesor jest taktowany 2MHz.
    Pozdrawiam

    NIE?
    Nie.

    Kompilatora nie obchodzi co wpisujemy do rejestrów - kompilator nie myśli nic - on cały czas MA ZADANE, że jest taktowany 4MHz.

    Za to błędna jest procedura zmiany prescalera - powinno być CLKPR=128; CLKPR=129;
  • #13 13010354
    Mundi1970
    Poziom 24  
    Zamiast wykorzystywać rejestry, można to napisać tak:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #14 13010431
    PiotrPitucha
    Poziom 34  
    Witam
    Piotrva będę polemizował, cytat z manuala do Bascoma:

    Składnia:
    $CRYSTAL = wartość
    gdzie:
    wartość Liczba określająca częstotliwość (w Hz!) kwarcu lub oscylatora
    taktującego procesor. Wartość nie może być zmienną, lub
    liczbą obliczaną podczas kompilacji

    Kwarc mamy 8MHz a nie 4MHz i nie możemy kompilatora wprowadzać w błąd że ma kwarc 4MHz skoro ma 8MHz i skutkiem tego mamy podwójną częstotliwość transmisji.
  • #15 13010457
    Romek2100
    Poziom 10  
    Procedura zmiany preskalera taktowania jądra jest sprawdzona przez ustawienie Timera na przerwanie co 1 sek, więc tego jestem pewien.
    Nie wiem po co niektórzy wypowiadają się błędnie na temat $crystal.
    $crystal jest punktem odniesienia dla kompilatora w celu przeliczenia i dobrania ustawień.

    Dalej nie wiem dlaczego kompilator wymusza błędnie U2X0.

    PS
    W teoretycznym Symulatorze wszystko jest OK.
  • #16 13010648
    piotrva
    VIP Zasłużony dla elektroda
    PiotrPitucha napisał:
    Witam
    Piotrva będę polemizował, cytat z manuala do Bascoma:

    1. Zgłoszę to Markowi Albertsowi jako nieścisłość - ten zapis to zaszłość z procesorów 89C... które nie miały FB ani żadnych narzędzi do zegara - wtedy rzeczywiście $crystal oznaczało jaki kwarc jest podpięty do procesora fizycznie. Obecnie zaś, w wersji AVR nie z teorii, ale z PRAKTYKI wiem, że wartość ta oznacza CZĘSTOTLIWOŚĆ TAKTOWANIA PROCESORA, czyli źródło zegarowe (kwarc lub oscylator) po przejściu przez ewentualne podzielniki i pętle PLL (o ile takowe są dostępne w danym procesorze).
    Dalej, na logikę - rejestr CLKPR działa jakby jako modyfikacja fusebitów w trakcie działania programu. A kompilatora nie obchodzi to, jak takowe są ustawione (ba - on nawet o tym nie wie).

    Jeśli mimo wszystko Kolega wie lepiej i zna się lepiej proszę zrobić prosty test - podpiąć kwarc np. 8MHz lub ustawić na wewnętrzny 8MHz bez podzielnika, skompilować program migający diodą na Wait'ach przy podaniu $crystal=8000000. Potem proszę zmienić fusebity (włączyć CLKDIV8), skompilować program ponownie bez żadnych zmian (wszak kwarc nie został zmieniony) i wgrać do procesora - z niecierpliwością czekam na efekty tej próby.

    Romek2100 napisał:
    W teoretycznym Symulatorze wszystko jest OK.

    2. Symulator UART w ogóle nie uwzględnia czegoś takiego jak BAUD - po prostu dane są wyświetlane w wirtualnym terminalu z pominięciem całej warstwy fizycznej.

    3. Aż z ciekawości całej sprawie się przyjrzę w praktyce konkretnie na tych modelach układów, zestawię układ i zrobię testy.
  • #17 13010737
    Romek2100
    Poziom 10  
    piotrva napisał:

    Romek2100 napisał:
    W teoretycznym Symulatorze wszystko jest OK.

    2. Symulator UART w ogóle nie uwzględnia czegoś takiego jak BAUD - po prostu dane są wyświetlane w wirtualnym terminalu z pominięciem całej warstwy fizycznej.

    masz rację, ale to była moja reakcja na wypowiedź:
    Mundi1970 napisał:
    Sprawdzałem na dwóch wersjach BASCOM'a 2.0.3.0 i 2.0.7.7 i opisywany problem nie występuje. Ucsr0a.u2x0 ma wartość 0 i wszystko prawidłowo działa.
    EDIT: Sprawdź czy zewnętrzny kwarc ma na pewno 8Mhz a nie 16Mhz
  • #18 13010995
    piotrva
    VIP Zasłużony dla elektroda
    Zaproponowana instrukcja Config Clockdiv=2 działa prawidłowo.
    Tak samo jak wstawka ASM i operacje na rejestrach (mea culpa tylko z jednym - przy zapisie prescalera oczywiście bit CLKPE ma być równy zero)

    Problem u mnie nie występuje, Bascom 2.0.7.6 FULL.
    Zapytam więc jaką wersję ma Autor wątku?

    Kod: text
    Zaloguj się, aby zobaczyć kod

    Fusebits:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #19 13011221
    Romek2100
    Poziom 10  
    Mam staruszka ;)
    1.11.9.5

    piotrva napisał:
    mea culpa tylko z jednym - przy zapisie prescalera oczywiście bit CLKPE ma być równy zero

    Wielki szacunek dla tych słów.

    PS
    Nie przepadam za modą ciągłych upgradów (Bascom).
    Ostatecznie "ręcznie" zmienię bit U2X0.
  • #20 13012249
    piotrva
    VIP Zasłużony dla elektroda
    I mamy odpowiednią informację także w helpie:
    http://avrhelp.mcselec.com/index.html?config_clockdiv.htm
  • #21 13014338
    Romek2100
    Poziom 10  
    Czyli to może być problem tej wersji Bascoma ?

    PS
    Czy ktoś używał wewnętrznego czujnika temperatury na ADC8 ?
    Pytam, bo nie wiem jak interpretować wynik ADC8=357.
  • #22 13014842
    Mateusz@
    Poziom 18  
    A czego kolega nie rozumie z rozdziału "23.8 Temperature Measurement" w nocie katalogowej. Proponuje zwrócić uwagę na błąd pomiaru. Bez kalibracji to niewiele można pomierzyć.
  • #23 13016208
    Romek2100
    Poziom 10  
    No właśnie nie za bardzo rozumiem sposób obliczenia temperatury dla tego czujnika.
  • #24 13016614
    yokoon
    Poziom 29  
    Romek2100 napisał:
    Czyli to może być problem tej wersji Bascoma ?

    PS
    Czy ktoś używał wewnętrznego czujnika temperatury na ADC8 ?
    Pytam, bo nie wiem jak interpretować wynik ADC8=357.


    Witam.

    Co to znaczy " wewnętrzny czujnik temperatury ADC8 " ?

    Wewnętrzny czujnik mikrokontrolera ?
  • #26 13017017
    Romek2100
    Poziom 10  
    Już wcześniej widziałem obydwie informację, ale słabo znam angielski i nie mogę tego zaskoczyć. Ta strona z przykładem za bardzo się nie klei. Podstawiam przykładowe dane do tamtych obliczeń i wychodzą zupełnie nielogiczne wyniki:

    Temperatura = K * ( Odczyt - 314 + 25 - T_offset )
    T_offset = 34.22
    K = 0.65

    dla np. Odczyt=320 z tamtych obliczeń otrzymujemy temperaturę = -2'C.

    W dokumentacji jest podane, że dla Odczyt=314 powinno być ok. 25'C.
  • #27 13031194
    Romek2100
    Poziom 10  
    Dzisiaj miałem trochę czasu i znalazłem problem z U2X0.
    Wersja Bascoma którą posiadam ma błąd. Jeśli bit U2X0 ma być zerowy to Bascom nie ustawia go na zero. Trzeba to niestety zrobić ręcznie. Bit ten mam zmieniany bootloaderem.

    Pozostał tylko problem pomiaru temperatury który opisałem w poprzednim poście.
  • #28 13031913
    piotrva
    VIP Zasłużony dla elektroda
    Niestety takie zachowanie to wyjątkowo nie chimera i błąd BASCOM'a, ale wina beznadziejnego bootloadera - bootloader powinien zadbać, by po swojej pracy zostawić uC w stanie takim, jak po podłączeniu zasilania.
  • #29 13033828
    Romek2100
    Poziom 10  
    Ten beznadziejny bootloader to Arduino.
    Wgrałem go bo potrzebowałem emulację STK500.
REKLAMA