目次>5章 第2ステップ(色々な実験)>正弦波を作る>ソース

正弦波を作る(ソース)

更新日2006.10.28

以下のソースを取り込んで、アセンブル→PIC書き込み→実行して下さい。

; ========================== ここから ==============================
;	ラダー回路によりD/A変換し正弦波を出力する
;
;	PIC16F84A
;	CLOCK : 20MHz
;	PORTB : OUT ラダー回路(D/A変換で正弦波を出力)
;

	LIST	P=PIC16F84A
	INCLUDE	P16F84A.INC
	__CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF

save_st	EQU	010h		;STATUSのセーブ
save_w	EQU	011h		;W-regのセーブ
cnti	EQU	012h
cnt	EQU	013h
ix	EQU	014h

	ORG	0
	GOTO	init

	ORG	4		;割込みの入口
	; 割込みは使用しない


; ●===== 初期処理 =====
init
	BSF	STATUS,RP0	;■バンク1に切替え
	MOVLW	01Fh
	MOVWF	TRISA		;PORTAは入力
	CLRF	TRISB		;PORTBは出力
	MOVLW	00h		;RA4/T0CKI未使用
	MOVWF	OPTION_REG
	BCF	STATUS,RP0	;■バンク0に切替え
	CLRF	PORTB		;PORTBをクリア


;  ===== メイン処理 =====
	MOVLW	0Fh
	ANDWF	PORTA,W		;PORTAのRA0〜RA3を読み出す
	CALL	cntiset		;RA0〜RA3の設定値から波長(ループカウンタ)をセット
	MOVWF	cnti

	BTFSC	PORTA,4		;RA4は?
	GOTO	DIV64		;ON:64分割
	GOTO	DIV128		;OFF:128分割

;  <64分割の処理>
DIV64
	CLRF	ix
LP64
	BSF	ix,6	; 1 1	分割数64をセット
LP64_1
	MOVF	ix,W	; 1 1	現在の分割数で
	CALL	get64	; 5 5	出力値を得て
	MOVWF	PORTB	; 1 1	PORTBに出力

	MOVF	cnti,W	; 1 1	ループ回数を
	MOVWF	cnt	; 1 1	設定し
LP64_2
	DECFSZ	cnt,F	; 1 2	一定回数
	GOTO	LP64_2	; 2 0	ループする

	DECFSZ	ix,F	; 1 2	1サイクル終了?
	GOTO	LP64_1	; 2 2	No  途中に戻る
	GOTO	LP64	; 2 2	Yes 先頭に戻る


;  <128分割の処理>
DIV128
	MOVLW	01h
	MOVWF	PCLATH

	CLRF	ix
LP128
	BSF	ix,7	; 1 1	分割数128をセット
LP128_1
	MOVF	ix,W	; 1 1	現在の分割数で
	CALL	get128	; 5 5	出力値を得て
	MOVWF	PORTB	; 1 1	PORTBに出力

	MOVF	cnti,W	; 1 1	ループ回数を
	MOVWF	cnt	; 1 1	設定し
LP128_2
	DECFSZ	cnt,F	; 1 2	一定回数
	GOTO	LP128_2	; 2 0	ループする

	DECFSZ	ix,F	; 1 2	1サイクル終了?
	GOTO	LP128_1	; 2 2	No  途中に戻る
	GOTO	LP128	; 2 2	Yes 先頭に戻る


;  ===== 周期カウント設定 =====
cntiset
	ADDWF	PCL,f

	RETLW	d'1'
	RETLW	d'2'
	RETLW	d'3'
	RETLW	d'4'
	RETLW	d'5'
	RETLW	d'6'
	RETLW	d'7'
	RETLW	d'9'
	RETLW	d'11'
	RETLW	d'16'
	RETLW	d'21'
	RETLW	d'30'
	RETLW	d'50'
	RETLW	d'81'
	RETLW	d'125'
	RETLW	d'255'


;  ===== SIN 64分割=====
get64
	ADDWF	PCL,f

	RETLW	d'0'	;DUMMY
	RETLW	d'128'	;0
	RETLW	d'140'	;1
	RETLW	d'153'	;2
	RETLW	d'165'	;3
	RETLW	d'177'	;4
	RETLW	d'188'	;5
	RETLW	d'199'	;6
	RETLW	d'209'	;7
	RETLW	d'218'	;8
	RETLW	d'226'	;9
	RETLW	d'234'	;10
	RETLW	d'240'	;11
	RETLW	d'245'	;12
	RETLW	d'250'	;13
	RETLW	d'253'	;14
	RETLW	d'254'	;15
	RETLW	d'255'	;16
	RETLW	d'254'	;17
	RETLW	d'253'	;18
	RETLW	d'250'	;19
	RETLW	d'245'	;20
	RETLW	d'240'	;21
	RETLW	d'234'	;22
	RETLW	d'226'	;23
	RETLW	d'218'	;24
	RETLW	d'209'	;25
	RETLW	d'199'	;26
	RETLW	d'188'	;27
	RETLW	d'177'	;28
	RETLW	d'165'	;29
	RETLW	d'153'	;30
	RETLW	d'140'	;31
	RETLW	d'128'	;32
	RETLW	d'116'	;33
	RETLW	d'103'	;34
	RETLW	d'91'	;35
	RETLW	d'79'	;36
	RETLW	d'68'	;37
	RETLW	d'57'	;38
	RETLW	d'47'	;39
	RETLW	d'38'	;40
	RETLW	d'30'	;41
	RETLW	d'22'	;42
	RETLW	d'16'	;43
	RETLW	d'11'	;44
	RETLW	d'6'	;45
	RETLW	d'3'	;46
	RETLW	d'2'	;47
	RETLW	d'1'	;48
	RETLW	d'2'	;49
	RETLW	d'3'	;50
	RETLW	d'6'	;51
	RETLW	d'11'	;52
	RETLW	d'16'	;53
	RETLW	d'22'	;54
	RETLW	d'30'	;55
	RETLW	d'38'	;56
	RETLW	d'47'	;57
	RETLW	d'57'	;58
	RETLW	d'68'	;59
	RETLW	d'79'	;60
	RETLW	d'91'	;61
	RETLW	d'103'	;62
	RETLW	d'116'	;63


;  ===== SIN 128分割=====
	ORG	0100h
get128
	ADDWF	PCL,f

	RETLW	d'0'	;DUMMY
	RETLW	d'128'	;0
	RETLW	d'134'	;1
	RETLW	d'140'	;2
	RETLW	d'147'	;3
	RETLW	d'153'	;4
	RETLW	d'159'	;5
	RETLW	d'165'	;6
	RETLW	d'171'	;7
	RETLW	d'177'	;8
	RETLW	d'182'	;9
	RETLW	d'188'	;10
	RETLW	d'193'	;11
	RETLW	d'199'	;12
	RETLW	d'204'	;13
	RETLW	d'209'	;14
	RETLW	d'213'	;15
	RETLW	d'218'	;16
	RETLW	d'222'	;17
	RETLW	d'226'	;18
	RETLW	d'230'	;19
	RETLW	d'234'	;20
	RETLW	d'237'	;21
	RETLW	d'240'	;22
	RETLW	d'243'	;23
	RETLW	d'245'	;24
	RETLW	d'248'	;25
	RETLW	d'250'	;26
	RETLW	d'251'	;27
	RETLW	d'253'	;28
	RETLW	d'254'	;29
	RETLW	d'254'	;30
	RETLW	d'255'	;31
	RETLW	d'255'	;32
	RETLW	d'255'	;33
	RETLW	d'254'	;34
	RETLW	d'254'	;35
	RETLW	d'253'	;36
	RETLW	d'251'	;37
	RETLW	d'250'	;38
	RETLW	d'248'	;39
	RETLW	d'245'	;40
	RETLW	d'243'	;41
	RETLW	d'240'	;42
	RETLW	d'237'	;43
	RETLW	d'234'	;44
	RETLW	d'230'	;45
	RETLW	d'226'	;46
	RETLW	d'222'	;47
	RETLW	d'218'	;48
	RETLW	d'213'	;49
	RETLW	d'209'	;50
	RETLW	d'204'	;51
	RETLW	d'199'	;52
	RETLW	d'193'	;53
	RETLW	d'188'	;54
	RETLW	d'182'	;55
	RETLW	d'177'	;56
	RETLW	d'171'	;57
	RETLW	d'165'	;58
	RETLW	d'159'	;59
	RETLW	d'153'	;60
	RETLW	d'147'	;61
	RETLW	d'140'	;62
	RETLW	d'134'	;63
	RETLW	d'128'	;64
	RETLW	d'122'	;65
	RETLW	d'116'	;66
	RETLW	d'109'	;67
	RETLW	d'103'	;68
	RETLW	d'97'	;69
	RETLW	d'91'	;70
	RETLW	d'85'	;71
	RETLW	d'79'	;72
	RETLW	d'74'	;73
	RETLW	d'68'	;74
	RETLW	d'63'	;75
	RETLW	d'57'	;76
	RETLW	d'52'	;77
	RETLW	d'47'	;78
	RETLW	d'43'	;79
	RETLW	d'38'	;80
	RETLW	d'34'	;81
	RETLW	d'30'	;82
	RETLW	d'26'	;83
	RETLW	d'22'	;84
	RETLW	d'19'	;85
	RETLW	d'16'	;86
	RETLW	d'13'	;87
	RETLW	d'11'	;88
	RETLW	d'8'	;89
	RETLW	d'6'	;90
	RETLW	d'5'	;91
	RETLW	d'3'	;92
	RETLW	d'2'	;93
	RETLW	d'2'	;94
	RETLW	d'1'	;95
	RETLW	d'1'	;96
	RETLW	d'1'	;97
	RETLW	d'2'	;98
	RETLW	d'2'	;99
	RETLW	d'3'	;100
	RETLW	d'5'	;101
	RETLW	d'6'	;102
	RETLW	d'8'	;103
	RETLW	d'11'	;104
	RETLW	d'13'	;105
	RETLW	d'16'	;106
	RETLW	d'19'	;107
	RETLW	d'22'	;108
	RETLW	d'26'	;109
	RETLW	d'30'	;110
	RETLW	d'34'	;111
	RETLW	d'38'	;112
	RETLW	d'43'	;113
	RETLW	d'47'	;114
	RETLW	d'52'	;115
	RETLW	d'57'	;116
	RETLW	d'63'	;117
	RETLW	d'68'	;118
	RETLW	d'74'	;119
	RETLW	d'79'	;120
	RETLW	d'85'	;121
	RETLW	d'91'	;122
	RETLW	d'97'	;123
	RETLW	d'103'	;124
	RETLW	d'109'	;125
	RETLW	d'116'	;126
	RETLW	d'122'	;127


	END
; =========================== ここまで ===============================