Úvod do programování

Z MAM wiki

Přejít na: navigace, hledání

Obsah

[editovat] ASSEMBLER

Instrukce LDI, ANDI, CBR, SBR, SUBI, SBCI atd. lze použít pouze pro registry R16-R31. Registry R26:R27, R28:R29, R30:R31 jsou 16b registry, které lze pojmenovat jako X, Y, Z.

Ukazetel: - hodnota v registru ukazuje na adresu jiného registru - vhodné pro použítí adresování SRAM

[editovat] SRAM

- začíná na adrese 0x0060

- CPU nmá k této paměti přímý přístup, přístup k této paměti je pomalejší, jelikož k mezipřístupu jsou použity registry s přímým přístupem (R0-R31)

- externě připojená RAM se chová jako SRAM

- nejdůležitější funkcí SRAM je možnost vytvoření zásobníku (LIFO paměť)

- díky ukazatelům lze vytvořit "plovoucí" přístup k paměti SRAM (RAM), offset - relativní adresování (tvorba tabulek)

- přístup - ukazatelé, nebo pomocí instrukcí LD, ST

Příklad:

LDI XH, HIGH (0x0060)
LDI XL, LOW (0x0060)	;vytvoření ukazatele X
LD R0, X	;hodnotu z adresy 0x0060 přenese do R0
LDD R0, X+	;hodnotu z adresy 0x0061 přenese do R0
LDD R0, X+5	;hodnotu z adresy 0x0065 přenese do R0
; X zůstává stále stejné tedy i pro provedení X+ je při další instrukci X=0x0060
; obdobně i pro ST a STD

[editovat] SRAM jako zásobník

- použití tehdy jsou-li všechny registry použité a tehdy, když budeme hodnoty po pár instrkcích opět potřebovat

- ukazatele zásobníku SPH:SPL - spadají do kategorie I/O portů => instrukce OUT a IN

Př. Konstrukce zásobníku

LDI R16, HIGH (RAMEND)	;RAMEND - je pojmenování nejvyšší přístupné paměti tzn. nejvyšší adresa SRAM nebo v RAM
OUT SPH, R16
LDI R16, LOW (RAMEND)
OUT SPL, R16		; nyní máme vytvořený zásobník (FIFO)

Použití:
PUSH R16	;uloží hodnotu R0 do zásobníku
...
POP R16	;obdržím poslední uloženou hodnotu 

[editovat] I/O porty

- stavové registry, řídící registry (čítače, přerušení atd.)

- I/O brány, SPI, EEPROM

- instrukce - IN, OUT

[editovat] Ukázka krátkého programu

.INCLUDE "m16def.inc"	;načte informace o procesoru, (nazvy registru, jejich bitu, bran atd.)
	.DEF Temp=R16		;definice jména registru
	.DEF Loop=R17
	.EQU Konst=0b00001111	;definice konstanty (binarni zapis)
	.EQU Konst2=0xAF	;definice konstanty (hexa zapis)

	.CSEG		;informace pro překladač, ulož do programové paměti procesoru
(	.ESEG	- zápis do SRAM
	.DSEG - zápis do SRAM	)
	
	.ORG $0000	;počáteční hodnota Program Counteru (další možnost hexa zápisu)	

	RJMP Start
	RJMP INT0	;návěstí kde proběhně obsluha přerušení, návrat je z podpogramu je pomocí instrukce RETI nebo RETE, kde RETE = RETI +SEI (povolení všech přerušení) => při zahájení obsluhy přerušení jsou ostatní přerušení zakázána, lze je opět povolit pomocí SEI
	....	;další vektory přerušení viz datasheet k procesoru

Start:	LDI Temp,0b00000011
	OUT DDRB, Temp	;PORTB 0 a 1 budou výstupní ostatní vstupní
	SBI PORTB,0	;nastaven bit na brane PORTB0
	RCALL Delay	;skok do podprogramu

	CPI Temp,Konst		;porovná oba registry Temp-Konst
	BREQ Rovnost		;skočí pokud Temp-Konst=0, jinak jden na istrukci RJMP Start
		

	RJMP Start	;skočí na Start a opět opakuje celou smyčku


Rovnost:CPI PORTB,1
	RET


Delay:	LDI Loop,24	;24*256*256=1ms, doba 1 taktu=1/f
Wait:	INC R1
	BRNE Wait	;je-li výsledek předchozí operace 0 bude nastaven bit Z stavového registru na 1 a nebude proveden skok na Wait, ale vykoná se INC R2
	INC R2
	BRNE Wait
	DEC Loop
	BRNE Wait
	RET		;návrat z podpogramu (vrátí se na stejné místo odkud bylo voláno +1)

Horakma6 17. 6. 2010, 13:28 (UTC)

Osobní nástroje