První pokus v simulátoru AVR
Z MAM wiki
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 nebo okopírujte vzorový program 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 mikrokontroleru. Pro nízkopříkonové LED stačí přímo proud dodávaný výstupem procesoru, LED jde zapojit 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, tak je LED zapojena i na naší vývojové destičce. Nesmíme zapomenout 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, ve skutečnosti ho nezapojujeme jako vnější součástku, ale aktivujeme vnitřní pull-up rezistor. Na vývojové destičce k tomu použijeme tlačítka S1, S2, S3 levého sloupce maticové klávesnice, sloupec aktivujeme propojením kontaktů 1-3 na propojce JP1.
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 nakresleno zjednodušené 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 s měkkou log. H.
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 ve všech konfiguracích portu 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 registru MCUCR).
Pro první pokusy můžete použít třeba tento program:
; ; First ASM Programm for the Evaluation Board ; ; Example of LED blinking program for ATmega168 ; .equ DDRD = 0x0A ;DDRD address .equ PORTD = 0x0B ;PORTD address .equ LED = 6 ;bit of the output port C with LED sbi DDRD, LED Main: sbi PORTD, LED rcall Delay_06s cbi PORTD, LED rcall Delay_06s rjmp Main Delay_06s: ldi R16, 3 Delay: inc R1 brne Delay inc R2 brne Delay dec R16 brne Delay ret
Pro přehlednost by měl být program okomentován, navíc zde máme přidanou další funkci:
; ; First ASM Programm for the Evaluation Board ; ; Example of LED blinking program for ATmega168 ; ; LED cathode connected to PORT D bit 6, anode to +Ucc, ; 3 switches S1, S2, S3 connected to PORT C bit 1, 2, 3 (PC1, PC2, PC3), ; connect JP1 to GND ; ; microcomputer hardware definition ; it is necessary to say the assembler something about our HW: .equ DDRC = 0x07 ;DDRC address .equ PORTC = 0x08 ;PORTC address .equ PINC = 0x06 ;PIND address .equ DDRD = 0x0A ;DDRD address .equ PORTD = 0x0B ;PORTD address .equ PIND = 0x09 ;PIND address ;normally we use the complete definition from the definition file: ; .INCLUDE "m168def.inc" .equ LED = 6 ;bit of the output port C with LED .equ S1 = 1 ;bit of the input port D with Switch1 ; Initialization sbi DDRD, LED ;Set Bit Immediately - LED pin is output ; cbi PORTD, LED ;LED ON (LED is ON when log. 0 on this bit) - not necessary, log. 0 from AVR initialization ; cbi DDRC, S1 ;Clear Bit Imm. - not necessary, log. 0 from AVR initialization sbi PORTC, S1 ;pull-up resistor on the switch input ; ; Main program start ; ; blinking LED ; ; ; modification: ; when S1 pressed then LED continuously ON until S1 released ; (uncomment the first two lines) ; ; To do: when S2 pressed then LED continuously OFF until S2 released ; Main: sbis PINC, S1 ;skip next instruction if bit is set rjmp S1_ON ;relative jump to Switch on subroutine sbi PORTD, LED ;LED OFF rcall Delay_06s ;relative call (not very far) to Delay 0,5 s cbi PORTD, LED ;LED ON rcall Delay_06s rjmp Main ;loop to start S1_ON: cbi PORTD, LED ;LED ON rjmp Main ; Delay loop cca 0,6 s for 1 MHz AVR clock: ; ; based on incrementing/decrementing of the register until 0 ; Delay_06s: ldi R16, 3 ;prepare for 3 loops of 256x256 loops (1 Clk) Delay: inc R1 ;256 incrementing of R1 (1 Clk) brne Delay ;Branch if Not Equal - until 0, then go to R2 (1/2 Clk) inc R2 ;repeat it 256x (1 Clk) brne Delay ; (1/2 Clk) dec R16 ;and that all do 3x (1 Clk) brne Delay ; (1/2 Clk) ret ;return after 3+4+(256*256*3+256*3+3)*3-256*3-3 Clk pulses. Why?
Chceme-li připojit hodně tlačítek (a ne jen jedno či dvě), řešením je maticová klávesnice.