První pokus v simulátoru AVR

Z MAM wiki

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

Pro první pokus určitě použijte simulátor zabudovaný v programu AVR Studio. Jste-li ve škole v laboratoři 362, je software již připraven. Jinak si AVR Studio nejprve nainstalujte.

V AVR Studiu založte nový projekt, napište pár instrukcí v assembleru dle instrukčního souboru a program přeložte a zkuste krokovat. Vše je velmi obrázkové a názorné, takže asi pochopíte, jak se podívat do registrů a ověřit, že instrukce dělají to, co jste čekali.

Jako první úkol zkusíme ovládnout LED připojenou k procesoru. Pro nízkopříkonové LED stačí přímo proud dodávaný výstupem procesoru, LED zapojíme podle jednoho z následujících schémat. Trochu lépe spíná výstup k zemi, pro větší proudy nebo při malém napájecím napětí bychom tedy měli preferovat zapojení s LED připojenou k +5 V a spínanou log. L na výstupu. Nezapomeneme nastavit správnou hodnotu sériového rezistoru R1 = (napájecí napětí - úbytek na diodě a na sepnutém výstupu)/požadovaný proud. Pokud potřebujeme vstup z kontaktu, zapojíme ho podle vzoru u vstupu PD5, rezistor R2 nastavuje na vstupu PD5 úroveň H při rozpojeném spínači.

Zajímavé je připojit dvoubarevnou LED, která ma v jednom pouzdře dvě antiparalelně zapojené různobarevné diody. Jak to uděláme je vidět z následujícího schématu, diodu zapojíme mezi dva výstupy a tím řídíme přítomnost a polaritu napětí na diodách. Sériový odpor volíme jako kompromis vzhledem k různým úbytkům na různobarevných LED. Současně je ve schématu zjednodušeno zapojení spínače na vstupu, vnější rezistor je nahrazen vnitřním pull-up rezistorem v AVR (naznačen čárkovaně), který lze aktivovat vhodnou konfigurací vstupu.

K nastavení módu činnosti jednotlivých bitů I/O portu a pro zápis nebo čtení dat slouží trojice registrů DDRx, PORTx a PINx. DDRx určuje směr, PORT nastavuje výstupní data nebo pull-up rezistor a PINx obsahuje data data přečtená ze vstupu podle tabulky


DDRx PORTx I/O pull-up funkce vývodu PINx
0 0 IN ne vstup bez pull-up rezistoru log. úroveň na vývodu
0 1 IN ano vstup s pull-up rezistorem (PORT=1 zde znamená "měkkou H") log. úroveň na vývodu
1 0 OUT ne výstup ve stavu L log. úroveň na vývodu
1 1 OUT ne výstup ve stavu H log. úroveň na vývodu


Pro úplnost, pull-up rezistory lze globálně zakázat dalším konfiguračním bitem (PUD bit v MCUCR).


Můžete použít třeba tento program:


; 
; example LED-show program for ATtiny 2313
;
; 2-color LED with 300 Ohm resistor in series is supposed to be
; connected between pins 12 (PB0, LED_X) and 13 (PB1, LED_Y).
;
; Color1 shines when LED_X is high and LED_Y is low
; Color2 shines when LED_Y is high and LED_X is low
; LED is off when LED_Y and LED_X are both low or both high


	.EQU DDRB = $17		; DDRB address
	.EQU PORTB = $18	; PORTB address

	.EQU LED_X = 0		; LED_X is on PB0, pin 12 of ATtiny2313
	.EQU LED_Y = 1		; LED_Y is on PB1, pin 13 of ATtiny2313

; Pins connected to LED are outputs, DDRx=1 (set):

	SBI	DDRB, LED_X	; SBI - Set Bit in I/O Register
	SBI	DDRB, LED_Y

SHOW:	
	RCALL	COLOR1	; RCALL - Relative Call to Subroutine
	RCALL	WAIT
	
	RCALL	DARK
	RCALL	WAIT
	
	RCALL	COLOR1
	RCALL	WAIT
	
	RCALL	DARK
	RCALL	WAIT
	
	RCALL	COLOR2
	RCALL	WAIT

	RCALL	DARK
	RCALL	WAIT
	
	RCALL	COLOR2
	RCALL	WAIT

	RCALL	DARK
	RCALL	WAIT

	RCALL	COL3W
	
	RCALL	DARK
	RCALL	WAIT

	RCALL	COL3W
	
	RCALL	DARK
	RCALL	WAIT
	
	RJMP SHOW		; RJMP - Relative Jump 

;;;
;;;
;;; P R O C E D U R E S
;;;
;;;
	
SMALLWAIT:
	INC	R1				; INC - Increment
	BRNE	SMALLWAIT	; BRNE - Branch if Not Equal (Z flag) 
	RET					; RET - Return from Subroutine

WAIT:
	LDI	R16, 4			; LDI - Load Immediate
WAIT1:	INC	R1
	BRNE	WAIT1
	INC	R2
	BRNE	WAIT1
	DEC	R16
	BRNE	WAIT1
	RET
	
COLOR1:
    SBI	PORTB, LED_X
	CBI	PORTB, LED_Y	; CBI - Clear Bit in I/O Register
	RET

COLOR2:
    SBI	PORTB, LED_Y
	CBI	PORTB, LED_X
	RET

COL3W:
	LDI	R16, 2
COL3X: 	RCALL	COLOR1
	RCALL	SMALLWAIT
	RCALL	COLOR2
	RCALL	SMALLWAIT
	INC	R2
	BRNE	COL3X
	DEC	R16
	BRNE	COL3X

DARK:
    CBI	PORTB, LED_X
	CBI	PORTB, LED_Y
	RET


Totéž pro trochu větší procesor ATmega88/168 s odlišnými adresami portů, který budeme též často používat:



; 
; example LED-show program for ATmega168
;
; 2-color LED with 300 Ohm resistor in series is supposed to be
; connected between pins 15 (PB1, LED_X) and 16 (PB2, LED_Y).
;
; Color1 shines when LED_X is high and LED_Y is low
; Color2 shines when LED_Y is high and LED_X is low

	.EQU DDRB = $04
	.EQU PORTB = $05

	.EQU LED_X = 1
	.EQU LED_Y = 2

; Pins connected to LED are outputs:

	SBI	DDRB, LED_X
	SBI	DDRB, LED_Y

SHOW:	
	RCALL	COLOR1
	RCALL	WAIT
	
	RCALL	DARK
	RCALL	WAIT
	
	RCALL	COLOR1
	RCALL	WAIT
	
	RCALL	DARK
	RCALL	WAIT
	
	RCALL	COLOR2
	RCALL	WAIT

	RCALL	DARK
	RCALL	WAIT
	
	RCALL	COLOR2
	RCALL	WAIT

	RCALL	DARK
	RCALL	WAIT

	RCALL	COL3W
	
	RCALL	DARK
	RCALL	WAIT

	RCALL	COL3W
	
	RCALL	DARK
	RCALL	WAIT
	
	RJMP SHOW
;;;
;;;
;;; P R O C E D U R E S
;;;
;;;
	
SMALLWAIT:
	INC	R1
	BRNE	SMALLWAIT
	RET

WAIT:
	LDI	R16, 4
WAIT1:	INC	R1
	BRNE	WAIT1
	INC	R2
	BRNE	WAIT1
	DEC	R16
	BRNE	WAIT1
	RET
	
COLOR1:
       	SBI	PORTB, LED_X
	CBI	PORTB, LED_Y
	RET

COLOR2:
       	SBI	PORTB, LED_Y
	CBI	PORTB, LED_X
	RET

COL3W:
	LDI	R16, 2
COL3X: 	RCALL	COLOR1
	RCALL	SMALLWAIT
	RCALL	COLOR2
	RCALL	SMALLWAIT
	INC	R2
	BRNE	COL3X
	DEC	R16
	BRNE	COL3X

DARK:
       	CBI	PORTB, LED_X
	CBI	PORTB, LED_Y
	RET

Vývody ATmega168, ke kterým by LED s odporem v séri šla připojit:

... ... ... ... ... ... ... ... ... PB2 PB1
)
RESET ... ... ... ... ... ... ... ... ... ... ... ...
Osobní nástroje