František Pospíšil

Na svých stránkách popisuji cesty, kterými jsem došel k zamýšleným cílům. Cíle se občas během cesty změnily.

Programování

Procesor ATxmega128A1U

Při seznamování s TFT displejem jsem dospěl k názoru, že procesory řady ATmega mají pro tuto aplikaci malý výkon. Pokud má být několikrát za sekundu periodicky překreslováno větší množství hodnot zobrazovaných na displeji, tak procesor už nemá moc času pro další práci. Navíc, TFT displej je vhodné připojit prostřednictvím 16-ti bitové sběrnice, další piny jsou nutné pro řízení komunikace. Takže množství volných pinů se rychle zmenšuje i u ATmega128. Proto jsem se rozhodl najít jiný, výkonnější procesor. Protože jsem chtěl zůstat u výrobků společnosti Atmel, zvolil jsem obvod ATxmega128A1U.

ATxmega128A1U

Procesor lze koupit v ČR např. u Farnell. Jako vývojové prostředí používám AVR studio. Procesor můžeme naprogramovat běžnými přípravky, jako je Dragon, AVRISP MK2 atd. Pro komunikaci při programování není použit kanál SPI, ale procesor má pin PDI_DATA, který se připojí na první pin šesti-pinového konektoru programátoru. Dále je nutný signál RESET, VCC a GND. Maximální kmitočet procesoru je 32MHz, což je dvojnásobek proti ATmega128. Některé instrukce potřebují menší počet cyklů a hlavně, procesor má integrováno velké množství hardwarových modulů, které zjednodušují program.

Dokumentace k procesoru

U obvodů rodiny ATmega je obvyklé, že každý procesor má svůj datový list – dokument PDF, ve které jsou všechny informace o obvodu, popis vlastností, registrů, způsob nastavení všech periferií. U ATxmega jsem si musel zvyknout na to, že dokumenty jsou dva. Jedním je manuál ke všem procesorům skupiny – skupiny jsou čtyři, označeny písmeny A, B, C a D. V manuálu jsou všechny informace, které jsou společné pro procesory z jedné skupiny. Jsou popsány periferie a způsob jejich ovládání prostřednictvím registrů. V dokumentu ke konkrétnímu procesoru je popsáno připojení pinů a elektrické vlastnosti obvodu. Při přechodu z ATmega je to nezvyklé, ale ve výsledku výhodné uspořádání informací. Dále je na webu atmel.com k dispozici sada dokumentů, které popisují použití jednotlivých částí procesoru.

Zdroj hodinového signálu

Zdroj hodinového signálu u procesorů rodiny ATxmega není ovládán pomocí bitů pojistek, jak je zvykem u ATmega. Hodinový kmitočet u procesorů xmega je řízen programově, prostřednictvím několika registrů. Po resetu je vždy připojen interní RC oscilátor 2MHz. Jiný zdroj signálu můžeme připojit nastavením registrů. Je možnost připojit interní 32MHz oscilátor, 32,768kHz, nebo externí krystal. Maximální kmitočet procesoru je 32MHz, některé periferie mohou běžet na vyšším kmitočtu. Obvod procesoru sleduje chod oscilátorů a zobrazuje jej na registru OSC_STATUS. Takže před připojením oscilátoru je možné a zároveň vhodné zjistit, jestli oscilátor funguje. Chod procesoru nelze zablokovat špatným naprogramováním pojistek, jako u ATmega.

    OSC_CTRL |= OSC_RC32MEN_bm;                // spusti 32HMz oscilator
    while(!(OSC_STATUS & OSC_RC32MRDY_bm));    // ceka, az bude oscilator aktivni
    CCP = CCP_IOREG_gc;                        // zapis hodnoty 0xD8 do registru, ktery umozni dalsi zapis
    CLK_CTRL = CLK_SCLKSEL_RC32M_gc;           // pripojeni 32MHz oscilatoru

Registr OSC_CTRL spouští oscilátory, registr OCS_STATUS zobrazuje jejich správnou funkci. Registr CLK_CTRL připojí oscilátor k procesoru. Zápis do tohoto registru je chráněn tím, že je nutné napřed zapsat hodnotu 0xD8 do CCP. Potom je zápis do chráněných registrů umožněn po dobu čtyř cyklů. Všechny přerušení jsou během této doby zakázány. Nevyřízené přerušení bude zpracováno po ukončení této doby.

Popsané uspořádání zdrojů hodinového signálu umožňuje sestavit mnoho variant úsporných režimů, dle aktuální potřeby programované aplikace.

Ovládání I/O portů procesoru ATxmega128

V ATmega existují tři registry, které ovládají I/O pin portu. Jsou to DDRx, PINx a PORTx. V Xmega je tento koncept rozšířen, což umožňuje větší rozsah použití. Možnosti jsou podobné jako u procesorů ARM, nebo STM32. Jednou z důležitých věcí je alternativní funkce I/O pinu. To umožňuje použít univerzální I/O pin pro integrované hardwarové moduly, jako je USART, I2C, SPI a podobně. Xmega navíc může tyto alternativní funkce softwarově přemísťovat z jednoho pinu na druhý.

I/O porty jsou pojmenovány jako PORTA, PORTB atd., přičemž jednotlivé piny jsou pojmenovány PA6, PB4… takže existuje určitá podobnost se staršími ATmega obvody, pokud jde o pojmenování portů a jednotlivých pinů. Ke každému portu je přiřazeno několik registrů:

  • DIR – Tento registr určuje směr toku dat pro jednotlivé piny portu. Je-li bit nastaven na log.1, bude pin konfigurován jako výstupní, když bude zapsána log.0, bude pin vstupní.
  • DIRSET – Registr může být použit namísto registru DIR. Při čtení tohoto registru bude vrácena hodnota DIR.
  • DIRCLR – registr lze použít k vynulování bitů. Zápisem budou smazány příslušné bity v DIR. Při čtení registru bude vrácena hodnota v DIR.
  • DIRTGL – registr lze použít k nastavení bitů. Zápisem budou nastaveny příslušné bity v DIR. Při čtení bude vrácena hodnota v DIR.
  • OUT – hodnota registru bude nastavena na pinech portu, když je port prostřednictvím registru DIR nastaven jako výstupní. K registru OUT přísluší virtuální registry OUTSET, OUTCLR, OUTTGL.
  • IN – registr pro čtení dat z portu.
  • INTCTRL – registr ovládá přerušení. Jsou využity bity 0 a 1 pro INT0. Bity 2 a 3 ovládají přerušení INT1
  • INT0MASK – Bity registru jsou použity pro maskování, které piny budou použity jako zdroje přerušení INT0. Pro každý pin rozhoduje PINCTRL registr.
  • INT1MASK – Bity registru jsou použity pro maskování, které piny budou použity jako zdroje přerušení INT1. Pro každý pin rozhoduje PINCTRL registr.

Registr PINnCTRL

Registr ovládá vlastnosti jednoho pinu v portu. Takže ke každému portu je přiřazeno osum těchto registrů. Zápis např. PORTD_PIN1CTRL = 0x01;

  • Bit 7 – SRLEN:  nastavením bitu omezíme rychlost přeběhu na pin n.
  • Bit 6 – INVEN: invertuje vstup a výstup dat na pin n.
  • Bit 5 : 3 – OPC: Output/pull konfigurace pinu n.
  • Bit 2 : 0 – ISC: Nastavuje vstup a konfiguraci pinu podle tabulky. Konfigurace rozhoduje o tom, jakým způsobem může být vyvoláno přerušení.

Skupina bitů OPC připojuje rezistory, skupina bitů ISC řídí přerušení. ISC=111 odpojí pin úplně.

OPC_bity

ISC_bity

Příklad nastavení I/O portu

    PORTE_OUT = 0x00;
    PORTE_DIR = 0x00;                    // port bude vstupni
    PORTE_PIN0CTRL = 0b10011001;        // citlivy na vzestupnou tlacitko PE0
    PORTE_PIN1CTRL = 0b10011001;        // citlivy na vzestupnou tlacitko PE1

Externí přerušení u ATxmega

PMIC a priorita přerušení

Programovatelný, víceúrovňový ovladač přerušení PMIC, nastavuje priority požadavků na přerušení. Stejně jako u jiných procesorů by měl být nastaven před globálním povolením přerušení, pomocí bitu SREG.

Je-li povoleno přerušení, PMIC přijímá požadavek na přerušení a ten buď vykoná, nebo čeká, na základě nastavených priorit. Po vykonání požadavku na přerušení, se PMIC vrátí na původní úroveň, nebo do stavu před voláním přerušení.

To znamená, že přerušení s vyšší prioritou, přeruší vykonávání programu přerušení s nižší prioritou. Po zpracování přerušení s vyšší prioritou, bude zpracováno další přerušení. V základním nastavení mají vektory s nejnižší adresou nejvyšší prioritu. Například, vektor přerušení Reset má nejvyšší prioritu a nejnižší adresu.

V Xmega existují dva typy přerušení, to jsou statické a dynamické. Statické přerušení jsou ty, které mají pevnou adresu vektoru a zároveň nízkou prioritu přerušení. Dynamické chování je dosaženo Round-robin Scheduling (RRS) technikou. RRS zajišťuje, že přerušení nízké úrovně není vynecháno. Použije-li se tato technika, pak poslední vyvolané přerušení bude mít nejnižší prioritu. V nízké úrovni přerušení existuje mechanismus, který zajistí, že všechny přerušení jsou zavolány v určitém časovém horizontu.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *