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.