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. |
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.
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ą!
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.
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
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 CRC1) dla kontroli transmisji |
<util/parity.h> | Dostarcza makro obliczające parzystość zmiennej |
<util/twi.h> | Narzędzia do transmisji TWI2) |