OUTPUTはオーディオアンプを付けないと音が小さいです。
そのままスピーカーを接続しても音は聞こえます。
; PIC12F675 電子ホーン
; _____________
; VDD 5V =1; ;8= 0V VSS
; 20MHz =2;(GP5) (GP0);7= OUT____1KΩ________OUTPUT
; 20MHz =3;(GP4) (GP1);6= T
; PB =4;(GP3) (GP2);5= 0.1μF
; ______________ T
; GND
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
list p=12f675 ; 翻訳時にリストファイルを作ります
#include <p12f675.inc> ; 12F675用定義ファイルを読み込みます
;ASMファイルでは「;」より右側は読み取りませんので注意書きなり落書きが可能です。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
__CONFIG _CP_OFF & _CPD_OFF & _WDT_OFF & _MCLRE_OFF & _PWRTE_ON & _HS_OSC ;10MHz
; _INTRC_OSC_NOCLKOUT ;4MHz
;↑↑動かす条件です。機種によっていろいろ取り決めはありますが、これらは理屈抜きに覚えてください。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
errorlevel -302 ; 翻訳時に302エラーが出ないようにします
radix dec ; 省略時の数値表現を10進数にします。
ORG 000H
GOTO INIT
A_DATA_0 EQU 20H ;
A_DATA_1 EQU 21H ;
A_DATA_1A EQU 22H ;
A_CNT EQU 23H ;
A_SPEED_1 EQU 24H ;
B_DATA_0 EQU 25H ;
B_DATA_1 EQU 26H ;
B_DATA_1A EQU 27H ;
B_CNT EQU 28H ;
B_SPEED_1 EQU 29H ;
FLAG EQU 30H ;
ECHO EQU 31H ;
COUNT EQU 32H ;
D_CNT EQU 33H ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;<<<初期化ルーチン>>>
INIT:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;プログラムは「GOTO」などの命令がない限り下へ下へと降りて行きます。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BSF STATUS,RP0 ;BANK1に切り替え STATUS,RP0を1にするという意味
MOVLW B'00001000'
MOVWF TRISIO ;GPIO
MOVLW B'10000111' ;割り込みはTMR0 1:256(このプログラムは割り込みを使っていません) MOVWF OPTION_REG ;
CLRF ANSEL
BCF STATUS,RP0 ;BANK0に切り替え STATUS,RP0を0にするという意味
MOVLW B'00000111' ;GP2,GP1,GP0,
MOVWF CMCON
CLRF A_DATA_0
CLRF A_DATA_1
CLRF A_DATA_1A
CLRF A_CNT
CLRF B_DATA_0
CLRF B_DATA_1
CLRF B_DATA_1A
CLRF B_CNT
CLRF FLAG
MOVLW D'3'
MOVWF A_SPEED_1 ;音程B
MOVLW D'4'
MOVWF B_SPEED_1 ;音程A
MOVLW D'100'
MOVWF ECHO
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MAIN
CLRF D_CNT
BTFSC GPIO,3 ;GP3 ON?
GOTO MAIN ;NO
;YES
A_MAIN0
MOVLW H'00'
MOVWF PCLATH ; テーブルは 0x000~0x0FF番地内に存在
MOVF D_CNT,W
ADDWF PCL,F
CALL A_PTN_DATA ;データパターンへ
GOTO A_MAIN00
CALL A_PTN_DATA1 ;データパターン1へ
GOTO A_MAIN00
CALL A_PTN_DATA2 ;データパターン2へ
GOTO A_MAIN00
CALL A_PTN_DATA3 ;データパターン3へ
GOTO A_MAIN00
CALL A_PTN_DATA4 ;データパターン4へ
GOTO A_MAIN00
CALL A_PTN_DATA5 ;データパターン5へ
GOTO A_MAIN00
CALL A_PTN_DATA6 ;データパターン6へ
GOTO A_MAIN00
CALL A_PTN_DATA7 ;データパターン7へ
GOTO A_MAIN00
CALL A_PTN_DATA8 ;データパターン8へ
GOTO A_MAIN00
A_MAIN00
MOVWF A_DATA_1 ;<<PWM分子入力>>
INCF A_CNT,F ;データカウント更新
MOVLW D'4' ;データ総数
SUBWF A_CNT,W
BTFSC STATUS,C ;データ総数カウント完了?
CLRF A_CNT
A_MAIN1 ;<<PWM分母入力>>
MOVLW D'40'
MOVWF A_DATA_0
;<<PWM分母入力>>
MOVF A_DATA_1,W
MOVWF A_DATA_1A
;<<データ値0チェック>>
MOVF A_DATA_1,F ;DATA_1=0?
BTFSS STATUS,Z ;
GOTO A_MAIN2 ;NO
BCF GPIO,0 ;YES
BCF GPIO,1 ;YES
GOTO A_MAIN3
A_MAIN2 ;<<分子減少>>
BSF GPIO,0
BSF GPIO,1
DECFSZ A_DATA_1A ;分子-1=0?
GOTO A_MAIN3 ;NO
BCF GPIO,0 ;YES
BCF GPIO,1 ;YES
A_MAIN3 ;<<分母減少>>
DECFSZ A_DATA_0,F ;分母-1=0?
GOTO A_MAIN4 ;NO
;YES
;<<SPEED_1値0チェック>>
DECFSZ A_SPEED_1,F ;SPEED_1-1=0?
GOTO B_MAIN1 ;N0
;YES
MOVLW D'3'
MOVWF A_SPEED_1 ;音程B
GOTO B_MAIN0
A_MAIN4 ;<<GP1オフチェック >>
BTFSC GPIO,1 ;GP0 ON?
GOTO A_MAIN2 ;YES
NOP ;NO
NOP
NOP
GOTO A_MAIN3
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
B_MAIN0
MOVLW H'00'
MOVWF PCLATH ; テーブルは 0x000~0x0FF番地内に存在
MOVF D_CNT,W
ADDWF PCL,F
CALL B_PTN_DATA ;データパターンへ
GOTO B_MAIN00
CALL B_PTN_DATA1 ;データパターン1へ
GOTO B_MAIN00
CALL B_PTN_DATA2 ;データパターン2へ
GOTO B_MAIN00
CALL B_PTN_DATA3 ;データパターン3へ
GOTO B_MAIN00
CALL B_PTN_DATA4 ;データパターン4へ
GOTO B_MAIN00
CALL B_PTN_DATA5 ;データパターン5へ
GOTO B_MAIN00
CALL B_PTN_DATA6 ;データパターン6へ
GOTO B_MAIN00
CALL B_PTN_DATA7 ;データパターン7へ
GOTO B_MAIN00
CALL B_PTN_DATA8 ;データパターン8へ
GOTO B_MAIN00
B_MAIN00
MOVWF B_DATA_1 ;<<PWM分子入力>>
INCF B_CNT,F ;データカウント更新
MOVLW D'4' ;データ総数
SUBWF B_CNT,W
BTFSC STATUS,C ;データ総数カウント完了?
CLRF B_CNT
B_MAIN1 ;<<PWM分母入力>>
MOVLW D'40'
MOVWF B_DATA_0
;<<PWM分母入力>>
MOVF B_DATA_1,W
MOVWF B_DATA_1A
;<<データ値0チェック>>
MOVF B_DATA_1,F ;DATA_1=0?
BTFSS STATUS,Z ;
GOTO B_MAIN2 ;NO
BCF GPIO,0 ;YES
BCF GPIO,2 ;YES
GOTO B_MAIN3
B_MAIN2 ;<<分子減少>>
BSF GPIO,0
BSF GPIO,2
DECFSZ B_DATA_1A ;分子-1=0?
GOTO B_MAIN3 ;NO
BCF GPIO,0 ;YES
BCF GPIO,2 ;YES
B_MAIN3 ;<<分母減少>>
DECFSZ B_DATA_0,F ;分母-1=0?
GOTO B_MAIN4 ;NO
;YES
;<<SPEED_1値0チェック>>
DECFSZ B_SPEED_1,F ;SPEED_1-1=0?
GOTO A_MAIN1 ;N0
;YES
MOVLW D'4'
MOVWF B_SPEED_1 ;音程A
BTFSS GPIO,3 ;GP3 ON?
GOTO C_MAIN ;YES
GOTO D_MAIN ;NO
B_MAIN4 ;<<GP2オフチェック >>
BTFSC GPIO,2 ;GP2 ON?
GOTO B_MAIN2 ;YES
NOP ;NO
NOP
NOP
GOTO B_MAIN3
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
C_MAIN
CLRF D_CNT
GOTO A_MAIN0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
D_MAIN
DECFSZ ECHO,F
GOTO A_MAIN0
MOVLW D'100' ;エコー長さ
MOVWF ECHO
INCF D_CNT
INCF D_CNT
MOVLW D'18' ;データ総数 18
SUBWF D_CNT,W
BTFSC STATUS,C ;データ総数カウント完了?
GOTO MAIN
GOTO A_MAIN0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 200H
A_PTN_DATA
MOVLW H'02'
MOVWF PCLATH ; テーブルは 0x200~0x2FF番地内に存在
MOVF A_CNT,W
ADDWF PCL,F
RETLW D'40'
RETLW D'1'
; RETLW D'20'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
B_PTN_DATA
MOVLW H'02'
MOVWF PCLATH ; テーブルは 0x200~0x2FF番地内に存在
MOVF B_CNT,W
ADDWF PCL,F
RETLW D'30'
RETLW D'1'
; RETLW D'12'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
A_PTN_DATA1
MOVLW H'02'
MOVWF PCLATH ; テーブルは 0x200~0x2FF番地内に存在
MOVF A_CNT,W
ADDWF PCL,F
RETLW D'30'
RETLW D'1'
; RETLW D'15'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
B_PTN_DATA1
MOVLW H'02'
MOVWF PCLATH ; テーブルは 0x200~0x2FF番地内に存在
MOVF B_CNT,W
ADDWF PCL,F
RETLW D'25'
RETLW D'1'
; RETLW D'8'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
A_PTN_DATA2
MOVLW H'02'
MOVWF PCLATH ; テーブルは 0x200~0x2FF番地内に存在
MOVF A_CNT,W
ADDWF PCL,F
RETLW D'20'
RETLW D'1'
; RETLW D'10'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
B_PTN_DATA2
MOVLW H'02'
MOVWF PCLATH ; テーブルは 0x200~0x2FF番地内に存在
MOVF B_CNT,W
ADDWF PCL,F
RETLW D'20'
RETLW D'1'
; RETLW D'5'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
A_PTN_DATA3
MOVLW H'02'
MOVWF PCLATH ; テーブルは 0x200~0x2FF番地内に存在
MOVF A_CNT,W
ADDWF PCL,F
RETLW D'15'
RETLW D'1'
; RETLW D'7'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
B_PTN_DATA3
MOVLW H'02'
MOVWF PCLATH ; テーブルは 0x200~0x2FF番地内に存在
MOVF B_CNT,W
ADDWF PCL,F
RETLW D'15'
RETLW D'1'
; RETLW D'5'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
A_PTN_DATA4
MOVLW H'02'
MOVWF PCLATH ; テーブルは 0x200~0x2FF番地内に存在
MOVF A_CNT,W
ADDWF PCL,F
RETLW D'10'
RETLW D'1'
; RETLW D'5'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
B_PTN_DATA4
MOVLW H'02'
MOVWF PCLATH ; テーブルは 0x200~0x2FF番地内に存在
MOVF B_CNT,W
ADDWF PCL,F
RETLW D'10'
RETLW D'1'
; RETLW D'4'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
A_PTN_DATA5
MOVLW H'02'
MOVWF PCLATH ; テーブルは 0x200~0x2FF番地内に存在
MOVF A_CNT,W
ADDWF PCL,F
RETLW D'7'
RETLW D'1'
; RETLW D'5'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
B_PTN_DATA5
MOVLW H'02'
MOVWF PCLATH ; テーブルは 0x200~0x2FF番地内に存在
MOVF B_CNT,W
ADDWF PCL,F
RETLW D'8'
RETLW D'1'
; RETLW D'4'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
A_PTN_DATA6
MOVLW H'02'
MOVWF PCLATH ; テーブルは 0x200~0x2FF番地内に存在
MOVF A_CNT,W
ADDWF PCL,F
RETLW D'5'
RETLW D'1'
; RETLW D'3'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
B_PTN_DATA6
MOVLW H'02'
MOVWF PCLATH ; テーブルは 0x200~0x2FF番地内に存在
MOVF B_CNT,W
ADDWF PCL,F
RETLW D'4'
RETLW D'1'
; RETLW D'2'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 300H
A_PTN_DATA7
MOVLW H'03'
MOVWF PCLATH ; テーブルは 0x300~0x3FF番地内に存在
MOVF A_CNT,W
ADDWF PCL,F
RETLW D'4'
RETLW D'1'
; RETLW D'3'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
B_PTN_DATA7
MOVLW H'03'
MOVWF PCLATH ; テーブルは 0x300~0x3FF番地内に存在
MOVF B_CNT,W
ADDWF PCL,F
RETLW D'3'
RETLW D'1'
; RETLW D'2'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
A_PTN_DATA8
MOVLW H'03'
MOVWF PCLATH ; テーブルは 0x300~0x3FF番地内に存在
MOVF A_CNT,W
ADDWF PCL,F
RETLW D'2'
RETLW D'1'
; RETLW D'2'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
B_PTN_DATA8
MOVLW H'03'
MOVWF PCLATH ; テーブルは 0x300~0x3FF番地内に存在
MOVF B_CNT,W
ADDWF PCL,F
RETLW D'2'
RETLW D'1'
; RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'1'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
END
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;