První pokus v simulátoru AVR

Z MAM wiki

(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
(Zapojení diody)
(1. cvičení s ATtiny2313, schémata zapojení LED a vstupního kontaktu k AVR)
Řádka 2: Řádka 2:
V AVR Studiu založte nový projekt, napište pár instrukcí v [[assembler]]u dle [[instrukční soubor AVR|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.
V AVR Studiu založte nový projekt, napište pár instrukcí v [[assembler]]u dle [[instrukční soubor AVR|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, trochu lépe spíná výstup k zemi, LED zapojíme podle jednoho z následujících schémat. 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.
 +
 +
[[Soubor:AVR-LED.png|300px]]
 +
[[Soubor:AVR-1LED.png|300px]]
 +
 +
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.
 +
 +
[[Soubor:AVR-2LED.png|340px]]
 +
 +
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
 +
 +
 +
{| class="wikitable" border="1"
 +
|-
 +
! 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:
Můžete použít třeba tento program:
<pre>
<pre>
 +
 +
;
 +
; 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
 +
</pre>
 +
 +
 +
Totéž pro trochu větší procesor ATmega88/168 s odlišnými adresami portů, který budeme též často používat:
 +
<pre>
 +
;  
;  

Verze z 16. 2. 2011, 22:10

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, trochu lépe spíná výstup k zemi, LED zapojíme podle jednoho z následujících schémat. 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