PIC16F648A をアセンブラでLチカ
やはり、動いているところを見ないとつまらないので、手持ちの16F648Aにプログラムしてみましたよ。
前回まで資料として使用した、「電子工作の為のPIC16F活用ガイド」のコードは、16F819を使用して、オシレータの周波数を変えながらLチカする内容でした。
しかし、手持ちの16F648Aには、OSCCONなど無く内部発振周波数は、4MHzと48kHzの2つしか選べないので、別の手を考えなければいけないのです。
まあ、単純にOn,Offをループで回しても良いんだけど、せっかくなので、PWMを使うことにしました。 とは言っても、デューティ50%の固定チカチカだけど。
それで、作成したソースが以下です。
;******************************************
;* PIC16F648A
;* 基本的なLEDの点滅 (f≒3Hz, Duty=50%)
;* 2021/10/14
;******************************************
#include <xc.inc>
; CONFIG
CONFIG FOSC = INTOSCIO ; Oscillator Selection bits (INTOSC oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
CONFIG WDTE = OFF ; Watchdog Timer Enable bit (WDT disabled)
CONFIG PWRTE = OFF ; Power-up Timer Enable bit (PWRT disabled)
CONFIG MCLRE = OFF ; RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD)
CONFIG BOREN = OFF ; Brown-out Detect Enable bit (BOD disabled)
CONFIG LVP = OFF ; Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)
CONFIG CPD = OFF ; Data EE Memory Code Protection bit (Data memory code protection off)
CONFIG CP = OFF ; Flash Program Memory Code Protection bit (Code protection off)
PSECT resetVect, class=CODE, delta=2
resetVect:
PAGESEL main
goto main
main:
;***** MAIN PROGRAM
;***** 初期設定
BSF STATUS,6 ;RP1=1
BCF STATUS,5 ;RP0=0 バンク2へ切替え
PORTB__ equ 0x00 ;08h, PORTB リセット
BCF STATUS,6 ;RP1=0
BSF STATUS,5 ;RP0=1 バンク1へ切替え
;*** 基準クロック設定
BCF PCON,3 ;8Eh, INTOSC=48kHz
;*** PWM周期設定
MOVLW 0xFF
MOVWF PR2 ;92h, Period=255
BCF STATUS,5 ;バンク0へ切替え
;*** CCP(Capture/Comp/PWM)設定
MOVLW 0x3C
MOVWF CCP1CON ;17h, PWMデューティ設定 再下位ビット=0x3h, PWMモード設定
;*** CCPR(Capture/Comp/PWM Register1)設定
MOVLW 0x7F
MOVWF CCPR1L ;15h, PWMデューティ設定 下位ビット=0x3h →Duty 50%
BSF STATUS,5 ;バンク1へ切替え
;*** CCP1ピン I/O設定
BCF TRISB,3 ;86h, CCP1=output
BCF STATUS,5 ;バンク0へ切替え
;*** Timer2設定
MOVLW 0x07
MOVWF T2CON ;12h, Postscale=1:1, Timer2=On, Prescale=1:16
END resetVect
主な設定内容は、内部クロック周波数=48kHz、PWMピリオド=0.34s、PWMデューティ50%。 尚、このコードに御用のある方は、ご自由にご活用ください。
MPLAB X IDE v5.50でアセンブル→HEXファイル作成し、久しぶりの秋月picライターで焼きました。私が持っているものは、古いのでPCとのI/FはRS232cだけど、これまたお久しぶりの、USB-シリアルケーブルで無事に接続できました。まだまだご健在。
動作中の様子が、これ。
動作中のオシロのキャプチャが以下。
PWMの設計値=0.34sに対して、実測値=0.362s。+6%程度の誤差となりました。 尚、設計値の0.34sは、これが16F648Aの内部発振使用時PWMの最長ピリオドなんです、多分。
さて、これでやっと本題に入る準備ができた。