と、いうわけで、素人のアセンブラです。
たぶん、コピーしただけではだめかもです。タブ位置とかそろえる必要があります。
お約束:他の著作権を侵害している可能性もあります。波形発生器なので、なにがおこるかわかりませんよ!自己責任でお願いします。
アナログ回路で苦労して正弦波発生回路やツートーン発生回路を作るより簡単です。
利用する場合は、 注なになに と記載してあるとこはアセンブラに入れないでね!
Aポート、Bポートの残りを入力にして、波形の切替とか、周波数の切替も出来るかもです。
;なんちゃって正弦波、ツートーン発生器
list p=16F84
INCLUDE "p16F84A.inc"
__CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
ORG 00h
;******
T1 EQU 0Ch
T2 EQU 0Dh
T3 EQU 0Eh
M1 EQU 0Fh
M2 EQU 10h
;******
BSF STATUS, RP0
CLRF TRISA
CLRF TRISB
BCF OPTION_REG,NOT_RBPU
BCF STATUS, RP0
;メイン
MAIN
CALL TIM04 注:飛ばないと最高周波数になる、NOPで調整っていう手も
INCF M2,F
MOVF M2,W
; CALL SIN_PIN 注:こっちを有効にすると正弦派
CALL TONE_PIN 注:こっちを有効にするとツートーン
MOVWF PORTB
MOVWF PORTA 注:確認用なので無効にすると周波数が上がる(はず)
GOTO MAIN
注:メインルーチンなんてこれだけです。びっくり!
注:波形データを3Fまでのアドレスで繰り返しています。この命令があったから簡単になりました。当初は複雑ぽいアセンブラを検討していた
;正弦波
SIN_PIN
ANDLW H'3F' 注:ここと次の行がおまじない
ADDWF PCL,F
RETLW D'32'
RETLW D'34'
RETLW D'36'
RETLW D'39'
RETLW D'41'
RETLW D'43'
RETLW D'46'
RETLW D'47'
RETLW D'49'
RETLW D'51'
RETLW D'53'
RETLW D'54'
RETLW D'55'
RETLW D'56'
RETLW D'56'
RETLW D'57'
;********************
RETLW D'57'
RETLW D'57'
RETLW D'56'
RETLW D'56'
RETLW D'55'
RETLW D'54'
RETLW D'53'
RETLW D'51'
RETLW D'49'
RETLW D'47'
RETLW D'46'
RETLW D'43'
RETLW D'41'
RETLW D'39'
RETLW D'36'
RETLW D'34'
;********************
RETLW D'32'
RETLW D'29'
RETLW D'27'
RETLW D'24'
RETLW D'22'
RETLW D'20'
RETLW D'18'
RETLW D'16'
RETLW D'14'
RETLW D'12'
RETLW D'10'
RETLW D'9'
RETLW D'8'
RETLW D'7'
RETLW D'7'
RETLW D'6'
;********************
RETLW D'6'
RETLW D'6'
RETLW D'7'
RETLW D'7'
RETLW D'8'
RETLW D'9'
RETLW D'10'
RETLW D'12'
RETLW D'14'
RETLW D'16'
RETLW D'18'
RETLW D'20'
RETLW D'22'
RETLW D'24'
RETLW D'27'
RETLW D'29'
;********************
;ツートーン波
TONE_PIN
ANDLW H'3F' 注:ここと次の行がおまじない
ADDWF PCL,F
RETLW D'31'
RETLW D'36'
RETLW D'40'
RETLW D'43'
RETLW D'46'
RETLW D'50'
RETLW D'52'
RETLW D'54'
RETLW D'55'
RETLW D'56'
RETLW D'56'
RETLW D'55'
RETLW D'54'
RETLW D'52'
RETLW D'50'
RETLW D'48'
;********************
RETLW D'45'
RETLW D'43'
RETLW D'40'
RETLW D'37'
RETLW D'35'
RETLW D'32'
RETLW D'30'
RETLW D'29'
RETLW D'27'
RETLW D'27'
RETLW D'26'
RETLW D'27'
RETLW D'27'
RETLW D'28'
RETLW D'29'
RETLW D'30'
;********************
RETLW D'32'
RETLW D'33'
RETLW D'34'
RETLW D'35'
RETLW D'36'
RETLW D'36'
RETLW D'37'
RETLW D'36'
RETLW D'36'
RETLW D'34'
RETLW D'33'
RETLW D'31'
RETLW D'28'
RETLW D'26'
RETLW D'23'
RETLW D'20'
;********************
RETLW D'18'
RETLW D'15'
RETLW D'13'
RETLW D'11'
RETLW D'9'
RETLW D'8'
RETLW D'7'
RETLW D'7'
RETLW D'8'
RETLW D'9'
RETLW D'11'
RETLW D'13'
RETLW D'16'
RETLW D'20'
RETLW D'23'
RETLW D'27'
;********************
注:04のタイマしかつかってません ここに飛ばなければ最高周波数になる
;04mSタイマー
TIM04
MOVLW D'50' 注:周波数変更の値
MOVWF T1
TIMLOOP1
DECFSZ T1,F
GOTO TIMLOOP1
RETURN
;100mSタイマー
TIM100
MOVLW D'250'
MOVWF T2
TIMLOOP2
CALL TIM04
DECFSZ T2,F
GOTO TIMLOOP2
RETURN
;500mSタイマー
;TIM500
; MOVF PORTB,W
; MOVWF T3
; RRF T3,1
; RRF T3,1
; RRF T3,0
; ANDLW B'00011111'
; MOVLW D'5'
; MOVWF T3
;TIMLOOP3
; CALL TIM100
; DECFSZ T3,F
; GOTO TIMLOOP3
; RETURN
END
PIC16F84Aの練習に、なんちゃって正弦波発生を検討中
6ビット出力をラダー抵抗でデジタル⇒アナログ変換してやればアナログ発振器よりましな正弦波になるんじゃねぇ! あるいは、6ビットだとS/N比が悪くなり、ほどほどの波形か?
意外と簡単に出来ちゃいましたので、ツートーン波形を作ってみました。1周期の低い周波数に2周期の高い周波数を重ねて、位相もあってます。位相を合わせない方が面白かったかもです。
エクセルの演算結果 D⇒Aで出来たとしての演算結果です。
波形です。 それっぽいです。
0.76V~3.76Vの振幅です。
FFTアナライザ 当たり前ですが、2つの周波数が綺麗に出てます。
不要周波数との差が30db充分でしょう
SSB送信機の調整に使う場合は、3KhzのバリバリのLPFが入ってるので、高い周波数を3Khz以下(低い周波数で言うと1.5Khz以下)にしないと、単調波になってしまう
PIC16F84Aの練習に、なんちゃって正弦波発生を検討中
6ビット出力をラダー抵抗でデジタル⇒アナログ変換してやればアナログ発振器よりましな正弦波になるんじゃねぇ! あるいは、6ビットだとS/N比が悪くなり、ほどほどの波形か?
意外と簡単に出来ちゃいました
波形です。 最大で約3Khz程度でした。クロックを20Mhzにすれば6Khzまでいくか?
0.68V~3.78Vの振幅です。
FFTアナライザ
高調波?との差が36dbほど充分でしょう