2010年10月10日日曜日

点滅プログラムの解説

ファイルのダウンロード
  1. ; LEDを点滅するテストプログラム  
  2. ; GP0 に接続したLEDを点滅します  
  3. ;  
  4. ; アセンブル オプションで、大文字小文字の区別をOFFにすること  
  5.   
  6.  LIST   p=pic12f629 ; デバイスのリスト指示です。 決まり文句  
  7.  #INCLUDE   <p12f629.inc>;PIC12F675を使用する際の各種定義をインクルードします。決まり文句  
  8.  ERRORLEVEL -302   ; エラーレベル追加  
  9.   
  10. ;コンフィグレーション設定  
  11.  __CONFIG   _CP_OFF &; _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT   
  12. ;_MCLRE_ON GP3ピンを MCLR として使用するかどうかの指定   
  13. ;_INTRC_OSC_NOCLKOUT 内臓クロック発振器を使用する。クロック出力しないの意味。  
  14.   
  15. ; 変数のメモリへのマッピング   ;0xは16進数を表わす時の頭文字  
  16.  CBLOCK 0x20   ; 12F629 の BANK0 メモリはアドレス 0x20~0x5f が利用可能 64個の8ビットレジスタ  
  17.  CNT1  
  18.  CNT2  
  19.  ENDC  
  20.   
  21. ;***************************  
  22. ; プログラム開始  
  23. ;***************************  
  24.  ORG  0x000   ;プログラムの開始位置です。 電源オン後、リセットが解除されるとプログラムメモリのアドレス 0x000 にある命令から実行し始めます。  
  25.  GOTO  PROGRAM_START ;goto xx  命令が書かれていますので xx と書かれたラベルの位置にプログラムは移行します。  
  26.  ORG  0x004   ; 不意の割り込みが発生した場合  
  27.  RETFIE  
  28.   
  29. PROGRAM_START  
  30.       ; GPIO の IN/OUT 設定 (GP0 を OUTPUT)  
  31.   BSF  STATUS, RP0  ; Select Bank BSFは1をセットする。STATUSのRPO(ビット5)に1  
  32.  MOVLW B'00000000'  ; bit0 が GP0 に対応、bit0=0とする wレジスタに00000000をロード ワーキングレジスタは一個の8ビットのレジスタ  
  33.       ;00000000の右からポート0(7pin) 0 なら出力、1なら入力です  
  34.  MOVWF TRISIO   ;ワーキングレジスタの内容をTRISIOレジスタにコピー  
  35.   
  36.       ; GPIO GP0 ~ GP2 のコンパレータ設定 (OFFとする)  
  37.  BCF  STATUS, RP0  ; Select Bank 0 STATUSのRPO(ビット5)に0をセット  
  38.   MOVLW 0x07   ; コンパレータを使わない bit7が使用しない コンパレータは二つの電圧(流)の比較  
  39.       ;CMCONレジスタに2進数で00000111を書き込み、デジタル入出力を可能にする000から111まで8種類のモードがある  
  40.   MOVWF CMCON   ;ワーキングレジスタの内容をCMCONレジスタにコピー  
  41.   
  42.  BCF  INTCON, PEIE  ; 周辺割り込みすべてOFF  
  43.   
  44.  CLRF  GPIO   ; 全I/O クリア CLRFはGPIOをゼロクリア  
  45.   
  46. MAIN  
  47.  BSF  GPIO,0   ;点灯  
  48.  CALL  WAIT   ;WAITルーチンへ 201.603ミリ秒(0.201603秒)の遅延  
  49.  BCF  GPIO,0   ;消灯  
  50.  CALL  WAIT   ;201.603ミリ秒の遅延  
  51.  GOTO  MAIN   ;MAINへ  
  52.   
  53. ;***************************  
  54. ; ここからサブルーチン部  
  55. ;***************************  
  56.   
  57. ; 1命令サイクル = 4クロック  
  58. ; 4MHzクロック時は、1命令は1MHz(=1usec)  
  59.   
  60. WAIT    ;MOVLW(1)+MOVWF(2)+201599+RETURN(2)=201603    201.603ミリ秒  
  61.  MOVLW D'200'   ;1サイクル  
  62.  MOVWF CNT1   ;1サイクル  
  63. WAIT_LOOP   ;{CALL(2)+WAITE_SUB(1003)+DECFSZ(1)+GOTO(2)}X199+  
  64.     ;CALL(2)+WAITE_SUB(1003)+DECFSZ(2)=201599サイクル  
  65.  CALL  WAIT_SUB  ;2サイクル  
  66.  DECFSZ CNT1,F   ;1サイクル::0の時2サイクル 次行GOTOはスッキップ  
  67.  GOTO  WAIT_LOOP  ;2サイクル  
  68.  RETURN    ;2サイクル  
  69.   
  70. WAIT_SUB   ;(1+1+2)+999=1003サイクル 1.003ミリ秒  
  71.  MOVLW D'200'   ;1サイクル  
  72.  MOVWF CNT2   ;1サイクル  
  73. WAIT_SUB_LOOP  ;{(NOP(1)+NOP(1)+DECFSZ(1)+GOTO(2)}X199+{NOP(1)+NOP(1)+RETURN(2)}=999サイクル  
  74.  NOP     ;1サイクル  
  75.  NOP     ;1サイクル  
  76.  DECFSZ CNT2,F   ;1サイクル::0の時2サイクル 次行GOTOはスッキップ  
  77.  GOTO  WAIT_SUB_LOOP ;2サイクル  
  78.  RETURN    ;2サイクル  
  79.   
  80.  END  

0 件のコメント:

コメントを投稿