====== Fusebity ======
Jak zaznaczałem wielokrotnie zabawa fusebitami może skutecznie zablokować nasz układ. Jednak są one bardzo ważne. Jeżeli otworzymy stronę [[http://www.engbedded.com/fusecalc/]] i wybierzemy układ Atmega8A zobaczymy taką listę **Opcje podkreślone mogą zablokować programowanie układu! Należy je sprawdzić 3 razy przed programowaniem**: \\
{{ :pl:avrc:art:fusebits.jpg }}\\
Po kolei objaśniam znaczenie wszystkich pól wyboru:
^ Pierwsza lista - lista wyboru źródła sygnału taktującego ^
|Ext. Clock - Sygnał zegarowy doprowadzamy do pinu XTAL1, XTAL2 nie podłączony (z jakiegoś generatora)|
|**Int. RC Osc. - Sygnał z wewnętrznego oscylatora RC [opcja domyślna]**|
|Ext. RC Osc. - Sygnał z zewnętrznego oscylatora RC.|
|** Ext. Crystal - Sygnał z zewnętrznego oscylatora kwarcowego.**|
^__Brown-out detection enabled__ ^
|Jeżeli zaznaczymy to pole w układzie zostanie aktywowany układ monitorujący napięcie zasilania. Jeżeli spadnie ono do określonego poziomu, układ wejdzie w stan resetu który zostanie zwolniony dopiero po ponownym uzyskaniu wymaganego napięcia.|
^__Brown-out...__^
|Wybieramy czy układ ma pracować od napięcia zasilania 2.7 czy 4 [V].|
^__Boot Reset vector Enabled__ ^
| Zaznaczamy jeżeli układ posiada bootloader.|
^__Boot Flash ...__ ^
| Wybieramy pozycję bootloadera w pamięci.|
^__Preserve EEPROM memory through the Chip Erase cycle__ ^
| Operacja kasowania układu nie będzie kasowała zawartości pamięci EEPROM.|
^__CKOPT fuse (operation dependent of CKSEL fuses)__
^__Serial program downloading (SPI) enabled__ ^
| Odczyt programu z układu możliwy tylko jeżeli ta opcja jest aktywna.|
^__Watch-dog Timer always on__ ^
| Jeżeli to zaznaczymy to watchdog będzie aktywowany po resecie.|
^__Reset Disabled (Enable PC6 as i/o pin)__ ^
| W małych układach pinów IO jest mało, możemy użyć pinu nr 1 jako portu we/wy ale tracimy możliwość programowania|
Na razie zrozumienie wszystkich wymienionych opcji nie jest konieczne.
===== Zmiana częstotliwości taktowania wewnętrznego generatora RC =====
W sekcji __Current Settings__ możemy zobaczyć wartości fusebitów oraz linię komendy dla AVRDude. Wartości domyślne to: LO 0xE1 HI 0xD9.\\
Zmieńmy na pierwszej liście częstotliwość na 8 [MHz] z wewnętrznego generatora RC (z +64 ms startup). Powinniśmy zobaczyć: -U lfuse:w:0xe4:m -U hfuse:w:0xd9:m
A więc programujemy! avrdude -pm8 -cusbasp -U lfuse:w:0xe4:m -U hfuse:w:0xd9:m
Ponieważ układy AVR mają moc obliczeniową 1 MIPS na 1 MHz po tej operacji mamy 8x większą moc obliczeniową!
===== Taktowanie zewnętrznym generatorem kwarcowym =====
Ponieważ wewnętrzny generator RC nie oferuje dużych częstotliwości taktowania a co gorsza jest niestabilny. Jeżeli będziemy pracować z interfejsami wymagającymi stabilnego taktowania (np USART) nie możemy opierać się na wewnętrznym generatorze.\\
{{:pl:avrc:art:cap_quartz.jpg|}} \\
Kondensatory jakie należy zastosować powinny mieć wartość 10 lub 22 [pF]. Zastosowanie oscylatora kwarcowego pozbawia nas jednak 2 portów IO. Aby układ zaczął pracować z oscylatorem należy zaprogramować fusebity analogicznie jak w powyższym przykładzie wybierając odpowiednie źródło. Zagadnieniom taktowania poświęcona jest cała sekcja 8 noty katalogowej __System Clock and Clock Options__.
====== avr libc ======
Po pierwsze i najważniejsze, dokumentacja [[http://www.nongnu.org/avr-libc/user-manual/index.html]]\\
AVR-libc jest częścią łańcucha narzędzi GNU, dostarcza funkcje z [[wp>C_standard_library|standardowej biblioteki C]] oraz funkcje specyficzne dla układów AVR. Warto zapoznać się z listą modułów na stronie [[http://www.nongnu.org/avr-libc/user-manual/modules.html]]
===== Nagłówki =====
Kilka modułów specyficznych dla AVR z którymi warto się zapoznać:
^ Nagłówek ^ Opis ^
| '''' | Podstawowy nagłówek. Zawiera definicje wszystkich rejestrów układu |
| '''' | Dostarcza funkcji opóźniających w [ms] i [us] |
| '''' | Zawiera definicje podstawowych typów danych oraz wartości maksymalnych/minimalnych |
| '''' | Makra i narzędzia do obsługi przerwań |
| '''' | Dostarcza makra do obliczania ustawień transmisji szeregowej |
| '''' | Obsługa pamięci EEPROM |
| '''' | Narzędzia do odczytu danych z pamięci programu |
| '''' | Zarządzanie zasilaniem wewnętrznych układów procesowa |
| '''' | Funkcje pozwalające wprowadzić procesor w tryb uśpienia |
| '''' | Obsługa sprzętowego watchdoga |
| '''' | Obliczenia CRC((CRC - Cyclic Redundancy Check: Cykliczny kod nadmiarowy, system sum kontrolnych wykorzystywany do wykrywania przypadkowych błędów pojawiających się podczas przesyłania i magazynowania danych binarnych.)) dla kontroli transmisji |
| '''' | Dostarcza makro obliczające parzystość zmiennej |
| '''' | Narzędzia do transmisji TWI((TWI - Two Wire Interface lub I²C - Inter Integrated Circuit)) |
====== Informacje dodatkowe ======
* [[http://www.atmel.com/dyn/resources/prod_documents/doc2521.pdf|Atmel AVR042: AVR Hardware Design Considerations]] - Nota aplikacyjna omawiająca zagadnienia: poprawnego zasilania, poprawnego podłączenia linii reset, interfejsu SPI do programowania oraz używania zewnętrznych oscylatorów.