実際に始める前に

今まで使った事のない 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 で点灯と消灯を繰り返します。

無事に動いたので、次に進みます。