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

Jak ustawić fusebity dla ATmega168P/328P z zewn. oscylatorem 16MHz?

JoteR 03 Cze 2020 19:59 2361 15
REKLAMA
  • #1 18737086
    JoteR
    Poziom 24  
    Posty: 497
    Pomógł: 74
    Ocena: 83
    Witam, zaryzykuję stratę tego jednego punktu w nadziei, że ktoś mi łopatologicznie (i po polsku) wytłumaczy wątpliwości związane z wyborem źródła taktowania dla ATmega168P/328P. Otóż kupiłem kilka klonów Arduino Nano oraz Mini Pro z procesorami ATmega 168P i 328PB. Wszystkie moduły 5-woltowe i pędzone zewnętrznym kwarcem 16 MHz. Ponieważ z pewnych (nie do końca dla mnie jasnych) względów chcę zachować możliwość ładowania do nich programów via COM/USB, postanowiłem wgrać do nich odpowiednie bootloadery Optiboot, bo te, które wgrał Chińczyk, przekłamywały sygnatury procesorów. Ponieważ nie do końca dla mnie jasne było ustawienie niektórych fusebitów, użyłem do tej operacji Arduino IDE aby to ono poinstruowało Avrdude, co i jak ma ustawić. Zacząłem od modułów z ATmega 168P. I teraz tak: jeśli wybieram z Menedżera płytek z grupy "MiniCore" procesor "ATmega 168 Variant 168P/PA", jako źródło sygnału zegarowego ustawiany jest "Ext. Full-swing Crystal". Tak samo zresztą jest, jeśli wybiorę procesor "ATmega 328 Variant 328P/PA". Z ciekawości sprawdziłem, jak to jest ustawiane dla procesora ATmega 328P w Arduino UNO3. A tam jest ustawiany "Ext. Crystal Osc. 8.0-". Zacząłem trochę kopać w poszukiwaniu informacji, czym w zasadzie różnią się te ustawienia. Po znalezieniu informacji (tylko anglojęzycznych, niestety), że "Full-swing" stosuje się przy układzie rezonator kwarcowy pomiędzy XTAL1 a XTAL2 plus ew. kondensatory do masy a Ext. Crystal dla generatora kwarcowego do XTAL1 - zgłupiałem jeszcze mocniej. Przecież we wszystkich tych płytkach jest zewnętrzny rezonator kwarcowy między XTAL-ami.
    Po tym nieco zawiłym wstępie czas na pytania:
    1. Jak prawidłowo powinno być ustawione źródło sygnału zegarowego dla ATmega 168P/328P 5V z rezonatorem kwarcowym 16MHz? Full-swing czy Ext. Crystal?
    2. Jaki program (najlepiej bezpłatny) potrafi wyświetlić z opisami fusebity dla ATmega 328PB, tak jak potrafi to np. BitBurner (który niestety nie ma bazy dla 328PB)? Darmowy BASCOM-AVR, którego używam, też nie zna tego procesora.
    Pytania może i głupawe, ale ja naprawdę początkujący w mikroprocesory jezdem.
  • REKLAMA
  • #2 18737146
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • Pomocny post
    #3 18737153
    2konrafal1993
    Poziom 38  
    Posty: 2916
    Pomógł: 581
    Ocena: 745
    Znam dobry płatny MKAVR kalkulator i posiada wersje pb w swojej bazie no i zaletą jest prostota. Pewnie znajdzie się jeszcze dużo tego typu programów ale ten mi najbardziej przypadł do gustu.
  • #4 18737159
    Konto nie istnieje
    Poziom 1  
  • #5 18737224
    Konto nie istnieje
    Poziom 1  
  • #6 18737364
    JoteR
    Poziom 24  
    Posty: 497
    Pomógł: 74
    Ocena: 83
    drobok napisał:
    Full swing w 328 nie działa (errata).


    Ale chyba tylko dla wersji PB?
    Jeśli jest tak, jak napisałeś, to dlaczego przy wgrywaniu bootloadera Optiboot dla 328P lfuse ustawiany jest na 0xF7 (Ext. Full-swing Crystal)? I dlaczego 328P po takiej operacji nadal działa? ;->

    drobok napisał:
    External crystal oscilator to zewnętrzny sygnał zegarowy (czyt. podłączasz generator), są generatory kwarcowe (4piny), lub cały układ generujący. Tobie to nie zadziała, bo nie masz tam generatora - jeśli go podłączysz będzie działało.


    No ale w takim np. Arduino UNO z 328P jako żywo nie ma generatora, jest tylko kwarc pomiędzy XTAL-ami - a jednak działa z lfuse=0xFF (Ext. Crystal Osc.). Po zmianie na 0x7F (Ext. Full-swing Crystal) zresztą też.

    Reasumując - dla 328P full-swing nie, bo ponoć nie działa (mimo, że empirycznie sprawdziłem, iż działa). External crystal oscillator też nie, bo ma być generator. Sorry, ale jestem jeszcze głupszy, niż przed napisaniem postu.
  • REKLAMA
  • #7 18737381
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • Pomocny post
    #8 18737386
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2203
    JoteR napisał:
    o znalezieniu informacji (tylko anglojęzycznych, niestety), że "Full-swing" stosuje się przy układzie rezonator kwarcowy pomiędzy XTAL1 a XTAL2 plus ew. kondensatory do masy a Ext. Crystal dla generatora kwarcowego do XTAL1 - zgłupiałem jeszcze mocniej.

    Full swing powoduje zwiększenie amplitudy oscylacji - poprawia to stabilność i pewność startu, szczególnie dla kwarców o wyższych częstotliwościach oraz w przypadku zakłóceń, kosztem zwiększonego poboru prądu. Generalnie przy kwarcach 16 MHz warto włączyć. Kondensatory stanowią obciążenie kwarcu i element układu rezonansowego.
    JoteR napisał:
    1. Jak prawidłowo powinno być ustawione źródło sygnału zegarowego dla ATmega 168P/328P 5V z rezonatorem kwarcowym 16MHz? Full-swing czy Ext. Crystal?

    Nie ma external crystal, jest external clock. External clock to sygnał doprowadzony z zewnątrz, nie możesz tego wybrać jeśli podłączysz kwarc, można to wybrać jeśli użyjesz zewnętrznego oscylatora kwarcowego. Ty powinieneś wybrać low power lub full swing crystal.
    JoteR napisał:
    2. Jaki program (najlepiej bezpłatny) potrafi wyświetlić z opisami fusebity dla ATmega 328PB, tak jak potrafi to np. BitBurner (który niestety nie ma bazy dla 328PB)? Darmowy BASCOM-AVR, którego używam, też nie zna tego procesora.

    Użyj darmowego Atmel Studio - nie tylko wygodnie się konfiguruje fusy, ale masz także kompletne środowisko dla AVR. Nie ma sensu używać zewnętrzne nakładki i protezy, szczególnie jeśli obecnie dostępne są tanie programatory/debuggery typu Snap.
    drobok napisał:
    Full swing w 328 nie działa (errata).

    Gdzie? W nocie do 328P nic nie piszą o tym, że full swing nie działa.
  • #9 18737409
    JoteR
    Poziom 24  
    Posty: 497
    Pomógł: 74
    Ocena: 83
    khoam napisał:
    Dla MiniCore tak, jak na poniższym obrazku.


    Dzięki za odpowiedź, ten obrazek doskonale znam, wszak napisałem, że wyręczyłem się Arduino ;->
    Nie odpowiada on jednak na pytanie: Full-swing czy Ext. Crystal Osc.? Aliści (jest takie słowo!) podejrzałem składnię polecenia generowanego przy wgrywaniu bootloadera i w nim lfuse=0b11110111 czyli 0xF7 zatem - Ext. Full-swingCrystal.
    Pytanie teraz: dlaczego, skoro a) ponoć dla 328 full swing nie działa, b) dla Arduino UNO z 328P ustawiany jest lfuse=0xFF (Ext. Crystal Osc.)? Usiłuję to zrozumieć, bo nie chcę cały czas wyręczać się Arduino, tylko chcę wiedzieć, co i dlaczego robię.
  • Pomocny post
    #10 18737430
    Konto nie istnieje
    Poziom 1  
  • #11 18737447
    JoteR
    Poziom 24  
    Posty: 497
    Pomógł: 74
    Ocena: 83
    [quote="khoam"]
    JoteR napisał:
    External crystal oscillator też nie, bo ma być generator.

    khoam napisał:
    Czemu tak twierdzisz?


    Na podstawie tego, co napisał kolega "drobok" w poście #5: "External crystal oscilator to zewnętrzny sygnał zegarowy (czyt. podłączasz generator), są generatory kwarcowe (4piny), lub cały układ generujący. Tobie to nie zadziała, bo nie masz tam generatora". No nie mam, czyli "External crystal oscillator też nie", nieprawdaż? ;->

    khoam napisał:
    W MiniCore domyślne ustawienie dla 328p to właśnie "External crystal/oscillator 16MHz",


    No właśnie nie. Gdyby tak było, to w ogóle nie zawracałbym Wam głowy, bo nawet nie zwróciłbym uwagi na ów "Full-swing". Tymczasem MiniCore ustawia lfuse na 0xF7 czyli właśnie Ext. Full-swing Crystal.
  • #12 18737458
    Konto nie istnieje
    Poziom 1  
  • #13 18737592
    JoteR
    Poziom 24  
    Posty: 497
    Pomógł: 74
    Ocena: 83
    khoam napisał:
    No właśnie tak i nie piszę tego z teorii, ale z praktyki.


    No to u mnie praktyka wygląda tak, jak na załączonych obrazkach. Ja naprawdę tego swinga sobie nie wymyślam.

    Dziękuję wszystkim (a zwłaszcza koledze tmf) za wyjaśnienia, moim celem nie była bynajmniej kolejna g...oburza pt. "jakie fuski do procka xxx". Jako zupełnie początkujący korzystam na razie z BASCOM-AVR i do wgrywania programów do tych modułów, w których chcę mieć zachowany bootloader wybieram "External programer", którym w przypadku modułów ProMini i Nano jest napisana przeze mnie wtyczka w AutoIt, automatyzująca co się da. Może ona też działać jako standalone front-end (tak to się chyba nazywa), więc postanowiłem dodać jej funkcję wgrywania bootloadera, dlatego chciałem dokładnie poznać, co, jak i przede wszystkim - dlaczego.
    Załączniki:
    • Jak ustawić fusebity dla ATmega168P/328P z zewn. oscylatorem 16MHz? arduino3.jpg (121.27 KB) Musisz być zalogowany, aby pobrać ten załącznik.
    • Jak ustawić fusebity dla ATmega168P/328P z zewn. oscylatorem 16MHz? arduino2.jpg (81.48 KB) Musisz być zalogowany, aby pobrać ten załącznik.
    • Jak ustawić fusebity dla ATmega168P/328P z zewn. oscylatorem 16MHz? arduino1.jpg (111.02 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • Pomocny post
    #14 18737909
    bart-projects
    Poziom 30  
    Posty: 834
    Pomógł: 198
    Ocena: 258
    Sprawa ma się tak dlatego, że Atmega328P nie ma już FuseBit CKOPT. W starszych Atmegach przy kwarcach szybszych niż 8MHz zalecano włączenie CKOPT.
    Arduino wypalając Bootloader ustawia "zwykły" Eternal Crystal Oscillator. Zobacz jak różnią się amplitudy gdy wybierzesz "Full Swing"
    Jest chyba ciut bardziej prądożerny, ale bardziej odporny na zakłócenia i pozwala taktować inne układy z nóżki XTAL2.

    Jak ustawić fusebity dla ATmega168P/328P z zewn. oscylatorem 16MHz?

    Jak ustawić fusebity dla ATmega168P/328P z zewn. oscylatorem 16MHz?

    Inna sprawa to Bascom. Przecież on ma możliwość odczytu i ustawiania FuseBit`s razem z opisami. Nie wiem czy do pierwszego postu nie wkradł się błąd ale użyłeś tam nazwy 328PB. Ona różni się od tych z Nano i Pro Micro np. tym że ma dwa interfejsy SPI i dużo więcej.
    Nie wiem jak Demo, ale pełna wersja na pewno obsługuje wersję PB a w nowym 2083 mają wejść xTiny i moze 0-series czyli np Atmega4809.
    Wszystkie FuseBit`y ustawia się prosto z IDE.
    Jak ustawić fusebity dla ATmega168P/328P z zewn. oscylatorem 16MHz?
    Podobnie jest z programowaniem. Niepotrzebne jest użycie "External Programmer" bo Bascom obsługuje Arduino prosto z IDE. Wyjątkiem jest Leonardo gdzie faktycznie ustawiam External Programmer z parametrami dla AVRDude.
    Jak ustawić fusebity dla ATmega168P/328P z zewn. oscylatorem 16MHz? Jak ustawić fusebity dla ATmega168P/328P z zewn. oscylatorem 16MHz?
  • #15 18738824
    JoteR
    Poziom 24  
    Posty: 497
    Pomógł: 74
    Ocena: 83
    bart-projects napisał:
    Sprawa ma się tak dlatego, że Atmega328P nie ma już FuseBit CKOPT. W starszych Atmegach przy kwarcach szybszych niż 8MHz zalecano włączenie CKOPT.
    Arduino wypalając Bootloader ustawia "zwykły" Eternal Crystal Oscillator. Zobacz jak różnią się amplitudy gdy wybierzesz "Full Swing"
    Jest chyba ciut bardziej prądożerny, ale bardziej odporny na zakłócenia i pozwala taktować inne układy z nóżki XTAL2.


    Wielkie dzięki za łopatologiczne wyjaśnienie. Ten punkt, zabierany za ośmielenie się na założenie tutaj tematu, wielokrotnie mi się już zwrócił w postaci solidnej porcji wiedzy.

    Cytat:
    Inna sprawa to Bascom. Przecież on ma możliwość odczytu i ustawiania FuseBit`s razem z opisami. Nie wiem czy do pierwszego postu nie wkradł się błąd ale użyłeś tam nazwy 328PB. Ona różni się od tych z Nano i Pro Micro np. tym że ma dwa interfejsy SPI i dużo więcej.
    Nie wiem jak Demo, ale pełna wersja na pewno obsługuje wersję PB a w nowym 2083 mają wejść xTiny i moze 0-series czyli np Atmega4809.
    Wszystkie FuseBit`y ustawia się prosto z IDE.


    Niestety, aktualna wersja 2.0.7.9 nie obsługuje 328PB, a moduły z takimi właśnie procesorami przysłał mi Chińczyk zamiast zamówionych z 328P. Dopiero wersja 2.0.8.0 "umie" już te procesory, ale czy zostanie udostępniona także w wersji darmowej (z wiadomymi ograniczeniami) - przypuszczam, że wątpię. Stąd pytanie o program z opisanymi łopatologicznie fusebitami dla 328PB.
    W każdym razie we wszystkich modułach był bootloader przekłamujący sygnatury procesorów: 168P przedstawiały się jako 168, a 328PB jako 328P, pewnie dla zgodności z Arduino IDE. Oczywiście tylko via COM/USB, po ISP wszystko było OK, stąd drogą dedukcji doszedłem do wniosku, iż winnymi są właśnie bootloadery. Zacząłem wgrywać je ręcznie, a ponieważ lubię wiedzieć, co właściwie robię i wiedząc, że tę operację będę często powtarzał, zacząłem przyglądać się poszczególnym ustawieniom fusebitów, aby móc tę czynność maksymalnie zautomatyzować, nie używając już do tego Arduino.

    Cytat:
    Podobnie jest z programowaniem. Niepotrzebne jest użycie "External Programmer" bo Bascom obsługuje Arduino prosto z IDE.


    Na początku, będąc zupełnie zielony, nie mogłem dojść do ładu z niektórymi modułami, w których tkwiły bootloadery z różnymi prędkościami UART. Jedne miały 57600, inne 19200, a wybranie błędnej wartości powodowało zwis BASCOM-a. Stąd zaadaptowanie już wcześniej napisanego programu do obsługi Digisparków (opartego oczywiście na Avrdude) jako "wtyczki" do BASCOM-a wydało mi się dobrym wyjściem, gdyż m.in. sprawdza ona, czy jest komunikacja z programatorem i procesorem oraz z jaką prędkością, umożliwia także obsługę USBtiny i Arduino as ISP (BASCOM nie) oraz czy program jest faktycznie napisany dla podpiętego właśnie procesora. A także widzę, co jest ewentualnie nie tak. Wiem, że to trochę wynajdywanie na nowo koła, ale mnie naprawdę to bawi.
    Załączniki:
    • Jak ustawić fusebity dla ATmega168P/328P z zewn. oscylatorem 16MHz? ArduNano - wersja w przebudowie.jpg (295.72 KB) Musisz być zalogowany, aby pobrać ten załącznik.
    • Jak ustawić fusebity dla ATmega168P/328P z zewn. oscylatorem 16MHz? Digispark.jpg (199.04 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • Pomocny post
    #16 18738873
    bart-projects
    Poziom 30  
    Posty: 834
    Pomógł: 198
    Ocena: 258
    Może zanim zapomnę o czym chciałem napisać a nie jest najważniejsze, ale dla Ciebie ważne.
    Tak w telegraficznym skrócie -> USART w AVR ma możliwość włączenia jakby podwójnej prędkości/próbkowania (to samo SPI).
    Bit ma skrótowa nazwę U2X. Przy taktowaniu 16MHz, jak prawie każda płyta Ardu, to bez U2X predkość 115200 miałaby za duzy błąd który niby maksem ma mieć 2.5%.
    Tak więc pierwsze Ardu miały bootloader na baud 57600 lub niżej aż zczaili U2X. Przy U2X=1 i 16MHz błąd wynosi 2,1% a bez niego -3,5% co już daje przekłamania w transmisji.

    To the point->

    Każdy procesor AVR po PowerOnReset, HardReset lub WDReset ma swoje rejestry ustawione w stany domyślne.
    Jeśli masz ustawiony bit który najpierw po Reset każe mu skoczyć do Bootloadera to tam program Bootloadera ustawia potrzebne mu rejestry. Na przykład U2X :D bo spodziewa się transmisji nowego oprogramowania z prędkością 115200.

    Ty w swoim programie masz czujnik który pracuje na 9600 i Bascom wybrał dla niego najlepszy prescaler dla UBRR i bez U2X....

    Procek startuje->Boot ustawia U2X->Czekanie na nowy soft->Nie ma to JMP $00 a tu predkości USART "nie grają" bo Bascom nie ustawiał U2X zakładając że jest =0 po Reset.

    Po zgłoszeniu tego typu niuansów Bascom już chyba sam zajmuje się od jakiegoś czasu bitem U2X, ale nie wiem czy to robi Twoja wersja.
    Zawsze warto napisać "Config COM .." co ustawi wszystko łącznie z U2X.

Podsumowanie tematu

✨ Użytkownik zadał pytanie dotyczące ustawienia fusebitów dla procesorów ATmega168P i ATmega328P z zewnętrznym oscylatorem 16 MHz, w kontekście wgrywania bootloaderów Optiboot. W dyskusji poruszono różnice między ustawieniami "External Full-swing Crystal" a "External Crystal Oscillator", wskazując, że dla ATmega328P domyślnie używa się kwarcu, a nie zewnętrznego generatora. Użytkownicy podzielili się doświadczeniami związanymi z praktycznym działaniem tych ustawień oraz ich wpływem na stabilność i pobór prądu. Zwrócono uwagę na znaczenie ustawienia fusebitów w kontekście programowania i komunikacji przez USART, a także na różnice w implementacji bootloaderów w różnych wersjach procesorów.
Wygenerowane przez model językowy.
REKLAMA