PIC18F14K50は16ビットアーキテクチャを
持った次世代PICである。
メモリが大きいので C言語に向いている
LEDを点滅させてみよう
回路は下記である
さて LEDを点滅させて、KEY入力で オレンジと緑を切り替えている、簡単なプログラムである
LED7を点滅させておいて
KEY RB5が入力されると、フラグを立てる
フラグが立っているあいだは LED6が点滅している
LIST P=PIC18F14K50
INCLUDE "P18F14K50.INC"
; TODO INSERT CONFIG CODE HERE USING CONFIG BITS GENERATOR
CONFIG USBDIV = OFF ;USB CLOCK SELECTION BIT
CONFIG MCLRE = OFF ;MCLR PIN ENABLE BIT
CONFIG IESO = OFF ;Internal/External Oscillator Switchover bit
CONFIG FCMEN = OFF ;Fail-Safe Clock Monitor Enable bit
CONFIG FOSC = IRC ;OSCILLATOR SELECTION BITS
CONFIG PWRTEN = ON ;Power-up Timer Enable bit
CONFIG PLLEN = OFF ;X PLL ENABLE BIT(OSCILLATOR MULTIPLIED BY 4)
CONFIG PCLKEN = OFF ;PRIMARY CLOCK ENABLE BIT
CONFIG BOREN = OFF ;Brown-out Reset Enable bits
CONFIG LVP = OFF ;Single-Supply ICSP Enable bit
CONFIG CPUDIV=NOCLKDIV ;CPU SYSTEM CLOCK SELECTION BIT
CONFIG CP0 = OFF ;Code Protection bit
CONFIG CP1 = OFF ;Code Protection bit
CONFIG CPD = OFF ;Data EEPROM Code Protection bit
CONFIG CPB = OFF ;Boot Block Code Protection bit
CONFIG WDTEN = OFF ;Watchdog Timer Enable bit
CONFIG HFOFST = OFF,STVREN = OFF,BBSIZ = OFF,XINST = OFF
CONFIG EBTR0 = OFF,EBTR1 = OFF,EBTRB = OFF
tim1 EQU 21h
tim2 EQU 22h
mem1 EQU 23h
mem2 EQU 25h
;-----------------------------------------
RES_VECT CODE 0x0000 ; processor reset vector
GOTO START ; go to beginning of program
; TODO ADD INTERRUPTS HERE IF USED
MAIN_PROG CODE ; let linker place main program
START
CLRF ANSEL
CLRF ANSELH
movlw B'01100010' ;内部8Mクロック
movwf OSCCON ;w---> OSCCON
movlw B'10000000' ;0= 出力
movwf TRISC
movlw B'00110000' ;1= 入力
movwf TRISB
movlw B'11111111' ;1= 入力
movwf TRISA
MAIN
bsf LATB,7 ;緑
bsf LATB,6 ;オレンジ
call t1s
bcf LATB,7
bcf LATB,6
call t1s
LOOP:
bsf LATB,7;
call t500ms
bcf LATB,7
call t500ms
btfss PORTB,5 ;1ならば JMP次行?
goto LOOP11
nop
GOTO LOOP
LOOP11:
bsf LATB,6
call t500ms
bcf LATB,6
call t500ms
btfss PORTB,4
goto LOOP
nop
goto LOOP11
GOTO MAIN ; loop forever
;----------タイマー 10MHZの時---25サイクル(10us)-------------------
;16ビット対応なので PIC18は goto $+2 とすること
t10us:
goto $+2 ;2サイクル
goto $+2
goto $+2
goto $+2
goto $+2
goto $+2 ;2サイクル
goto $+2
goto $+2
goto $+2
goto $+2
nop
return
t500us:
movlw D'50' ;w <---89
movwf tim1 ;レジスタを使用する
t500us_1:
call t10us
decfsz tim1 ,f ;0でなければ次の行、違えば 次は飛ばす
goto t500us_1
nop
return
t1ms:
movlw D'89' ;w <---89
movwf tim1 ;レジスタを使用する
t1ms_1:
call t10us
decfsz tim1,f ;0でなければ次の行、違えば 次は飛ばす
goto t1ms_1
nop
goto $+2
return
;-------- 25000サイクル--------------
t10ms:
movlw D'10'
movwf tim2
t10ms_1:
call t1ms
decfsz tim2,f
goto t10ms_1
nop
return
;-------- 250000サイクル--------------
t100ms:
movlw D'10'
movwf tim2
t100ms_1:
call t1ms
call t1ms
decfsz tim2,f
goto t100ms_1
nop
return
;-------- 1250000サイクル--------------
t500ms:
movlw D'250'
movwf tim2
t500ms_1:
call t1ms
call t1ms
decfsz tim2,f
goto t500ms_1
nop
return
;----------------------
t1s:
movlw D'250'
movwf tim2
t1s_1:
call t1ms
call t1ms
call t1ms
call t1ms
decfsz tim2,f
goto t1s_1
nop
return
END
次に重要なのは、I/O設定である
LEDの点滅(出力)はできたが、KEY入力ができなかった。
PIC16と違って、I/Oを デジタルI/Oに設定しないと、KEYのON,OFFが検出できないのである
CLRF ANSEL
CLRF ANSELH
0=デジタルI/Oに割当
ラッチレジスタをもっているので、PORTではなくLATを使う
動作の基本
PIC18F14Kは内部クロックをもっているので、内部クロックを働かせよう
movlw B'01100010' ;内部8Mクロック
movwf OSCCON ;w --->OSCCON = 0b01100010; // 内部クロック 8M
これで内部クロックが働く
工事中ーー