Redakcja: dondu
Drzaśkowy pamiętnik: Spis treści
Bezpiecznik (ang. fuse) |
Przyszła więc pora na zmianę szybkości taktowania procesora. Dowiedziałem się, że trzeba ustawić jakieś „fusebity”.
Poszukałem, poczytałem, no i się przestraszyłem. Praktycznie w każdym temacie na forum związanym z fusebitami mowa była o zablokowaniu procesora. Tak więc wyciągnąłem wnioski, że trzeba uważać oraz poszukać dokładnie, co to są te fusebity, jak się je ustawia/programuje, za co który bit jest odpowiedzialny no i co robić w przypadku pomyłki.
Fusebity w wolnym tłumaczeniu są to bity zabezpieczające, choć bardziej pasuje nazwa: Bity konfiguracyjne. Określają one pewne cechy mikroprocesora, między innymi ustalają one źródło sygnału taktującego mikroprocesor (tzw. zegara).
Jakie są możliwości wyboru zegara za pomocą fusebitów?
Jak zwykle najlepszym i najpewniejszym źródłem informacji jesf datasheet: ATmega8 datasheet
w którym znalazłem interesujący mnie rozdział:
Rys. ATmega8 |
W rozdziale Clock sources znalazłem kompletny opis systemu taktowania mikrokontrolera, a w nim tabelkę dotyczącą fusebitów:
Z samej tabelki już zorientowałem się, że do wyboru mam wewnętrzny lub zewnętrzny oscylator RC, zewnętrzny kwarc lub zewnętrzny sygnał zegarowy/generator. Ale najlepiej widać to na schemacie powyżej.
Dokumentacja bardzo dobrze przedstawia sposoby podłączenia oraz poszczególnych konfiguracji.
Fabrycznie Atmega jest skonfigurowana na wewnętrzny oscylator RC pracujący z częstotliwością 1 MHz:
Rys. ATmega8 - Domyślne fabryczne ustawienie fusebitów zegara . |
Spróbowałem więc na początku zmienić częstotliwość taktowania w ramach opcji zmiany wewnętrznego oscylatora RC.
Przyznam się, że na początku nie korzystałem z AVR Studio więc do zmiany bitów konfiguracyjnych używałem PonyProg2000. Jako, że na blogu używamy darmowego i w pełni ułatwiającego pracę środowiska jakim jest Atmel AVR Studio (w skrócie: AS), pokażę jak to zrobić właśnie w AS.
Korzystając z AVR Studio (w moim przypadku wersja 4.18) nie trzeba nawet zbytnio orientować się w tych fusebitach, aby poprawnie wybrać źródło zegara. Niemniej jednak warto dla samego siebie znać, albo przynajmniej orientować się co tak właściwie się zmienia.
Dlatego istotne jest przeglądnięcie podstawowych tabel z wartościami fusebitów w dokumentacji. Przy zmianie częstotliwości wewnętrznego oscylatora zaglądałem do tabeli z wartościami bitów konfigurujących częstotliwość:
Rys. Atmega8 - Wewnętrzny oscylator RC |
oraz ustawiających czas startu programu po resecie/uruchomieniu zasilania:
Mając podłączony układ z diodami jaki opisywałem w poprzednich częściach napisałem programik testowy:
#define F_CPU 1000000UL #include <avr/io.h> #include <util/delay.h> //definicja LED1 (do którego pinu podłączony LED1) #define LED1 PB0 void main(void) { //########### I/O ########### DDRB |= (1<<LED1);//Ustawienie pinu diody jako wyjście //########################## while(1)//główna pętla programu { PORTB ^=(1<<LED1); //suma modulo 2 (XOR) stanu poprzedniego na porcie //czyli zmiana stanu pinu LED1 na przeciwny _delay_ms(500); } }
Zgodnie z oczekiwaniami dioda mrugała 1 raz na sekundę. Jedna z diod powinna mrugać z częstotliwością 1Hz. No więc teraz czas na eksperymenty :-)
W AVR Studio wszedłem w opcje programatora:
Ukazało się okienko w którym:
1: kliknąłem zakładkę Fuses
2: kliknąłem przycisk Read aby odczytać obecne ustawienia
Teraz zostało mi już tylko kliknąć:
Wybrałem na początek wewnętrzny oscylator RC pracujący z częstotliwością 8MHz, opóźnienie startu 6CK + 64ms i kliknąłem klawisz Program. Na dole w konsoli pojawiły się komunikaty mówiące o powodzeniu mojego eksperymentu:
Dioda teraz mrugała zdecydowanie szybciej. Dla potwierdzenia, iż rzeczywiście uC pracuje teraz z częstotliwością 8MHz zmieniłem w programie na samym początku makro definiujące częstotliwość pracy na:
#define F_CPU 8000000ULSkompilowałem, zaprogramowałem mikrokontroler i doda znowu mrugała z częstotliwością 1 Hz, chociaż sam mikrokontroler pracował już z częstotliwością 8MHz :-)
Rezonator kwarcowy |
Następnie zapragnąłem popędzić uC jeszcze szybciej i jeszcze dokładniej. A do tego potrzebny jest na przykład zewnętrzny rezonator kwarcowy.
Więcej na temat współpracy mikrokontrolerów z rezonatorami kwarcowymi, przeczytasz tutaj: Czas - odmierzanie
Dokumentacja ATmega8 mówi, że maksymalna częstotliwość jej pracy, to 16 MHz, dlatego też taki kwarc podłączyłem do uC zgodnie ze schematem znajdującym się w dokumentacji:
Wymagane połączenia kwarcu |
Dobierając wartość kondensatorów zgodnie z tabelą:
Zauważyłem jednak, że w AVR Studio na rozwiniętej liście nie wybiorę sobie dokładnie częstotliwości kwarcu:
Jest podział na 3 grupy: Low Frequency, Medium Frequency oraz High Frequency.
Analogicznie do tabeli 8-3 wybrałem opcję z grupy High Frequency z interesującym mnie czasem startu. Po zaprogramowaniu dioda mrugała 2 razy szybciej niż poprzednio, czyli przy wewnętrznym oscylatorze RC 8MHz czyli prawidłowo :-)
Po zmianie w programie:
#define F_CPU 16000000ULskompilowaniu i zaprogramowaniu uC, doda znowu mrugała z częstotliwością 1 Hz. Analogicznie postępować można z wyborem innych wartości oraz innych źródeł zegara.
Jak widać AVR Studio pozwala praktycznie w ogóle nie mieć pojęcia o fusebitach. Fusebity nie służą jednak tylko do celu ustawienia źródła zegara.
Dla tych, którzy chcieliby wiedzieć co robią albo chcą programować fusebity w innych programach oraz ustawiać inne opcje polecam artykuł: Fusebity w AVR - Zewnętrzny oscylator kwarcowy
Drzaśkowy pamiętnik: Spis treści
Autor: drzasiek
Redakcja: dondu
W sumie ciekawym jest, że ATtiny13 można taktować max. 20MHz, a ATmegę8 max. 16MHz. Może to kwestia:
OdpowiedzUsuńa) Źródła (ATmega: kwarc, ATtiny: zewnętrzny generator sygnału zegarowego)
b) Ilości peryferiów (ATmega: dużo, ATtiny: mało)
Czy ktoś doświadczony mógłby podzielić się tą wiedzą tajemną?
Po prostu projekt ATTiny13 jest nowszy, ATMega to stareńki procesor, pierwszy z rodziny, obecnie nie rekomendowany do nowych projektów. Zauważ, że wszystkie nowsze ATMegi mają rating do 20 MHz, jeszcze nowsze XMEGA mają do 32 MHz. Pewnie wkrótce pojawią się wersje 48 MHz (nieoficjalnie XMEGA z tym zegarem działają, ze względu na USB).
OdpowiedzUsuńPo tej zabawie fusebitami,avrdude nie wykrywa mi avr,jest na to jakaś rada ?
OdpowiedzUsuńZazwyczaj pomaga podanie zewnętrznego źródła zegarowego taktującego MCU.
UsuńA jak można zmieniać fusebity gdy korzysta się z programatora usb asp?
OdpowiedzUsuńNajwygodniej to kupić sobie programator MKII i robić to z AtmelStudio - mówię Ci szczerze - opłaca się wybulić 70zł i mieć spokój. A jak jednak chcesz zostać przy USB ASP to musisz sobie doczytać obsługę Dude i albo wpisywać zmiany fusów z konsoli dudy (wcześniej samodzielnie wyliczywszy sobie ich wartości) albo zainstalować sobie jakąś nakładkę, która korzystając z dudy zrobi to za Ciebie.
UsuńAle wraz troszeczkę jak dla mnie za mało jasno wyjaśniona jest sprawa konfiguracji oscylatora 16MHz i jakie kondzioły do niego dobrać.
OdpowiedzUsuńMam rozumieć, że dla 16MHz w AtmelStudio mam wybrać "ext crystal resonator high freq..." z jakimś tam czasem startu? Fusy: CKSEL3:1 mają być na 111 a kondzioły dowolnie od 12 do 22pF?
I czy kondensatory jakie sobie kupię z tego zakresu to będzie OK czy trzeba je jakoś szczególnie dobrać/wyliczyć?
Tak prawidłowo kombinujesz, ale zapoznaj się jeszcze z tym artykułami:
Usuń- AVR: Oscylatory kwarcowe i ceramiczne na przykładzie ATmega8 - część I
- AVR: Oscylatory kwarcowe i ceramiczne na przykładzie ATmega8 - część II
W dokumentacji jest tabelka z wartościami kondensatorów i jest ona pokazana w niniejszym artykule - tabela 8-3. W prawej kolumnie są podane zakresy kondensatorów dla poszczególnych przypadków. Tak się składa, że producent mikrokontrolera podaje te same wartości dla poszczególnych trybów ustawienia fusebitów.
W przypadku 16MHz jest to ostatni wiersz w tej tabeli. Ponieważ wskazany tam przedział wartości kondensatorów to 12pF - 22pF, to znaczy, że takie kondensatory gwarantują poprawną pracę mikrokontrolera.
Producent dodał także przed tą tabelą zdanie:
"Some initial guidelines for choosing capacitors for use with crystals are given in Table 8-3."
co oznacza, że są to tylko wartości sugerowane. Dodam, że dla 99,9% przypadków są one prawidłowe. Jeśli natomiast z jakichś powodów musisz doprecyzować pracę kwarcu do granic możliwości, to powinieneś szukać informacji o wartościach kondensatorów w dokumentacji, biorąc pod uwagę także pojemności pinów mikrokontrolera itp. - ale to jak już wspomniałem, zaledwie 0,1% przypadków, a może i znacznie mniej.
Czas startu warto wybierać jak najdłuższy, chyba że istotna jest jak najszybsza reakcja mikrokontrolera po włączeniu zasilania.
Teraz spróbuj dobrać fusebity jak uznasz za stosowne, ale zanim je ustawisz, napisz jakie wartości przyjmą (fusebity Low i High) a my podpowiemy, czy prawidłowo byś sobie nie zablokował mikrokontrolera.