ArduinoでAD9834DDSをコントロールする作業が一段落しました。
次は、PICでのコントロールに挑戦します。
使うPICは、PIC16F883にしました。
なぜ、このPICかというと、まず安い。秋月で150円です。それから、入出力ポートが多い。24ポート使えます。
WeB上には、あまりこのPICの使用例がないので、勉強を進める過程をブログに書いていこうと思います。
このPICのファミリーは、PIC16F882/883/884/886/887です。主な違いは
PIC Flash SRAM EEPROM I/O A/D
PIC16F882 2048 128 128 28 11
PIC16F883 4096 256 256 24 11
PIC16F884 4096 256 256 35 14
PIC16F886 8192 368 256 24 11
PIC16F887 8192 368 256 35 14
PIC16F883 4096 256 256 24 11
PIC16F884 4096 256 256 35 14
PIC16F886 8192 368 256 24 11
PIC16F887 8192 368 256 35 14
で、882/883/886は28ピン、884/887は、40ピンです。
まず、Lチカから始めます。
PIC16F883は、今まで勉強したPIC16F84や16F88と比べると次のような点が違います。
SFR(Special Function Register)が、BANK0~BANK3の4つあります。それだけ、いろいろな設定ができるようです。どのレジスタがどのバンクにあるか覚えるのは至難の業です。そこで、レジスタのバンク指定は、BANK DETECTIVEを使うことにします。つまり、BANKSEL BANK名と書くと自動的にBANKを指定してくれます。
RB0のタクトスイッチを押すとRA0のLEDが点灯するプログラムです。(RB0は10KΩでプルアップ)電源は単3電池×2=3Vです。
ブレッドボードです。
アセンブラ・ソースリストです。
LIST P=PIC16F883
INCLUDE P16F883.INC
;--------------------------------
;コンフィギュレーションの設定
;--------------------------------
__CONFIG _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOREN_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDTE_OFF & _INTOSCIO
__CONFIG _CONFIG2, _WRT_OFF
ORG 0X00
GOTO SETUP
INCLUDE P16F883.INC
;--------------------------------
;コンフィギュレーションの設定
;--------------------------------
__CONFIG _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOREN_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDTE_OFF & _INTOSCIO
__CONFIG _CONFIG2, _WRT_OFF
ORG 0X00
GOTO SETUP
ORG 0X04
SETUP
BANKSEL ANSEL
CLRF ANSEL ;アナログモードを使用しない
CLRF ANSELH
BANKSEL OSCCON
MOVLW 70h
MOVWF OSCCON ;CLOCK=8MHz
BANKSEL TRISA
CLRF TRISA ;RAは全て出力
MOVLW 0FFh
MOVWF TRISB ;RBは全て入力
CLRF TRISC ;RCは全て出力
BANKSEL PORTA
CLRF PORTA ;POARAクリア
CLRF PORTB ;PORTBクリア
CLRF PORTC ;POATCクリア
MAIN
BTFSC PORTB,0 ;PB0が0になったらスキップ
GOTO LEDOFF ;RB0が1ならLEDOFFへ
LEDON
MOVLW 01h
MOVWF PORTA ;RA0=1
GOTO MAIN
LEDOFF
MOVLW 00h
MOVWF PORTA ;RA0=0
GOTO MAIN
SETUP
BANKSEL ANSEL
CLRF ANSEL ;アナログモードを使用しない
CLRF ANSELH
BANKSEL OSCCON
MOVLW 70h
MOVWF OSCCON ;CLOCK=8MHz
BANKSEL TRISA
CLRF TRISA ;RAは全て出力
MOVLW 0FFh
MOVWF TRISB ;RBは全て入力
CLRF TRISC ;RCは全て出力
BANKSEL PORTA
CLRF PORTA ;POARAクリア
CLRF PORTB ;PORTBクリア
CLRF PORTC ;POATCクリア
MAIN
BTFSC PORTB,0 ;PB0が0になったらスキップ
GOTO LEDOFF ;RB0が1ならLEDOFFへ
LEDON
MOVLW 01h
MOVWF PORTA ;RA0=1
GOTO MAIN
LEDOFF
MOVLW 00h
MOVWF PORTA ;RA0=0
GOTO MAIN
END
今回は、内部オシレータを使い、8MHzにセットしています。
方法は、CONFIGで、 _INTOSCIOとして、OSCCONに70hをセットします。
MOVLW 70h
MOVWF OSCCON
MOVWF OSCCON
PORTBは、ウィークプルアップできるので、やってみましたが、不安定なので、プルアップ抵抗をつけました。