目次>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 ; =========================== ここまで ===============================