Portál AbcLinuxu, 24. dubna 2024 14:07

Jednočip ATtiny2313 pod Linuxem

17. 6. 2005 | Petr Tomášek
Články - Jednočip ATtiny2313 pod Linuxem  

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.

Proč?

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.

Upload programu

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

Nastavení oscilátoru

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.

Kompilace

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!

Jiné náhrady

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í.

Související články

Seriál: Jednočipy pod Linuxem
Seriál: Sériová komunikace pod Linuxem

Odkazy a zdroje

ATtiny2313

Další články z této rubriky

HW novinky: podzimní přehled #2
HW novinky: podzimní přehled #1
HW novinky: návrat skleněných ploten v HDD
HW novinky: PCI Express 4.0 prý ještě letos
HW novinky: i Skylake-X s 12 jádry používá levnou teplovodivou pastu

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.