PIC18F46K22でPWMによりLEDの明るさを調整する(アセンブラ)

icon 項目のみ表示/展開表示の切り替え

概要

PIC18F46K22 のTimer2でCCP3を用いLEDの明るさを1024段階に調整する。
回路はPIC18F46K22でLEDを点滅(アセンブラ)のとおりである。
PWMの設定方法は、PIC18 PWMの設定例を参照されたい。

プログラムの説明

メインプログラムでCCP3とタイマー2を関連付けてPRレジスタに周期を設定してからタイマー設定(OpenTimer2)を行う。
デューティ比はSetDCPWM3サブルーチンで設定する。 デューティ比0~100%まで1024分の1の分解能で6.25m秒ごとに明るさを連続的に変化させる。
CCP3でPWMを用いているため、IOで直接LowやHiを設定せずにデューティ比を調整できる。

タイマー設定値

FOSC/4=16MHz
プリスケーラ 1:4
PR2 255
周期 16MHz/4/(1+256)=15.625KHz

ソースファイル

以下のファイルで構成されている
pwm0a.asm ・・・ メインプログラムと割り込み処理プログラム

ソースファイルのダウンロード pwm0a.zip


; timer2+CCP3(PWM)よるLEDの明るさ変更サンプル 2014/02/19 21:30
; 慈渓博瑞テクノロジー株式会社 PIC18F46K22 マイコンキット Ver2013.12.08用
;   http://akizukidenshi.com/catalog/g/gK-07231/
;   水晶は16MHzに交換してPICを64MHzで駆動
; MPLAB X IDE v1.85 Microchip MPASM(v5.51)
; PicKit 3

        #INCLUDE <p18f46k22.inc>
        ; 水晶発振(16MHz) クロック分周無 PLL有効(*4) プライマリクロック有効  ウォッチドッグタイマ無効 低電圧プログラム書き込みモード無効
        CONFIG FOSC = HSHP,PLLCFG=ON,PRICLKEN=ON,WDTEN=OFF,LVP=OFF

bank0       UDATA   ; 変数の定義 バンク0
Tcount2  RES     1
Tcount3  RES     1
arg16    RES     2
w16      RES     2
count16  RES     2

        CODE
        org 0
        goto   start
start
        movlb   d'15'

        clrf    CCPTMRS0,BANKED ;   Timer2をソースとする
        movlw   0ffh
        movwf   PR2,BANKED
        movlw   b'00001100'      ;   PWM
        movwf   CCP3CON,BANKED
        movlw   b'00000101'      ;   PS 1:4 Timer2 On
        movwf   T2CON,BANKED

        movlw   b'00011111'     ;   RB5をIO
        movwf   ANSELB,BANKED   ;   bank 0Fh
        movlw   b'00011111'     ;   RB5をIO
        movwf   TRISB

        clrf    count16
        clrf    count16+1
loop
        movf    count16,W
        movwf   arg16
        movf    count16+1,W
        movwf   arg16+1

        call    SetDCPWM3
        call    wait6_25ms

        movlw   1
        addwf   count16
        movlw   0
        addwfc  count16+1,F

        goto    loop

;        arg16

SetDCPWM3
        movf    CCP3CON,W,BANKED
        andlw   b'11001111'
        movwf   CCP3CON,BANKED
        movf    arg16,W
        andlw   b'00000011'
        swapf   WREG
        iorwf   CCP3CON,BANKED
        bcf     STATUS,C
        rrcf    arg16+1
        rrcf    arg16
        bcf     STATUS,C
        rrcf    arg16+1
        rrcf    arg16
        movf    arg16,W
        movwf   CCPR3L,BANKED
        return


wait6_25ms
        movlw   d'130'  ; 48μs*130=6.25ms
        movwf   Tcount2
dloop2                   ; t=(12+12*count3)/64MHz 48μs
        movlw   d'0'
        movwf   Tcount3
        nop
dloop3
        decfsz  Tcount3
        goto    dloop3
        decfsz  Tcount2
        goto    dloop2
        return

        END