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:

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.

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 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 |
|---|---|
<avr/io.h> |
Podstawowy nagłówek. Zawiera definicje wszystkich rejestrów układu |
<util/delay.h> |
Dostarcza funkcji opóźniających w [ms] i [us] |
<stdint.h> |
Zawiera definicje podstawowych typów danych oraz wartości maksymalnych/minimalnych |
<avr/interrupt.h> |
Makra i narzędzia do obsługi przerwań |
<util/setbaud.h> |
Dostarcza makra do obliczania ustawień transmisji szeregowej |
<avr/eeprom.h> |
Obsługa pamięci EEPROM |
<avr/pgmspace.h> |
Narzędzia do odczytu danych z pamięci programu |
<avr/power.h> |
Zarządzanie zasilaniem wewnętrznych układów procesowa |
<avr/sleep.h> |
Funkcje pozwalające wprowadzić procesor w tryb uśpienia |
<avr/wdt.h> |
Obsługa sprzętowego watchdoga |
<util/crc16.h> |
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 |
<util/parity.h> |
Dostarcza makro obliczające parzystość zmiennej |
<util/twi.h> |
Narzędzia do transmisji TWI((TWI - Two Wire Interface lub I²C - Inter Integrated Circuit)) |
Informacje dodatkowe
- 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.