Mikrokontrolery - Jak zacząć?

... czyli zbiór praktycznej wiedzy dot. mikrokontrolerów.

wtorek, 1 marca 2011

Zmiana źródła i szybkości taktowania – fusebity

Autor: drzasiek
Redakcja: dondu

Drzaśkowy pamiętnik: Spis treści

Bezpiecznik (ang. fuse)
Mając już za sobą wygraną walkę z diodami i Timerem, postanowiłem wycisnąć z uC nieco więcej.

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 8000000UL
Skompilował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
Zewnętrzny 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 16000000UL
skompilowaniu 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
Oceń artykuł.
Wasze opinie są dla nas ważne, gdyż pozwalają dopracować poszczególne artykuły.
Pozdrawiamy, Autorzy
Ten artykuł oceniam na:

8 komentarzy:

  1. W sumie ciekawym jest, że ATtiny13 można taktować max. 20MHz, a ATmegę8 max. 16MHz. Może to kwestia:
    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ą?

    OdpowiedzUsuń
  2. 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ń
  3. Po tej zabawie fusebitami,avrdude nie wykrywa mi avr,jest na to jakaś rada ?

    OdpowiedzUsuń
    Odpowiedzi
    1. Zazwyczaj pomaga podanie zewnętrznego źródła zegarowego taktującego MCU.

      Usuń
  4. A jak można zmieniać fusebity gdy korzysta się z programatora usb asp?

    OdpowiedzUsuń
    Odpowiedzi
    1. 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ń
  5. Ale wraz troszeczkę jak dla mnie za mało jasno wyjaśniona jest sprawa konfiguracji oscylatora 16MHz i jakie kondzioły do niego dobrać.
    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ć?

    OdpowiedzUsuń
    Odpowiedzi
    1. Tak prawidłowo kombinujesz, ale zapoznaj się jeszcze z tym artykułami:
      - 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.

      Usuń

Działy
Działy dodatkowe
Inne
O blogu




Dzisiaj
--> za darmo!!! <--
1. USBasp
2. microBOARD M8


Napisz artykuł
--> i wygraj nagrodę. <--


Co nowego na blogu?
Śledź naszego Facebook-a



Co nowego na blogu?
Śledź nas na Google+

/* 20140911 Wyłączona prawa kolumna */
  • 00

    dni

  • 00

    godzin

  • :
  • 00

    minut

  • :
  • 00

    sekund

Nie czekaj do ostatniego dnia!
Jakość opisu projektu także jest istotna (pkt 9.2 regulaminu).

Sponsorzy:

Zapamiętaj ten artykuł w moim prywatnym spisie treści.