2014年3月24日 星期一

老MCU

PIC16F72好老的單片機不過比PIC16F5X好一些啦,多了ADC TIMER0 TIMER1 TIMER2中斷等,

       2K x 14字的程序存儲器,
      128×8個字節的數據存儲器(RAM)
       八級深硬件堆棧<< 堆疊只有8層
麻煩的是使用數據存儲要先切到正確的銀行,光看到這規格是不是就打退堂鼓了呢?
因為手上剛好有這芯片就順手測試一下,就當作是筆記下面練習程式啟動計時1中斷,
(這顆的中斷位置是所有中斷一起共用的,所以進到中斷副程式時要先檢查是哪一個中斷裝置發生中斷)令端口_A每進一次中斷就反向輸出一次

列表P = 16F72; 列表指令來定義處理器
#包括         ; 具體的處理器變量定義

__config _CP_OFF​​&_WDT_OFF&_BODEN_OFF&_PWRTE_ON&_XT_OSC

; “__config'指令用於內。asm文件中嵌入的配置數據。
; 下列指令的標籤都位於各自的。增量文件。
; 請參閱相關的數據表上的配置字的更多信息。

; *****變量定義(舉例)

W_TEMP EQU 32H
STATUS_TEMP EQU 31H
FLAG_A EQU 30H

; ****************** *********************
        ORG量0x000; 處理器復位向量
                轉到開始; 進入程序開始


INT_VECTOR:
        ORG量0x004; 中斷向量地址
MOVWF W_TEMP; 節省了電流W寄存器的內容;
MOVF 狀態,W; 移動狀態寄存器為W寄存器
BCF STATUS,RP0; 確保文件寄存器組設置為0
MOVWF STATUS_TEMP; 節省OFF狀態寄存器的內容


; ISR代碼可以去這裡或位於其他位置的子程序調用
               BANKSEL PIR1; TMR1IF
               BTFSS PIR1,0
               GOTO VECTOR_QUIT
               BCF PIR1,0; CLR TMR1IF
               COMF FLAG_A,0;取FLAG_A的補數
               MOVWF FLAG_A
               MOVLW B'11110000'; RELOAD TMR1H TMR1L
               MOVWF TMR1L
               MOVLW B'00000000'
               MOVWF TMR1H

VECTOR_QUIT:
      BCF STATUS,RP0; 確保文件寄存器組設置為0
      MOVF STATUS_TEMP,W; 找回狀態寄存器副本
      MOVWF 狀態; 恢復預ISR狀態寄存器的內容
      SWAPF W_TEMP,F
      SWAPF W_TEMP,W; 恢復預ISR W寄存器的內容
      RETFIE; 從中斷返回
開始:
        BANKSEL ADCON1; 16F72復位>> PORTA均設定為ADC
        MOVLW B'00000111'; PORTA至數字IO
        MOVWF ADCON1
        BANKSEL TRISA
        MOVLW B'00000000'
        MOVWF TRISA
        MOVWF TRISB
        MOVWF TRISC
        BANKSEL PORTA

        MOVLW 80H
        MOVWF PORTC
        MOVLW 0
        MOVWF 33H

    ; T1CON = 0B00110101;
        BANKSEL T1CON
        MOVLW B'00110101'
        MOVWF T1CON

 
    ; TIMER1為16BIT上數計數器
        MOVLW B'11110000'
        MOVWF TMR1L; 0X00F0
        MOVLW B'00000000'
        MOVWF TMR1H

   ; TMR1IE = 1; / /外設中斷使能
        BANKSEL PIE1
        MOVLW B'00000001'
        MOVWF PIE1

    ; PEIE = 1 ;/ /使能計時器1中斷
    ; GIE =​​ 1; / /全域中斷使能
        BANKSEL INTCON
        MOVLW B'11000000';
        MOVWF INTCON

LOOP:

         BTFSC FLAG_A,0
         GOTO OFF_LED
         MOVLW B'00000000';
         MOVWF PORTA
         GOTO LOOP
OFF_LED:
         MOVLW B'11111111';
         MOVWF PORTA
         GOTO LOOP

         完

沒有留言:

張貼留言