Svítíme s LED

Popis registrů pro práci s porty


  Porty procesorů AVR jsou ovládány registry uloženými v paměti RAM. Stejně je to i se všemi ostatními periferiemi, které jednočip obsahuje. V tomto díle si podrobněji popíšeme pouze tyto registry. Na konci článku však máte možnost přečíst si alespoň stručně výčet registrů obsahujících nastavení pro procesor ATMEGA16, pro který budeme dělat většinu našich programů.

   Porty procesorů AVR pracují s několika registry:
  • datové registry
  • registry pro nastavení funkce portu

Datové registry

   AVR zná dva datové registry pro práci s porty. PORT(X) a PIN(X).

  PORT(X), kde X udává, o který port se jedná (A,B,C,D...). Zápisem do toho registru přiřadíme portu určitou hodnotu, v případě, že je nastaven jako výstupní, a nebo jím nastavíme (případě odstraníme) pull-up rezistory, v případě, že je port nastaven jako vstupní.

  PIN(X), kde X udává, o který port se jedná je naplněno hodnotou, která je reálně na portu procesoru. PORT(X) tedy slouží pro zápis na port, PIX(X) slouží pro čtení z portu.

Registry pro nastavení portu

 Jediným přímým registrem pro nastavení portu je DDR(X), kde X opět znamená označení portu. Registr určuje, zda se port (pin) bude chovat jako vstupní nebo výstupní. Zapsáním log. 1 na bit registru se odpovídající pin nastaví jako výstupní. Vynulováním bitu (zápisem log 0.) je port (pin) nastaven jako vstupní.

  Nastavení portu má tak vliv na to, co ovivňuje registr PORT(X). Pokud je port nastaven jako vstupní, PORT(X) určuje, zda je připojen pull-up rezistror, je-li port nastaven jako výstupní PORT(X) učuje logický stav samotného portu.

Režimy vstupně/výstupních portů

DDR(X) PORT(X) PUD I/O pull-up komentář
0 0 X vstup ne HI-Z
0 1 0 vstup ano ZDROJ PROUDU
0 1 1 vstup ne HI-Z
1 1 X výstup ne Výstup LOG 1
1 0 X výstup ne Výstup LOG 0

  Zatím jsme si neřekli nic o registru MCUCR. Tento registr řídí činnost procesoru. Nám slouží v dnešním příkladě pouze bit označovaný jako PUD (pull up dissable). Tento bit globálně zakazuje použití pull-up rezistoru.

Instrukce

 Nyní už víme jak nastavit port. Než se ale pustíme do díla, musíme si popsat některé instrukce, které v tomto příkladě budeme používat
CBI		DDRD,PORTD6  ;vynuluje bit (pin)
SBI DDRD,PORTD6 ;nastavi bit (pin)
Instrukce CBI vynuluje v registru DDRD bit, 6. (řetězec PORT6 je zástupným řetězcem za  číslo 6)
Instrukce SBI nastaví v registru DDRD bit 6.

LDI             R18,20	     ;do R18 vloží 20
Instrukce LDI slouží k přímému uložení čísla do registru. V tomto případě tedy do registru R18 vloží číslo 20.

OUT              DDR,REG	;aktivuj výstupy
Tato Instrukce provede překopírování obsahu registru pojmenovaného jako REG do registru pojmenovaného jako DDR.

RJMP		SKOK	
Bezpodmínečně skočí na návěští SKOK

Nyní si už  si můžeme vytvořit jednoduchý program pro ovládání LED diody připojené na portu D, pinu 6.

	.NOLIST	
.INCLUDE "m16def.inc"
.LIST

.CSEG ;kódový segment
.DEF REG=R16 ;pracovní registr
.EQU DDR=DDRD ;řízení směru
.EQU PORT=PORTD ;port
	LDI REG,LOW(RAMEND)
OUT SPL,REG ;nastav SP
LDI REG,HIGH(RAMEND)
OUT SPH,REG
	LDI REG,$FF	;do REG přesune FF
OUT DDRD,REG ;PORTD -> výstupní
OUT PORTD,REG ;PORTD -> vše LOG 1

SKOK:
RJMP SKOK

Nyní si program popíšeme:

	.NOLIST	
.INCLUDE "m16def.inc"
.LIST

Tato část vloží do zdrojového kódu soubor s pojmenovanými konstantami pro procesor ATMEGA16 Například místo číselného zapsání adresy registru DDRF, stačí napsat pouze jeho název, do něhož je adresa číselně přiřazena.
Direktiva .NOLIST zajistí aby následující kód nebyl vložen do kódu pro ladění.

	.CSEG	        ;kódový segment	
.DEF REG=R16 ;pracovní registr
.EQU DDR=DDRD ;řízení směru
.EQU PORT=PORTD ;port

Tato část programu nuje R16 jako REG. V následujícím kódu se tedy můžeme odkazovat na REG místo na R16. To je usnadnění zvláště při větším množství používaných  registrů. Zvyšuje to přehlednost programu.
Direktiva .CSEG překladači říká, že následující část má být uložena do paměti programu.

	LDI REG,LOW(RAMEND)
OUT SPL,REG ;nastav SP
LDI REG,HIGH(RAMEND)
OUT SPH,REG

Tato část programu nastaví zásobník. Co je to zásobník si řekneme v některém z dalších dílů. Pro tuto chvíli berte tento odstavec jako nutnou součást kódu.

	LDI REG,$FF	;do REG přesune FF
OUT DDRD,REG ;PORTD -> výstupní
OUT PORTD,REG ;PORTD -> vše LOG 1


Zde se nastaví port D jako výstupmí a do registru určujícího stav pinů portu se uloží číslo FF, což znamená, že všechny piny budou nastaveny do log. 1. Případná LED připojená na některý z pinů portu by se v tuto chvíli rozsvítila.

SKOK:
RJMP SKOK

Tato část kodu zajistí pouze nekončné cyklení programu. Stavy portu tedy nebudou ovlivňovány dalšími instrukcemi.


To byl jednoduchý program pro ovládání stavu portu procesoru AVR. Máte-li nějaké nejasnosti týkající se funkce programu, doporučuji si kód odkrokovat v AVR Studiu. Příště si ukážeme podobný program v CodeVision AVR. Slibovaný výčet registrů si můžete prohlédnout na stránkách výrobce.

Komentovat článek

Jméno:  
Zpráva:

Komentáře k článku

Ondřej Karas - 10.7.2007 17:00

Díky, opraveno

Mirek - 16.6.2007 11:42

V tabulce Režimy vstupně/výstupních portů by ve čtvrtém řádku měla být hodnota PORT(X)=1.