見出し画像

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-シリアルケーブルで無事に接続できました。まだまだご健在。

画像1

動作中の様子が、これ。

画像2

動作中のオシロのキャプチャが以下。

画像3

PWMの設計値=0.34sに対して、実測値=0.362s。+6%程度の誤差となりました。 尚、設計値の0.34sは、これが16F648Aの内部発振使用時PWMの最長ピリオドなんです、多分。

さて、これでやっと本題に入る準備ができた。

この記事が気に入ったらサポートをしてみませんか?