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
; 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
; 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
; 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
; 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
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