Assembler (optional)



Okrem programovania v jazyku C je možnosť písať programy pre mikrokontrolér aj v assembleri. Prínos použitia assembleru (okrem kratšieho a rýchlejšieho kódu) vidíme najmä v možnosti (a nutnosti) hlbšieho spoznania stavby mikrokontroléra a jeho činnosti.

V ďalšom texte uvádzame spôsoby realizácie niektorých činností uC Atmega32. Časti kódu boli napísané a overené vo vývojovom prostredí AVR Studio 4.19 (html kód je generovaný pomocou http://tohtml.com/asm/:

; Praca s registrami GPR (General Purpose Registers) R0...R31
; a SFR (Special Function Registers)

.include "m32def.inc"
; nazvy jednotlivych bitov SFR a GPR pozri v .inc subore (Included Files)

; v texte su vzorove gegistre R16, R0, PORTC
; register R17 je docasny pomocny register

NASTAVENIE (SET) na 1

; nastav byte (register) ako celok na pozadovanu hodnotu	
	
	; GPR R16-R31
	ldi R16, 0x0F

	; GPR R0-R15
	ldi R16, 0x0F
	mov R0, R16

	; SFR
	ldi R16, 1<<PC1 | 1<<PC0
	out PORTC, R16

; nastav uplne cely byte (register) - vsetky bity (bit7...bit0) na 1

	; GPR R16-R31
	ser R16
		; alebo
		ldi R16, 0xFF;

	; GPR R0-R15
	ser R16
	mov R0, R16
		; alebo
		ldi R16, 0xFF;
		mov R0, R16

	; SFR
	ser R16
	out PORTC, R16
		; alebo
		ldi R16, 0xFF;
		out PORTC, R16

; nastav jeden bit (ostatne bity bez zmeny)
	
	; GPR R16-R31
	ori R16, 1<<PC7
		; alebo
		sbr R16, 1<<PC7

	; GPR R0-R15
	ldi R16, 1<<PC7
	or R0, R16
		; alebo
		mov R16, R0
		sbr R16, 1<<PC7
		mov R0, R16

	; SFR
	in R16, PINC
	ori R16, 1<<PC7
	out PORTC, R16
		; alebo
		in R16, PINC
		sbr R16, 1<<PC7
		out PORTC, R16
			; alebo
			sbi PORTC, PC7

; nastav niekolko bitov (ostatne bity bez zmeny)

	; GPR R16-R31
	ori R16, 1<<PC6 | 1<<PC5 | 1<<PC4 
		; alebo
		sbr R16, 1<<PC6 | 1<<PC5 | 1<<PC4

	; GPR R0-R15
	ldi R16, 1<<PC6 | 1<<PC5 | 1<<PC4
	or R0, R16
		; alebo
		mov R16, R0
		sbr R16, 1<<PC6 | 1<<PC5 | 1<<PC4
		mov R0, R16

	; SFR
	in R16, PINC
	ori R16, 1<<PC6 | 1<<PC5 | 1<<PC4
	out PORTC, R16
		; alebo
		in R16, PINC
		sbr R16, 1<<PC6 | 1<<PC5 | 1<<PC4
		out PORTC, R16
			; alebo
			sbi PORTC, PC6
			sbi PORTC, PC5
			sbi PORTC, PC4

VYNULOVANIE (CLEAR) na 0

; vynuluj uplne cely byte (register) - vsetky bity (bit7...bit0) na 0

	; GPR R16-R31
	clr R16
		; alebo
		ldi R16, 0x00
			; alebo
			eor R16, R16

	; GPR R0-R15
	clr R0
		; alebo
		ldi R16, 0x00
		mov R0, R16
			; alebo
			eor R0, R0

	; SFR
	clr R16
	out PORTC, R16
		; alebo
		ldi R16, 0x00
		out PORTC, R16

; vynuluj jeden bit (ostatne bity bez zmeny)

	; GPR R16-R31
	andi R16, ~(1<<PC7)
		; alebo
		cbr R16, 1<<PC7

	; GPR R0-R15
	ldi R16,  ~(1<<PC7)
	and R0, R16
		; alebo
		mov R16, R0
		cbr R16, 1<<PC7
		mov R0, R16

	; SFR
	in R16, PINC
	andi R16, ~(1<<PC7)
	out PORTC, R16
		; alebo
		in R16, PINC
		cbr R16, 1<<PC7
		out PORTC, R16
			; alebo
			cbi PORTC, PC7

; vynuluj niekolko bitov (ostatne bity bez zmeny)

	; GPR R16-R31
	andi R16, ~(1<<PC6 | 1<<PC5 | 1<<PC4)
		; alebo
		cbr R16, 1<<PC6 | 1<<PC5 | 1<<PC4

	; GPR R0-R15
	ldi R16,  ~(1<<PC6 | 1<<PC5 | 1<<PC4)
	and R0, R16
		; alebo
		mov R16, R0
		cbr R16, 1<<PC6 | 1<<PC5 | 1<<PC4
		mov R0, R16

	; SFR
	in R16, PINC
	andi R16, ~(1<<PC6 | 1<<PC5 | 1<<PC4)
	out PORTC, R16
		; alebo
		in R16, PINC
		cbr R16, 1<<PC6 | 1<<PC5 | 1<<PC4
		out PORTC, R16
			; alebo
			cbi PORTC, PC6
			cbi PORTC, PC5
			cbi PORTC, PC4

DOPLNOK (COMPLEMENT) z 0 na 1 a naopak z 1 na 0

; vymen uplne cely byte (register) - vsetky bity (bit7...bit0) z 0 na 1 a naopak

	; GPR R16-R31
	com R16

	; GPR R0-R15
	com R0

	; SFR
	in R16, PINC
	com R16
	out PORTC, R16

; vymen jeden bit (ostatne bity bez zmeny)

	; GPR R16-R31
	ldi R17, 1<<PC7
	eor R16, R17

	; GPR R0-R15
	ldi R17, 1<<PC7
	eor R0, R17

	; SFR
	in R16, PINC
	ldi R17, 1<PC7
	eor R16, R17
	out PORTC, R16

; vymen niekolko bitov (ostatne bity bez zmeny)

	; GPR R16-R31
	ldi R17, 1<<PC6 | 1<<PC5 | 1<<PC4
	eor R16, R17

	; GPR R0-R15
	ldi R17, 1<<PC6 | 1<<PC5 | 1<<PC4
	eor R0, R17

	; SFR
	in R16, PINC
	ldi R17, 1<<PC6 | 1<<PC5 | 1<<PC4
	eor R16, R17
	out PORTC, R16

TESTOVANIE ci je/su bit/bity nastavene (SET) na 1

; testuj jeden bit samostatne ci je nastaveny na 1

IF:	; podmienka pre GPR R0-R31 a SFR
	mov R17, R16 ; in R17, PINC pre SFR
	clz
	andi R17, 1<<PC6 ; ak je bit PC6 v R16 nastaveny, flag Z je vynulovany
	breq ELSE
	; kod pre TRUE (nastaveny bit)
	nop
	rjmp ENDIF
ELSE:		
	; kod pre FALSE (nenastaveny bit)
	nop
ENDIF:
	; kod za if
	nop


IF: ; alebo 
	sbrs R16, PC6 ; sbis PINC, PC6 pre SFR
	rjmp ELSE
	; kod pre TRUE (nastaveny bit)
	nop
	rjmp ENDIF	
ELSE:
	; kod pre FALSE (nenastaveny bit)
	nop
ENDIF:
	; kod za if
	nop


UNTIL: ; cakaj pokial nie je nastaveny bit
	sbrs R16, PC6 ; sbis PINC, PC6 pre SFR
	rjmp UNTIL
	; kod za until (az ked je uz bit nastaveny)
	nop


WHILE: ; opakuj pokial je nastaveny bit
	sbrs R16, PC6 ; sbis PINC, PC6 pre SFR
	rjmp ENDWHILE
	; kod pre opakovanie pokial je nastaveny bit
	nop
	rjmp WHILE
ENDWHILE:
	; kod za while (az ked uz nie je bit nastaveny)
	nop


FOR: ; cyklus s presnym poctom opakovani
	ldi R16, 15
CYKLUS:
	; kod pre opakovanie v cykle for
	nop
	dec R16
	brne CYKLUS
	; kod za for
	nop 


; testuj jeden z viacerych bitov ci je nastaveny na 1

IF:	; podmienka pre GPR R0-R31 a SFR
	mov R17, R16 ; in R17, PINC pre SFR
	clz
	andi R17, 1<<PC6 | 1<<PC5 | 1<<PC4 ; ak je aspon jeden z bitov nastaveny, nenastavi sa flag Z
	breq ELSE
	; kod pre TRUE (nastaveny bit)
	nop
	rjmp ENDIF
ELSE:		
	; kod pre FALSE (nenastaveny bit)
	nop
ENDIF:
	; kod za if
	nop


; testuj vsetky viacere bity ci su nastavene na 1

IF:	; podmienka pre GPR R0-R31 a SFR
	mov R17, R16 ; in R17, PINC pre SFR
	andi R17, 1<<PC6 | 1<<PC5 | 1<<PC4;
	clz
	cpi R17, 1<<PC6 | 1<<PC5 | 1<<PC4 ; ak su vsetky bity nastavene, nastavi sa flag Z
	brne ELSE
	; kod pre TRUE (nastavene vsetky bity)
	nop
	rjmp ENDIF
ELSE:		
	; kod pre FALSE (nenastavene vsetky bity)
	nop
ENDIF:
	; kod za if
	nop



Archív programov

Súbory .asm (zdrojové kódy programov v assembleri) možno otvoriť nielen vo vývojovom prostredí AVR Studia, ale aj v textovom editore. Odporúčame textový editor PSPad.

PaedDr. Karol Pauchly, ZŠ s MŠ Chlebnice, október 2014