Minimální základy
Ovládání portů na čipech Atxmega je jednoduché a komfortní. Protože už nějáké zkušenosti máte, skočíme rovnou na přehlede registrů.
- DIR - zápisem log.1 nastavíte příslušný pin jako výstup a log.0 jako vstup
- DIRSET - atomické nastavování bitů DIR registru. Zápisem log.1 se přislušné bity v DIR nastaví do log.1
- DIRCL - atomické nulování bitů DIR registru. Zápisem log.1 se přislušné bity v DIR nastaví do log.0
- DIRTGL - atomické přepínání bitů DIR registru. Zápisem log.1 přislušné bity v DIR změní svoji hodnotu
- OUT - Srkze tento registr zapisujete data na PORT. Pokud jsou příslušné piny nastaveny jako výstup, tak log.1 v tomto registru má za následek nastavení příslušného pinu do log.1 a obráceně.
- OUTSET - Atomický přístup k registru OUT (analogicky jako předchozí registry)
- OUTCLR - Atomický přístup k registru OUT (analogicky jako předchozí registry)
- OUTTGL - Atomický přístup k registru OUT (analogicky jako předchozí registry)
- IN - slouží ke čtení log. stavů na portu (nelze do něj zapisovat)
Pro základní manipulaci s porty, tedy k nastavení vstupu / výstupu, zápisu a čtení hodnot by vám tyto registry měly stačit. Pro specifičtější nastavení každého bitu individuálně slouží osmice registrů PINnCTRL, kde n může být 0 až 7. V něm volíte další parametry každému pinu. Můžete zde ovládat interní pull-up a pull-down rezistor a režim výstupu. Ten může být:
- TOTEM POLE - Tedy push-pull knfigurace, kdy výstup v log.1 dodává z výstupu proud a v log.0 je schopen odebírat z výstupu proud. Proud nesmí překročit 20mA.
- WIRED OR - Výstupem je "otevřený emitorů. Smysluplné použití má jen pokud je k výstupu připojen pull down rezistor (interní nebo externí). Umožňuje připojení více výstupů k jednomu uzlu.
- WIRED AND - Výstupem je "otevřený kolektor". Smysluplné použití má jen pokud je k výstupu připojen pull up rezistor (interní nebo externí). Umožňuje připojení více výstupů k jednomu uzlu.
- BUS KEEPER - inteligentní pull-up/down rezistor. Podle toho jaká je na sběrnici hodnota automaticky zapíná pull-up nebo pull-down rezistor ve snaze držet sběrnici na stejné hodnotě jako z ní přečetl. Využití neznám.
Dále je zde možné nastavovat "sense" pinu. To slouží pro využití v rámci externího přerušení nebo Event systému a budeme se jím zabývat později. Zbývají ještě dva bity. SRLEN - Slew rate limiting, kterému se budeme věnovat také později a INVEN, který kompletně invertuje funkci pinu (jako výstupu i jako vstupu).
"Zrychlovák" nastavení - MPCMASK
Jak již víme, každý pin lze pomocí registru PINnCTRL konfigurovat individuálně, taže nastavení třeba 16 pinů stejným způsobem je "zdlouhavé". Aby bylo možné nastavit více pinů jednoho portu zároveň, máme k dispozici registr MPCMASK. Do něj nejprve zapíšete "masku", která bude mít log.1 na těch místech, které piny budete chtít nastavovat. A potom stačí zapsat do jediného registru PINnCTRL zvolené nastavení. V tom okamžiku dojde ke stejnému nastavení všech dalších zvolených PINnCTRL registrů. Viz příklad:
PORTC.DIRCLR = PIN6_bm | PIN7_bm; // PC6 a PC7 vstup
PORTCFG.MPCMASK = PIN6_bm | PIN7_bm; // stejné nastavení pro PC6 a PC7
PORTC.PIN6CTRL = PORT_OPC_PULLUP_gc; // Pull-up pro všechny piny nastavené v MPCMASK
Remapování alternativních funkcí
Přirozeně mohou porty sloužit i různým periferiím. O tom kdy přebírá příslušná periferie (USART, časovač, atd.) kontrolu nad portem rozhoduje nastavení periferie. Piny jsou periferiím pevně rozděleny. Takže PC5 může sloužit třeba jako XCK1 (clock USARTC1) nebo jako MOSI (SPIC) a nebo dalším periferiím. Funkce jednotlivých pinů najdete v datasheetu v sekci "Alternate Pin Functions". Remapování je jedna z funkcí, která vám dává jistou volnost při volbě pinů. Můžete totiž rozmístění alternativních funkcí měnit. Změna se provádí v registru REMAP.
Clockout a Eventout
Clockout funkce vám umožňuje vyvést clock čipu na některý z výstupních pinů. Eventout analogicky umožňuje vývést některý event. Bitem CLKEVPIN volíte zda tyto funkce povedou na pin 4 nebo na pin 7. Pro Eventout i Clockout pak můžete individuálně volit na kterém portu tato funkce bude. Na výběr máte z portů PC,PD a PE, ale tento výběr je závislý na konkrétním čipu. Eventout a Clockou musíte přirozeně vyvést na jiný port ! Clockout vám pak umožňuje vyvést nejen takt jádra (CLK1X), ale také vyšší frekvence (CLK2X a CLK4X) sloužící časovačům nebo EBI modulu. Použité piny musí být přirozeně nastaveny jako výstup. V registru EVCTRL si pak můžete zvolit který z osmi Eventů povede na Eventout pin. Eventy se budeme zabývat v jiném tutoriálu.