概要

LED2個を交互に0.5秒置きに点灯させてみる。RC0とRC1にLEDを接続する。
クロックはUSB-IOで接続済みの12MHzのセラミック振動子を使用する。USB-IO2(AKI)のプログラムを書き換えて使用する。プログラムを書き込むことにより購入時付属のサンプルプログラムでIO操作はできなくなるので注意。書込みはPICKit3を前提とする。

回路は次のとおりである。 回路図(PNG) 回路図(PDF) 回路図(DXF)

プログラムの説明

外部クロックの設定

USB2.0を動作させるには内部クロック48MHzが必要である。本プログラムでは0.5秒置きにLEDを点滅させるだけなので、クロックの種類は問わないので、48MHzをクロックとして使用することにする。アセンブラソースのCONFIGで指定する。

使用するLEDと電流制限抵抗

手持ちのLEDなので型番・使用は不明である。一般的な330Ωを使用した。

IOポートの設定

使用するIOポートのピンがアナログ入力と共用(ピン配置)となっているため、ANSEL、ANSELHレジスタによりピンをデジタル入出力に設定する。ピンを出力にするためTRISA、TRISB、TRISCレジスタのクリアする。

IOポートに出力する

PORTCレジスタに書き込むことにより出力することができる。LEDを点滅させるためにXORWF命令でWレジスタに1が設定せれているビットのみ反転させる。

0.5秒を得る

3段ループにより約0.5秒の時間待ちを作るプログラムをサブルーチン化している。

アセンブラソース

ソースのダウンロードled1.zip


; RC0とRC1に接続されたLEDを0.5秒置きに交互に点灯

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

Tcount1  EQU     0
Tcount2  EQU     1
Tcount3  EQU     2

        org 0
        goto   start
start
        movlw   0fh
        clrf    ANSEL   ; RC3-RC0,RA4をデジタル入力バッファに設定
        clrf    ANSELH  ; RB5-RB4,RC7-RC6をデジタル入力バッファに設定
        clrf    SLRCON  ; PORTA,PORTB,PORTCをスルーレートを標準に設定
        clrf    TRISA   ; PORTAを全部出力に設定
        movlw   0f0h
        movwf   TRISB   ; RB7-RB4を入力に設定
        clrf    TRISC   ; PORTCを全部出力に設定する
        movlw   01h
        movwf   PORTC   ; RC0を点灯 RC1を消灯
loop
        call    wait500
        movlw   03h
        xorwf   PORTC   ; RC0 RC1を反転させる
        goto    loop

wait500                 ; 0.5秒Wait
        movlw   d'50'  ; 10ms*50=0.5s
        movwf   Tcount1
dloop1
        movlw   d'200'  ; 50μs*200=10ms
        movwf   Tcount2
dloop2                   ; t=(12+12*count3)/48MHz 50μs
        movlw   d'199'
        movwf   Tcount3
        nop
dloop3
        decfsz  Tcount3
        goto    dloop3
        decfsz  Tcount2
        goto    dloop2
        decfsz  Tcount1
        goto    dloop1
        return

        END