山本ワールド
USB-IO2.0(AKI)でLEDを点滅させる
概要
LED2個を交互に0.5秒置きに点灯させてみる。RC0とRC1にLEDを接続する。
クロックはUSB-IOで接続済みの12MHzのセラミック振動子を使用する。USB-IO2(AKI)のプログラムを書き換えて使用する。プログラムを書き込むことにより購入時付属のサンプルプログラムでIO操作はできなくなるので注意。書込みはPICKit3を前提とする。
プログラムの説明
外部クロックの設定
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
Copyright (C) 2012 山本ワールド All Rights Reserved.