| STRONA GŁÓWNA | MAPA SERWISU | FORUM ELPORTALU | ElCafe |
element.14
Telewizja przemysłowa
03 Wrz 2010 - 04:27
N0013c
(21768 read)
Fuse Bits
czyli dramat AVR'ów w 3 aktach...


Przedmowa,

     Ogólne rozpowszechnienie mikrokontrolerów AVR spowodowało, iż programowaniem zaczęli zajmować się już nie tylko profesjonaliści mający za sobą lata zero-jedynkowej praktyki, lecz także osoby które z dość stabilnego punktu widzenia, nie mają o nich względnego pojęcia. Pojawiają się także osoby, których nie interesuje szczegółowe działanie algorytmów zatopionych w krzemowej strukturze a chciałyby po prostu złożyć projekt wg nie do końca precyzyjnego opisu. Oprócz zaprogramowania mikrokontrolera instrukcjami programowymi, pozostaje jeszcze jedna kwestia, której zlekceważyć nie można (a przynajmniej nie powinno się tego robić) - są to bity konfiguracyjne zwane potocznie fusami.

     Wielu młodych i niedoświadczonych zamachowców na AVR'y boi się w ogóle pomyśleć o takim stworzeniu Bożym jakim są właśnie bity konfiguracyjne a przecież do prawidłowego działania modułu, ustawienie odpowiednich fusów jest bezdyskusyjnie koniecznością. Niniejszy artykuł prezentuje w jaki sposób można poradzić sobie i oswoić się ze świadomością istnienia, jednak czasem kapryśnych stworzonek, jakimi są fusy.

     Bity konfiguracyjne (ang. Fuse Bits), konfigurują wybrane zespoły mikrokontrolera nadając im pewne cechy użytkowe. Łopatologicznie rzecz ujmując - określają one środowisko w którym będzie pracował mikrokontroler. Na przykład, określają źródło sygnału taktującego, czy jest generowany przez zewnętrzny kwarc, układ RC a może wewnętrzny generator. Fusy mogą także włączyć użyteczne funkcje jak i zabezpieczyć pewne części układu. Zaprogramowanie tych bitów jest trwałe, oznacza to że operacja kasowania pamięci programu mikrokontrolera nie zmienia ich wartości.

     Fusy są ustawiane w uC poprzez programator. Każde programowanie fusów należy przeprowadzić rozważnie i z uwagą. Poprzez złe zaprogramowanie niektórych bitów, możemy na stałe zablokować sobie dostęp do mikrokontrolera w trybie szeregowym. Co jednoznacznie wyklucza wykorzystanie programatora ISP. Aby przywrócić do życia taki mikrokontroler należy użyć programatora równoległego. W dalszej części artykułu zwrócę uwagę na to, od jakich fusów należy trzymać się z daleka by nie zaszkodzić swojemu maleństwu.

     Naszym bohaterem będzie ATmega8 (a właściwie jego fusy), który dzielnie mi towarzyszył podczas pisania artykułu od początku do końca.

Akt Pierwszy, zaopatrujemy się w software,

     Sposób dotarcia do fusów zależy od zastosowanego programu sterującego. Do programowania bitów konfiguracyjnych polecam program "ISPprog" na licencji Freeware. Program wspomaga w zaprogramowaniu uC w trybie szeregowym poprzez złącze ISP. Aplikacja ta jest dostępna pod adresem: www.elportal.pl/n0013/fusebits/ispprog.zip .

Pobrany plik rozpakowujemy a następnie uruchamiamy aplikację ispprog.exe.

Pierwsze "look & feel":



     Obsługa programu jest intuicyjna i nie powinna stanowić problemu. Pierwszym krokiem jest ustawienie w opcjach jakiego rodzaju programator wykorzystujemy a także należy określić adres portu do którego uf programator jest podłączony.



Następnie ustawiamy częstotliwość z jaką jest taktowany uC (w przykładzie zastosowano kwarc 8MHz).

Po podłączeniu uC do programatora możemy sprawdzić przyciskiem "Read signature" czy uC i programator widzą się wzajemnie.

Przy dobrze skonfigurowanym programie oraz bezbłędnych połączeniach, nasz ATmega8 grzecznie się z nami przywita:



W tym momencie jesteśmy my jak i uC przygotowani do ingerencji w ustawienia Fuse Bitów.

Akt Drugi, nazywam się Fuse, Bit Fuse...

     Klikając przycisk "Fuse and lock bits" przechodzimy do okna ustawień bitów konfiguracyjnych oraz tzw. bitów bezpieczeństwa. Te drugie nie będą nas interesować, przyjrzyjmy się polu Fuse Bits:



Widzimy w nim nazwy poszczególnych fusów a pod nimi ich wartości logiczne [1/0]. Ważnym aspektem na który należy zwrócić uwagę podczas programowania fusów jest fakt, iż bit o wartości logicznej 0 oznacza bit ZAPROGRAMOWANY. Analogicznie, bit o wartości logicznej 1 oznacza bit nie zaprogramowany. Wartość dla danego Fuse Bitu zmieniamy klikając wartość logiczną zawartą pod jego nazwą, zmieni ona stan na przeciwny. Znajdującym się obok przyciskiem "Program" zapisujemy ustawioną sekwencję bitów do uC.

Omówienie poszczególnych Bitów Konfiguracyjnych:

BOOTRST (wartość początkowa 1) - określa funkcje sygnału RESET.

 BOOTRST   Znaczenie 
 1   Po sygnale RESET program rusza od adresu 000hex (reset aplikacji) 
 0   Po sygnale RESET program rusza od adresu określonego przez wartość bitów BOOTSZ1 i BOOTSZ0 

BOOTSZ1 i BOOTSZ0 (wartość początkowa 00) - w nich kodowana jest wielkość tzw. BOOT BLOKU. Występują następujące kombinacje:
 
 BOOTSZ1   BOOTSZ0   Wielkość sekcji boot loader   Przestrzeń pamięci FLASH przeznaczona na:   Wartość wektora RESET (hex) 
 program (hex)   boot loader (hex) 
 1   1   128 bajtów   000...F7F   F80...FFF   F80 
 1   0   256 bajtów   000...EFF   F00...FFF   F00 
 0   1   512 bajtów   000...DFF   E00...FFF   E00 
 0   0   1024 bajtów   000...BFF   C00...FFF   C00 

BODEN (wartość początkowa 1) - włącza do pracy układ zerujący uC po stwierdzeniu niewłaściwego napięcia zasilającego.

 BODEN   Znaczenie 
 1   Układ zerujący BOD wyłączony 
 0   Układ zerujący BOD włączony 

BODLEVEL (wartość początkowa 1) - określa napięcie zadziałania układu kontroli zasilania.

 BODLEVEL   Poziom Napięcia: 
 min.   typ.   max. 
 1   2,4V   2,6V   2,9V 
 0   3,7V   4,0V   4,5V 

Zalecane BODLEVEL = 1 dla ATmega8L oraz BODLEVEL = 0 dla ATmega8.
Wartość BODLEVEL = 1 jest nie przydatna dla modelu ATmega8.

WDTON (wartość początkowa 1) - Aktywacja wewnętrznego systemu Watchdog.

 WDTON   Znaczenie 
 1   Watchdog wyłączony 
 0   Watchdog włączony 

RSTDISBL (wartość początkowa 1) - Określa funkcję pinu Reset.

 RSTDISBL   Znaczenie 
 1   Pin PC6 używany jako wejście sygnału RESET 
 0   Pin PC6 używany jako zwykły port I/O 

UWAGA! Należy starannie obchodzić się ustawianiem tego bitu konfiguracyjnego. Zaprogramowanie go wartością 0 skutkuje zablokowaniem sobie dostępu do mikrokontrolera poprzez programator szeregowy (w tym ISP). Aby taki mikrokontroler odblokować należy zastosować programator równoległy.

EESAVE (wartość początkowa 1) - blokada kasowania pamięci EEPROM w operacjach kasowania pamięci FLASH.

 EESAVE   Znaczenie 
 1   brak blokady, pamięć kasowana wraz z pamięcią FLASH 
 0   pamięć nie jest kasowana 

Akt trzeci, taktować czy nie taktować......

Konfiguracja oscylatora i bitów SUT

Pozostałe bity konfiguracyjne są szczególne, określają one źródło sygnału taktującego uC oraz czasy opóźnień wykonywanego programu. W zależności od tego skąd nasz uC będzie taktowany, poszczególne bity będą odgrywać nieco odmienne funkcje.
Można jednak przytoczyć ogólne ich przeznaczenie.

CKSEL3...0 (wartość początkowa 0001) - bity określają źródło sygnału taktującego uC.
CKOPT (wartość początkowa 1) - opcje oscylatora.
SUT1 i SUT0 (wartość początkowa 01) - bity określają czas opóźnienia rozpoczęcia realizacji programu przez uC po włączeniu zasilania.

Zewnętrzny Kwarc:
 CKOPT   CKSEL3...1   Częstotliwość Kwarcu [MHz] 
 1   101   0,4-0,9 
 1   110   0,9-3,0 
 1   111   3,0-8,0 
 0   101   1,0-3,0 
 0   110   3,0-8,0 
 0   111   8,0-16,0 

Rekomendowane wartości C1 i C2: 12-22pF

Bit CKSEL0 wraz z SUT1 i SUT0 określają czas startu (opóźnienie rozpoczęcia realizacji programu).

 CKSEL0   SUT1...0   Czas od zgłoszenia sygnału RESET   Zalecane Zastosowania 
 0   00   4,1ms   Ceramiczny Rezonator
 Szybki wzrost napięcia. 
 0   01   65ms   Ceramiczny Rezonator
 Powolny wzrost napięcia. 
 0   10   -   Ceramiczny Rezonator
 BOD włączony. 
 0   11   4,1ms   Ceramiczny Rezonator
 Szybki wzrost napięcia. 
 1   00   65ms   Ceramiczny Rezonator
 Wolny wzrost napięcia. 
 1   01   -   Krystaliczny Oscylator
 BOD włączony. 
 1   10   4,1ms   Krystaliczny Oscylator
 Szybki wzrost napięcia. 
 1   11   65ms   Krystaliczny Oscylator 
Powolny wzrost napięcia. 

Kwarc o niskiej częstotliwości: (32,768kHz)

Używając kwarc zegarkowy, należy ustawić wartość CKSEL na "1001".

Zaprogramowanie bitu CKOPT umożliwia podłączenie wewnętrznych kondensatorów do XTAL1 i XTAL2, dzięki czemu nie są potrzebne stosowane kondensatory zewnętrzne. Wewnętrzne kondensatory mają wartość nominalną 36pF.

 SUT1...0   Czas od zgłoszenia sygnału RESET   Zalecane Zastosowania 
 00   4,1ms*   Szybki wzrost napięcia lub BOD włączony 
 01   65ms*   Powolny wzrost napięcia 
 10   65ms   Stabilna częstotliwość na starcie 
 11   Zarezerwowany 

* te opcje powinny być używane tylko wtedy, gdy stabilność częstotliwości przy starcie nie jest ważna dla aplikacjii.

Zewnętrzny Oscylator RC:

 CKSEL3...0   Częstotliwość [MHz] 
 0101   0,1-0,9 
 0110   0,9-3,0 
 0111   3,0-8,0 
 1000   8,0-12,0 

Częstotliwość wyraża się wzorem f=1/(3RC), C powinien być conajmniej 22pF.

Programując CKOPT, użytkownik włącza wewnętrzny kondensator 36pF pomiędzy XTAL1 a GND, można wtedy usunąć C zewnętrzny.

 SUT1...0   Czas od zgłoszenia sygnału RESET   Zalecane Zastosowania 
 00   -   BOD włączony 
 01   4,1ms   Szybki wzrost napięcia 
 10   65ms   Powolny wzrost napięcia 
 11*   4,1ms   Szybki wzr. nap. lub BOD włączony 

*Opcja nie powinna być wykorzystywana gdy używamy częstotliwości maksymalnej dla danej aplikacji.

Wewnętrzny generator RC:

 CKSEL3...0   Częstotliwość [MHz] 
 0001   1.0 
 0010   2.0 
 0011   4,0 
 0100   8,0 
 SUT1...0   Czas od zgłoszenia sygnału RESET   Zalecane Zastosowania 
 00   -   BOD włączony 
 01   4,1ms   Szybki wzrost napięcia 
 10   65ms   Powolny wzrost napięcia 
 11   Zarezerwowany 

CKOPT zawsze nie zaprogramowany!

THE END

     Fusy to jednak wredne stworzenia. Niby niepozorne a czasem dające się we znaki. Mimo wszystko nie wolno lekceważyć ich "małego głodu" i z miejsca nakarmić je odpowiednimi wartościami. Dobrze skonfigurowany mikrokontroler daje gwarancje wieczystego (przynajmniej jego) godnego, dobrego działania. W przypadku innych rodzajów mikrokontrolerów z rodziny AVR, aby wywiedzieć się wszystkiego na temat możliwości ich Fusów, należy sięgnąć do dokumentacji odpowiedniego podzespołu. Co jak co, ale nic tak nie ratatuje elektronika z opresji jak dobra dokumentacja.

Cóż, jak to się mówi - dobra dokumentacja nie jest zła!

Małgorzacie.
Dariusz Iwanoczko /22-04-2008/
spark89(maupa)wp(kropka)pl


Podziękowania dla Pana Sławka za wyłapanie błędu w tabeli!

Bibliografia:
  • Andrzej Pawluczuk - "Sztuka programowania mikrokontrolerów AVR - Podstawy"
  • www.atmel.com/dyn/resources/prod_documents/doc2486.pdf
  • www.edw.com.pl/ea/avr/avr-fuse.pdf



  • Powrót Do Wizytówki
     PostNuke  | Wsparcie PostNuke  | Programiści  

    Web site powered by PostNuke ADODB database libraryPHP Language

    All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest (c) 2003 by me
    This web site was made with PostNuke, a web portal system written in PHP. PostNuke jest Darmowym Oprogramowaniem na licencji GNU/GPL.
    Możesz publikować u siebie nasze newsy za pomocą pliku backend.php