2015年2月12日 星期四

[Chai's AVR 學習筆記] 02 LED基本控制

一、實驗介紹

因為這系列教學文主要是自己作為實驗筆記,所以理論的部分就不會太多說明,大家可以自己看書
(參考[Chai's AVR 學習筆記] 01)、看datasheet

其實搞懂常用的AVR Assembly指令,還有register的操作,就可以開始實驗了


二、硬體連接
首先是這個開發板將AVR晶片的PORT重新排了一下

原本(From Datasheet):



















(轉接板)



















轉接上去後,左右PORT排列好,晶振的腳位(XTAL1XTAL2)接到開發板的12.0Mhz上,然後Analog Reference5VJTAG的腳位也引出來,供debug或燒錄使用。



三、開發板LED模塊

















我們使用JP1 插座上的8LED 接到PORTB 上面 (PB0~PB7)

由於LED為共陰極,因此AVRpinOUTPUT模式下,輸出0sink電流進去,LED燈亮,輸出1(5V)則和Vcc電位同,LED燈暗

*AVR 控制IO 概念說明
ATmega 16 共有4PORT,每個PORT 8Pin
每個PORT38-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

沒有留言:

張貼留言