一、實驗介紹
因為這系列教學文主要是自己作為實驗筆記,所以理論的部分就不會太多說明,大家可以自己看書
(參考[Chai's AVR 學習筆記] 01)、看datasheet等
其實搞懂常用的AVR Assembly指令,還有register的操作,就可以開始實驗了
二、硬體連接
首先是這個開發板將AVR晶片的PORT重新排了一下
轉接上去後,左右PORT排列好,晶振的腳位(XTAL1、XTAL2)接到開發板的12.0Mhz上,然後Analog Reference為5V,JTAG的腳位也引出來,供debug或燒錄使用。
三、開發板LED模塊
我們使用JP1 插座上的8顆LED 接到PORTB 上面 (PB0~PB7)
由於LED為共陰極,因此AVR的pin為OUTPUT模式下,輸出0則sink電流進去,LED燈亮,輸出1(5V)則和Vcc電位同,LED燈暗
*AVR 控制IO 概念說明
ATmega 16 共有4個PORT,每個PORT 8個Pin
每個PORT由3個8-Bits Register控制
如 PORTB
Register
|
功能
|
Set(=1)
|
Clear(=0)
|
DDRB
|
Data Direction
Register
控制為Input 或 Output
|
輸出模式
|
輸入模式
|
PORTB
|
Output下輸出的值
|
輸出High
|
輸出Low
|
PINB
|
Input下讀取的值
|
讀到High
|
讀到Low
|
接下來會有範例示範如何存取這些register
/*
* LED1.asm
*
* Created: 2015/2/11 10:35:12
* Author: Stanley Chai
*/
.include "m16def.inc"
//Initial Stack for subroutine
ldi r16,HIGH(RAMEND)
out SPH,r16
ldi r16,LOW(RAMEND)
out SPL,r16
ldi r16,0xff
out DDRB,r16
START:
ldi r16,0b01010101
out PORTB,r16
call Delay_500ms
ldi r16,0b10101010
out PORTB,r16
rcall Delay_500ms
rjmp START
Delay_500ms:
//for crystal oscillator freq=12Mhz 1 clock=0.083us =>need 6*10^6 clock cycle
// 6*10^6=255*245*96
ldi r17,255
LOOP0: ldi r18,161
LOOP1: ldi r19,48
LOOP2: dec r19 //1
brne LOOP2 //2 / 1
//143
dec r18 //1
brne LOOP1 //2 / 1
//23505
dec r17 //1
brne LOOP0 //2 / 1
//5994539
ret //4
//brne 成立(Z!=0)時為2 clk cycle, Z=0時為1 clk cycle