Vnější RAM

Z MAM wiki

Verze z 26. 4. 2012, 13:18; Hanzl (diskuse | příspěvky)
(rozdíl) ← Starší verze | zobrazit aktuální verzi (rozdíl) | Novější verze → (rozdíl)
Přejít na: navigace, hledání

ATmega128 (viz str. 22) umožňuje připojení vnější paměti RAM. Připojování vnějších pamětí k AVR pomocí klasické paralelní adresové a datové sběrnice není moc obvyklé; pokud bychom chtěli například připojit EEPROM, je skoro jistě lepší vybrat AVR s větší pamětí přímo na čipu, a pokud bychom potřebovali uložit opravdu hodně dat, je asi lepší připojit třeba SD kartu. Připojení vnější RAM ale smysl mít může. Jistě bychom paměť mohli připojit prostým softwarovým řízením I/O bran, ale zajímavější je rychlé připojení s hardwarovou podporou sběrnic, označované jako XMEM:

Spodních 8 bitů adresové sběrnice je multiplexováno s datovou sběrnicí, proto je třeba tuto část adresy uložit:


Takto vypadá průběh řídících signálů při zápisu a čtení:

[editovat] Přístup k vnější RAM z programu

Takto připojenou vnější RAM může program ovládat stejnými instrukcemi, jako ovládá vnitřní RAM - tedy například instrukcemi LD a ST s adresováním registrem Z, nebo instrukcemi LDS a STS, které mají 16-i bitovou adresu RAM přímo v kódu instrukce. V jazyce C obsah určité adresy můžeme přečíst asi nejsnáze pomocí ukazatele, například byte uložený na nejvyšší adrese v RAM je *(volatile char*)0xFFFF, kde 0xFFFF je konstanta 2^16-1 = 65535 (ve dvojkové soustavě 16 jedniček), (char*) je změna typu (z int na ukazatel) a * je dereference ukazatele (dostaneme obsah paměťového místa, kam ukazuje).

[editovat] Umístění vnější RAM a periferií na určité adresy

Adresové a řídící signály nemusíme propojit přímo, jak je naznačeno výše, ale můžeme je zpracovat kombinační logikou a dosáhnout tak toho, že na stejné sběrnice můžeme připojit RAM (či více obvodů RAM) i periferie a aktivovat jednotlivé obvody podle adresy. Obvykle je několik nejvyšších bitů adresy zavedeno do multiplexeru či do jednoduché sítě hradel, spolu s řídícími signály RD a WR. Pokud bychom například 16kB RAM chtěli namapovat jen do horní čtvrtiny celého 64kB prostoru, aktivovali bychom RAM jen tehdy, když jsou vodiče A15 a A14 ve stavu 1. Pokud bychom rozhodli jen podle A15, bude se 16kB RAM dvakrát opakovat (zrcadlit) v horní polovině 64kB prostoru. Chceme-li připojit vstupní či výstupní bránu, stačilo by ji namapovat na jedinou adresu, ale museli bychom kombinační logikou zpracovat všech 16 adresových vodičů. Proto se často smíříme se zrcadlením brány na mnoha adresách a zjednodušíme si tím dekodér. Příklad namapování bran na určité adresy je v přednáškách, MAM9.pdf strany 3 a 4. Mapování pamětí je popsáno v první polovině MAM7.pdf. Detailně jsou zápis a čtení RAM vysvětleny v MAM5.pdf okolo strany 10. Rozdíl mezi zde popisovaným rychlým připojením RAM pomocí sběrnic a prostým připojením všech signálů na brány procesoru (s pomalelším čistě softwarovým řízením všech signálů RAM) je vysvětlen v MAM3.pdf, str. 9. Všechna zmíněná pdf najdete v systému Moodle (pozor, čísla pdf neodpovídají zcela přesně týdnům).

[editovat] Příklad ovládání 1MB RAM z C

Tato paměť je mnohem větší, než je dostupný adresový prostor. Přistupujeme k ní tedy po částech velkých 32KB, které jsou střídavě viditelné v horní polovině 64K adresového rozsahu AVR. Zbylé bity adresy dodáme na nejnižších bitech portu B:

#include <avr/io.h>

void zapis( unsigned long int adresa, unsigned char data ){
  PORTB = adresa >> 15;
  * (unsigned char *)( adresa & 0x7fff | 0x8000) = data;
}

void main( void ){
  unsigned char d;
  //d = cteni( 254697 );
  zapis( 100000, 31 );
}

Operace ">> 15" odstraní spodních 15 bitů adresy a ponechá horních 5. Operace "& 0x7fff" naopak ponechá jen spodních 15 bitů a "| 0x8000" vždy nastaví nejvyšší bit pro XMEM na 1, abychom adresovali v horní polovině 64K rozsahu.

Překlad z C (verzí 4.3.3 WinAVR 20100110) je mimořádně neefektivní:

avr-gcc -mmcu=atmega128 -O3 -S extram.c
zapis:
	push r16
	push r17
	movw r26,r24
	movw r24,r22
	movw r16,r24
	movw r18,r26
	ldi r21,15
loop:	lsr r19
	ror r18
	ror r17
	ror r16
	dec r21
	brne loop
	out 56-32,r16
	andi r26,hlo8(65535)
	andi r27,hhi8(65535)
	ori r25,hi8(32768)
	movw r30,r24
	st Z,r20
	pop r17
	pop r16
	ret
Osobní nástroje