RC2とRE2に接続されたLEDを0.5秒置きに交互に点灯するアセンブラプログラム

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

概要

PIC18F46K22のIOポートRC2,RE2に接続されたLEDを約0.5秒おきに点滅させる。 今回は赤と青の2色LED OSRB5131Aを使用しました。
0出力時に消灯、1出力時に点灯となっている。
秋月電子 PIC18F46K22使用 マイコンボードをベースとし半田付けされている水晶20MHzをH8/3048ボードの16MHzと交換し64MHzで動作可能としたものにLEDを接続した。このボードはICSP端子を備えておりPICKIT 3で書き込みができ、電源はミニUSBで供給可能である。またユニバーサル基板になっているので簡単に回路を追加することができる。
約0.5秒の時間はソフトウェアによるディレイ(クロック周波数に依存)で対応。ちなみに水晶が20MHzの場合は、点滅が遅くなるだけである。
ディレイを設けるためにメモリ上にカウンターをアクセスバンク内に設けている。
使用メモリは以下のサイズです。
プログラムサイズ 79byte
アクセスバンク 3byte使用
回路は次のとおりである。
cir.svg
回路図(PDF)

プログラムの説明

ソースファイル

以下のファイルで構成されている
lde4a.asm ・・・ メインプログラム

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

; 動作確認済み 2017/01/05 22:17
; RC2とRE2に接続されたLEDを0.5秒置きに交互に点灯するアセンブラプログラム 2017/01/05
; 慈渓博瑞テクノロジー株式会社 PIC18F46K22 マイコンキット Ver2013.12.08用
;   http://akizukidenshi.com/catalog/g/gK-07231/
;   水晶は16MHzに交換してPICを64MHzで駆動
; MPLAB X IDE v3.45 Microchip MPASM(v5.70)
; PicKit 3
; RC2/CCP1 Blue LED
; RE2/CCP5 Red  LED
        
        #INCLUDE <p18f46k22.inc>
        ; 水晶発振(16MHz) クロック分周無 PLL有効(*4) プライマリクロック有効  ウォッチドッグタイマ無効 低電圧プログラム書き込みモード無効
        CONFIG FOSC = HSHP,PLLCFG=ON,PRICLKEN=ON,WDTEN=OFF,LVP=OFF

bank0       UDATA_ACS   ; 変数の定義 アクセスバンク
Tcount1  RES     1
Tcount2  RES     1
Tcount3  RES     1

        CODE
        org 0
        goto   start

start
        BANKSEL ANSELC

        movlw   b'11111000'     ;   RC2をIO
        movwf   ANSELC,BANKED   ;   bank 0Fh
        movlw   b'11111011'     ;   RC2をOUT
        movwf   TRISC
        movlw   b'00000100'     ;   RC2=onを出力
        movwf   PORTC

        movlw   b'00000011'     ;   RE2をIO
        movwf   ANSELE,BANKED   ;   bank 0Fh
        movlw   b'00000011'     ;   RE2をIO
        movwf   TRISE
        movlw   b'00000000'     ;   RE2=offを出力
        movwf   PORTE
loop
        call    wait500

        movlw   b'00000100'
        xorwf   PORTC   ; RC2を反転させる
        xorwf   PORTE   ; RE2を反転させる
        goto    loop

wait500                 ; 0.5秒Wait
        movlw   d'50'  ; 9.98ms*50=0.5s
        movwf   Tcount1
dloop1
        movlw   d'208'  ; 48μs*208=9.98ms
        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
        decfsz  Tcount1
        goto    dloop1
        return

        END