実際に始める前に
今まで使った事のない PIC16F886 なので情報を集めると、メジャーな石ではないためなのか、あまり情報が見つかりません。
「PIC 超初心者」から「PIC 初心者」位にレベルアップした者としては、まず最初は色々サンプルプログラムを見たいところです。 PIC16F 系なのでそんなに違わないと思いますけど。
ハーモニックサイレンアンプ改のコントロールユニット用プログラムを始める前に、初心に戻りこの PIC でまずは PORTA,0 の LED を点滅させる単純なプログラムを試してみる事にしました。
;********************************************* ;PIC16F886テストプログラム ;内部発振4MHzモード使用 ;2012/02/02 ;********************************************* LIST P=16F886 INCLUDE "P16F886.INC" __CONFIG _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_CLKOUT __CONFIG _CONFIG2, _WRT_OFF & _BOR21V ERRORLEVEL -302 ;アセンブル時のバンク警告メッセージ抑制 ;--------------------------------------------------------------------- ; 入出力ポートの定義 ;--------------------------------------------------------------------- ;ポートA #DEFINE LED_OUT PORTA,0 ; LED ;#DEFINE PORTA,1 ; 未使用 ;#DEFINE PORTA,2 ; 未使用 ;#DEFINE PORTA,3 ; 未使用 ;#DEFINE PORTA,4 ; 未使用 ;#DEFINE PORTA,5 ; 未使用 ;#DEFINE PORTA,6 ; 1/4 Mhz = 1Mhz CLK OUT ;#DEFINE PORTA,7 ; 未使用 ;ポートB ;#DEFINE PORTB,0 ; 未使用 ;#DEFINE PORTB,1 ; 未使用 ;#DEFINE PORTB,2 ; 未使用 ;#DEFINE PORTB,3 ; 未使用 ;#DEFINE PORTB,4 ; 未使用 ;#DEFINE PORTB,5 ; 未使用 ;#DEFINE PORTB,6 ; 未使用 ;#DEFINE PORTB,7 ; 未使用 ;ポートC ;#DEFINE PORTB,0 ; 未使用 ;#DEFINE PORTA,1 ; 未使用 ;#DEFINE PORTA,2 ; 未使用 ;#DEFINE PORTA,3 ; 未使用 ;#DEFINE PORTC,4 ; 未使用 ;#DEFINE PORTC,5 ; 未使用 ;#DEFINE PORTC,6 ; 未使用 ;#DEFINE PORTC,7 ; 未使用 ;--------------------------------------------------------------------- i EQU 0x20 ;ループカウンタ用変数 j EQU 0x21 ;ループカウンタ用変数 k EQU 0x22 ;ループカウンタ用変数 l EQU 0x23 ;ループカウンタ用変数 ;--------------------------------------------------------------------- ;--------------------------------------------------------------------- ; マクロ定義 ;--------------------------------------------------------------------- BANK0 MACRO BCF STATUS,RP0 ;BANK0に切り替える BCF STATUS,RP1 ; ENDM BANK1 MACRO BSF STATUS,RP0 ;BANK1に切り替える BCF STATUS,RP1 ; ENDM BANK2 MACRO BCF STATUS,RP0 ;BANK2に切り替える BSF STATUS,RP1 ; ENDM BANK3 MACRO BSF STATUS,RP0 ;BANK3に切り替える BSF STATUS,RP1 ; ENDM ORG 0x000 GOTO INIT ;***** 割り込みルーチン ORG 0x004 RETFIE ;--------------------------------------------------------------------- ; リセット後のプログラムはここからスタート ;--------------------------------------------------------------------- INIT BCF INTCON,GIE ;全割込み禁止 BANK1 MOVLW B'01100000' ; 内部クロック 4MHz MOVWF OSCCON ;全てのI/Oポートをデジタルモードへ CLRF ANSEL ; CLRF ANSELH ; ; ポートの入出力設定 MOVLW B'00000000' MOVWF TRISA ; ポートA全出力 MOVLW B'00000000' MOVWF TRISB ; ポートB全出力 MOVLW B'00000000' MOVWF TRISC ; ポートC全出力 ; BANK0 ;--------------------------------------------------------------------- ; プログラム開始 ;--------------------------------------------------------------------- MAIN_LOOP BSF LED_OUT ;LEDオン MOVLW d'200' ; MOVWF i CALL DELAYms BCF LED_OUT ;LEDオフ MOVLW d'200' ; MOVWF i CALL DELAYms GOTO MAIN_LOOP INCLUDE delayms.inc END
LIST P=16F886 INCLUDE "P16F886.INC" __CONFIG _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_CLKOUT __CONFIG _CONFIG2, _WRT_OFF & _BOR21V ERRORLEVEL -302 ;アセンブル時のバンク警告メッセージ抑制
コンフィグレーションの記述が今まで使ってきた PIC と少し違い、_CONFIG1 と _CONFIG2 と2行で指示します。 それぞれで指定できる物が違うので第一の気を付ける点。
BANK1 MOVLW B'01100000' ; 内部クロック 4MHz MOVWF OSCCON
ここで内部クロック周波数の設定をしています。ここを以下のようにすると望みの周波数で動作します。
01110000 = 8Mhz
01100000 = 4Mhz
01010000 = 2Mhz
01000000 = 1Mhz
00110000 = 500Khz
00100000 = 250Khz
00010000 = 125Khz
00000000 = 31Khz
インクルードファイルである delayms.inc は PIC 学習開始時からお世話になっている FENG3 さんのサイト http://feng3.nobody.jp/ から頂いたミリ秒ウェイトルーチンを使っています。
これをライターで書き込んでテストすると、200ms で点灯と消灯を繰り返します。
無事に動いたので、次に進みます。