2010年10月10日日曜日

点滅プログラムの解説

ファイルのダウンロード
; LEDを点滅するテストプログラム
; GP0 に接続したLEDを点滅します
;
; アセンブル オプションで、大文字小文字の区別をOFFにすること

 LIST   p=pic12f629 ; デバイスのリスト指示です。 決まり文句
 #INCLUDE   <p12f629.inc>;PIC12F675を使用する際の各種定義をインクルードします。決まり文句
 ERRORLEVEL -302   ; エラーレベル追加

;コンフィグレーション設定
 __CONFIG   _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT 
;_MCLRE_ON GP3ピンを MCLR として使用するかどうかの指定 
;_INTRC_OSC_NOCLKOUT 内臓クロック発振器を使用する。クロック出力しないの意味。

; 変数のメモリへのマッピング   ;0xは16進数を表わす時の頭文字
 CBLOCK 0x20   ; 12F629 の BANK0 メモリはアドレス 0x20~0x5f が利用可能 64個の8ビットレジスタ
 CNT1
 CNT2
 ENDC

;***************************
; プログラム開始
;***************************
 ORG  0x000   ;プログラムの開始位置です。 電源オン後、リセットが解除されるとプログラムメモリのアドレス 0x000 にある命令から実行し始めます。
 GOTO  PROGRAM_START ;goto xx  命令が書かれていますので xx と書かれたラベルの位置にプログラムは移行します。
 ORG  0x004   ; 不意の割り込みが発生した場合
 RETFIE

PROGRAM_START
      ; GPIO の IN/OUT 設定 (GP0 を OUTPUT)
  BSF  STATUS, RP0  ; Select Bank BSFは1をセットする。STATUSのRPO(ビット5)に1
 MOVLW B'00000000'  ; bit0 が GP0 に対応、bit0=0とする wレジスタに00000000をロード ワーキングレジスタは一個の8ビットのレジスタ
      ;00000000の右からポート0(7pin) 0 なら出力、1なら入力です
 MOVWF TRISIO   ;ワーキングレジスタの内容をTRISIOレジスタにコピー

      ; GPIO GP0 ~ GP2 のコンパレータ設定 (OFFとする)
 BCF  STATUS, RP0  ; Select Bank 0 STATUSのRPO(ビット5)に0をセット
  MOVLW 0x07   ; コンパレータを使わない bit7が使用しない コンパレータは二つの電圧(流)の比較
      ;CMCONレジスタに2進数で00000111を書き込み、デジタル入出力を可能にする000から111まで8種類のモードがある
  MOVWF CMCON   ;ワーキングレジスタの内容をCMCONレジスタにコピー

 BCF  INTCON, PEIE  ; 周辺割り込みすべてOFF

 CLRF  GPIO   ; 全I/O クリア CLRFはGPIOをゼロクリア

MAIN
 BSF  GPIO,0   ;点灯
 CALL  WAIT   ;WAITルーチンへ 201.603ミリ秒(0.201603秒)の遅延
 BCF  GPIO,0   ;消灯
 CALL  WAIT   ;201.603ミリ秒の遅延
 GOTO  MAIN   ;MAINへ

;***************************
; ここからサブルーチン部
;***************************

; 1命令サイクル = 4クロック
; 4MHzクロック時は、1命令は1MHz(=1usec)

WAIT    ;MOVLW(1)+MOVWF(2)+201599+RETURN(2)=201603    201.603ミリ秒
 MOVLW D'200'   ;1サイクル
 MOVWF CNT1   ;1サイクル
WAIT_LOOP   ;{CALL(2)+WAITE_SUB(1003)+DECFSZ(1)+GOTO(2)}X199+
    ;CALL(2)+WAITE_SUB(1003)+DECFSZ(2)=201599サイクル
 CALL  WAIT_SUB  ;2サイクル
 DECFSZ CNT1,F   ;1サイクル::0の時2サイクル 次行GOTOはスッキップ
 GOTO  WAIT_LOOP  ;2サイクル
 RETURN    ;2サイクル

WAIT_SUB   ;(1+1+2)+999=1003サイクル 1.003ミリ秒
 MOVLW D'200'   ;1サイクル
 MOVWF CNT2   ;1サイクル
WAIT_SUB_LOOP  ;{(NOP(1)+NOP(1)+DECFSZ(1)+GOTO(2)}X199+{NOP(1)+NOP(1)+RETURN(2)}=999サイクル
 NOP     ;1サイクル
 NOP     ;1サイクル
 DECFSZ CNT2,F   ;1サイクル::0の時2サイクル 次行GOTOはスッキップ
 GOTO  WAIT_SUB_LOOP ;2サイクル
 RETURN    ;2サイクル

 END

0 件のコメント:

コメントを投稿