アセンブラプログラムを改良して、LEDの点滅するチラツキを無くしました。
;*************************************************************
;LEDコントローラー
;メインプログラム
;20221225
;1クロック時間 4/4MHz=1us(内臓RCクロック)
;*************************************************************
LIST P=PIC12F675
#INCLUDE P12F675.INC
; CONFIG設定(PIC12F675)
;
; 【 発振子設定 】
; _INTRC_OSC_NOCLKOUT :内部発振子4MHz
; _HS_OSC :外部発振子4~20MHz(セラロック接続時)
; 注)通常は上記2つのみ使用(以下参考まで)
; 【 WDT設定 】
; _WDT_OFF :ウォッチドッグタイマーOFF(通常はOFFで設定)
; _WDT_ON :ウォッチドッグタイマーON (ONが必要な場合のみ設定)
; 【 PWRTE設定 】
; _PWRTE_ON :パワーオンリセットON (通常はONで設定)
; _PWRTE_OFF :パワーオンリセットOFF(外部リセット設置に設定)
; 【 MCLRE設定 】
; _MCLRE_ON :MCLRピンとして使用
; _MCLRE_OFF :GP3ピンとして使用(GP3はInputピン専用)2
; 【 CP設定 】
; _CP_OFF :プログラムメモリコードプロテクトOFF(通常設定)
; _CP_ON :プログラムメモリコードプロテクトON (非定常)
; 【 DATA_CP設定 】
; _CPD_OFF :EEPROMコードプロテクトOFF(ON/OFFの差異がわからん)
; _CPD_ON :EEPROMコードプロテクトON (通常ONで使用して問題無)
; 【 BODEN設定 】
; _BODEN_OFF :低電圧リセット指定OFF(ON/OFFの差異がわからん)
; _BODEN_ON :低電圧リセット指定ON (通常OFFで使用して問題無)
;先頭を1マスあけること
__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF
;----I/O設定----
;*********************************************************
; 変数、定数定義とレジスタ割付
;電源)1pin Vdd
;GP5)2pin NC
;GP4)3pin LED出力 ON=1
;GP3)4pin NC
;GP2)5pin NC
;GP1)6pin NC
;GP0)7pin アナログ入力
;電源)8pin Vss
;****** Register Bank0 20h-5Fh(64Bytes) **********************
CNT1 EQU 20H ;タイマー
CNT2 EQU 21H ;タイマー
CNT3 EQU 22H ;タイマー
CNT4 EQU 23H ;タイマー
VR0_DATA EQU 24H
; EQU 25H
WTEMP EQU 26H
STEMP EQU 27H
PCTEMP EQU 28H
;****** Bank1 A0h-DFh(64Bytes) ******************************
;未使用
;********** macro *****************************************
MOVLF MACRO LF,DST1
MOVLW LF
MOVWF DST1
ENDM
;----------------------------------------
MOVFF MACRO SRC,DST
MOVF SRC,W
MOVWF DST
ENDM
;----------------------------------------
MAIN ORG 0 ;Reset
GOTO PORT_INI
;***********割込み*****************
ORG 4
INTRPT ;
MOVWF WTEMP
SWAPF STATUS,W
MOVWF STEMP
CLRF STATUS
MOVF PCLATH,W
MOVWF PCTEMP
CLRF PCLATH
;TMR0ノコギリ波周波数TMR0 Rate_1:16 4*1/4MHz*16*256=4mS
INTRPT0
BCF INTCON,T0IF ;TMR0 割り込みフラグリセット
BSF GPIO,GP4
POPRTN
MOVF PCTEMP,W
MOVWF PCLATH
SWAPF STEMP,W
MOVWF STATUS
SWAPF WTEMP,F
SWAPF WTEMP,W
RETFIE ;割り込み終了
;*********** 初期設定 ***************************************
PORT_INI
CLRF STATUS ;STATUS初期設定 BANK0
;------------ BANK1設定 ----------------------------
BSF STATUS,RP0 ;BANK1
MOVLW B'010100001'
MOVWF ANSEL ;GP0アナログ設定その他デジタル
CLRF PCON ;パワーONリセット使用設定
CLRF PIE1 ;コンパレータ,TMR1 割込み不使用
MOVLF B'00000000',WPU ;弱プルアップピン設定
MOVLF B'00000011',IOC ;状態変化割込みピン設定
MOVLF B'00000011',OPTION_REG ;TMR0 Rate1:16
MOVLF B'11111100',OSCCAL ;内部クロック設定Max4MHz
BCF PCLATH,3
BCF PCLATH,4
MOVLF B'00000001',TRISIO ;GPIO入出力の設定 1=in 0=out
;------------ BANK0設定 ----------------------------
BCF STATUS,RP0 ;BANK 0
BCF STATUS,RP1 ;BANK 0
CLRF GPIO ;I/Oクリア
CLRF PIR1 ;書込み割込みフラグ設定
CLRF T1CON ;TMR1不使用設定
MOVLF B'10100000',INTCON ;TMR0状態変化割込み使用
;***************************************
MAINLOOP
;******* アナログ入力A/D変換
MOVLF B'00000001',ADCON0 ;RA0データ蓄積
CALL T10uS
CALL T10uS ;蓄積待ち
BSF ADCON0,GO ;A/D変換開始
BTFSC ADCON0,GO
GOTO $-1
MOVFF ADRESH,VR0_DATA
;**** 比較とPWM出力
PWM_C MOVF TMR0,W
SUBWF VR0_DATA,W
BTFSC STATUS,C
GOTO ENDLOOP
BCF GPIO,GP4 ;LED OFF
ENDLOOP
GOTO MAINLOOP
;******タイマールーチン *************************************
T01mS
MOVLF d'19',CNT1 ;
nop
nop
DECFSZ CNT1,F ;2+(2+1+2)*19-1+1+2=100
GOTO $-3
NOP
RETURN ;(100+10)*1uS=110usec=0.11mS(about)
;--------------------------------------------------------------
T10mS
MOVLF D'95',CNT2 ;95回
CALL T01mS
DECFSZ CNT2,F ;2+(2+100+1+2)*95-1+10+2+1+2=9,991
GOTO $-2 ;9991*1uS=10ms(about)
NOP ;調整用
RETURN
;--------------------------------------------------------------
T10uS
MOVLW D'3'
MOVWF CNT1
DECFSZ CNT1,F ;2+(1+2)*3-1=10
GOTO $-1
RETURN ;(10+1)*1uS=11usec
;*********************************************************
END