Portál AbcLinuxu, 24. dubna 2024 14:07
Firma ATMEL vydala novou verzi oblíbeného jednočipu. Co je potřeba vědět, abyste pro něj mohli v Linuxu programovat.
Asi před rokem vyšel na serveru AbcLinuxu článek Jana Martínka o programování jednočipů ATMEL pod linuxem: Jednočipy pod Linuxem.
Tento článek byl jistě pro mnohé začátečníky výborným seznámením s jednočipy. Od doby jeho vzniku se však změnila jedna věc. Jednočip AT90S2313, který je v článku použitý, přestala firma ATMEL vyrábět, a dnes je možné koupit jen jeho náhradu ATtiny2313. Ta má za stejné peníze několik příjemných vylepšení, bohužel však není s AT90S2313 kompatibilní a doposud chybí její podpora v některých vývojářských balíčcích (bohužel právě těch, které užívá zmíněný článek).
V tomto mini-howto bych proto rád popsal, jak nefunkční programy nahradit a jak obejít zmíněnou nekompatibilitu.
V citovaném článku se k nahrávání programu do mikročipu používá
program uisp
. Ten si bohužel prozatím s tiny2313 neumí
poradit (nová verze jednočipu by měla používat zápis do flashe po blocích
na rozdíl od zápisu po bytech u AT90S2313). Řešením je použít
program avrdude
.
S tímto programem je ovšem spojeno několik malých zádrhelů. Prvním z
nich je, že ve standardní distribuci chybí podpora právě pro to zapojení
programátoru, které používá uisp
. Jelikož má ale
avrdude
tu sympatickou vlastnost, že se zapojení programátoru
dá nastavit v konfiguračním souboru a není nutné jej znovu kompilovat,
pomoc je snadná: Stačí přidat do souboru /etc/avrdude
tyto
řádky:
programmer id = "dapa"; desc = "Direct Parallel... as found in uisp..."; type = par; reset = 16; sck = 1; miso = 11; mosi = 2; ;
Program je potom do jednočipu možné nahrát následujícím příkazem:
avrdude -c dapa -p t2313 -U flash:w:helloworld.hex
Pokud používáme k nahrávání Makefile z článku, stačí nahradit
řádku s příkazem uisp
za něco takovéhoto (připomínám, že
kvůli struktuře souboru Makefile musí být prvním znakem na řádce
tabulátor):
load: $(PROJECT).hex avrdude -c dapa -p t2313 -U flash:w:$(PROJECT).hex
Jednou z novinek, která se v ATtiny2313 objevila, je, že jednočip nepotřebuje už nutně externí krystal, neboť má v sobě integrován interní oscilátor. Špatnou zprávou ovšem je, že nám to rozhodí časování sériového portu. Při nastavení od výrobce totiž jednočip tepe pouze rychlostí 4/8Mhz, tj. 500kHz.
Abychom zapnuli externí krystal jako zdroj hodinového taktu, je
potřeba nastavit takzvané pojistky ("fuses"). Pro krystal s taktem
větším, než 8MHz a pro zařízení s pomalým náběhem proudu
by nastavení (s pomocí programu avrdude
) vypadalo takto:
avrdude -c dapa -p t2313 -U lfuse:w:0xff:m
Jinými slovy "nižší byte pojistky" (Fuse Low Byte) je nastaven na hodnotu 0xff, což vykoná přesně to, co potřebujeme (standardní hodnota od výrobce je 0x62). POZOR, při každém experimentování s pojistkami se doporučuje důkladně prostudovat příslušný datasheet k jednočipu. Jinak bychom si také mohli vypnout programování přes sériové rozhraní, nebo udělat z pinu RESET další vstupně-výstupní linku. Pak bychom už do jednočipu bez speciálního programátoru žádný program nenahráli. Chtěl bych také upozornit na to, že tyto pojistky jsou u každého typu jednočipu jiné a je vždy třeba nahlédnout do příslušné dokumentace.
Avr-gcc zatím bohužel (pokud vím) nemá pro ATtiny2313 podporu.
Nová verze avr-gcc by měla být nekompatibilní se starší (například
by měla přestat fungovat makra sbi()
a cbi()
),
takže pokud máte již nějaké projekty pro AVR-ka rozdělané, nemusel
by přechod na novější verzi být tím pravým.
Naštěstí jsou si AT90S2313 a ATtiny2313 do velké míry podobné, takže některé jednodušší programy budou fungovat tak, jak jsou, u složitějších stačí provést drobné změny.
Nejpodstatnější změnou pro čtenáře zmíněného článku je fakt, že ATMEL v novém ATtiny2313 používá modernizované sériové rozhraní (které nazývá jako USART, oproti předchozímu UART). Zde je několik problémů s kompatibilitou.
Zaprvé má USART jinak pojmenované registry, dva má dokonce navíc. To je možné obejít tím, že si registry sami nadefinujeme, například takto:
#define UCSRA USR #define UCSRB UCR #define UBRRL UBRR #define UCSRC _SFR_IO8(0x03) #define UBRRH _SFR_IO8(0x02) // UCSRA #define UPE 2 #define U2X 1 // UCSRB #define MPCM 0 #define UCSZ2 2 // UCSRC #define UMSEL 6 #define UPM1 5 #define UPM0 4 #define USBS 3 #define UCSZ1 2 #define UCSZ0 1 #define UCPOL 0
Co se týče vlastního kódu, zůstává vše při starém, až na způsob, jakým USART inicializujeme. Nový způsob může vypadat asi nějak takto:
sbi(UCSRB, TXEN); // UCR -> UCSRB sbi(UCSRB, RXEN); sbi(UCSRC, UCSZ0); // 8bit přenos... sbi(UCSRC, UCSZ1); UBRRH = 0; // 9600 baudu, POZOR, nejdříve je třeba UBRRL = 59; // nastavit UBRRH, potom teprve UBRRL!
Jinou možností, jak zmíněnou nekompatibilitu obejít, je použít jiný jednočip: Konrétně ATmega8 je jen o málo dražší a přitom má daleko lepší parametry, než ATtiny2313. Je však třeba upozornit na to, že některé problémy nalezneme i u toho jednočipu: konkrétně je také nutno vypnout interní oscilátor a stejně tak používá ATmega8 již zmodernizovanou verzi sériového rozhraní.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.