JH7UBCブログ

アマチュア無線 電子工作 家庭菜園など趣味のブログです

MPLABアセンブラ PIC16F648A USARTテスト

2024-10-29 19:22:30 | MPLAB アセンブラ
 MPLAB IDE v8.92 MPASM v5.51 PICKit3の環境で、PIC16F648AのUSART(Universal Synchronous Asynchronous Receiver Transmitter)の使い方を勉強します。今回は、PICとパソコンの間で通信テストをします。

 回路図です。今回もICSPでテストを行います。PIC16F648AのUSARTの入出力は、入力RXが7ピン(RB1)、出力TXが8ピン(RB2)に設定されています。RX,TXとも入力に設定します。ここにUSBシリアル変換モジュールFT234を接続します。FT234の入出力は3.3Vですが、入力は5Vトレラント(耐性)なので、直接接続しても大丈夫です。


 パソコン側は通信ソフトTeraTermを使います。SWを押したら文字「Hello World!」を送出するプログラムを組みます。

 PICとパソコンの間の通信プロトコルを決めます。非同期モードで、通信速度は9600bpsとします。これらの設定は、TXSTAとRCSTAレジスタで行います。
 まず、TXSTAレジスタでは、bit4のSYNCはデフォルト0(非同期),bit2のBRGHは1(高速モード)とし、bit5のTXENは1(送信可)とします。TXSTA=b'00100100'=024h


 次にRCSTAレジスタは、bit7のSPENは1(シリアル)とし、bit4のCRENは1(継続受信可)とします。RCSTA=b'10010000'=090h

 通信速度(Baud Rate)の設定は、SPBRGで行います。
 BRGH=1の時は、次の式で設定値xを計算します。
 Baud Rate=Fosc/16(x+1)
 x = Fosc/(16*Baud Rate) -1
 クロック周波数Fosc=4MHz=4000000Hz
 Baud Rate = 9600bps
 とすると
 x=4000000/(16*9600) - 1 = 25 = 019h
 となり、エラーは0.16%です。

 プログラムです。PICのプログラムでやっかいなのが、SFRのBANK指定です。PIC16F648Aの場合、BANK0からBANK3ですので、それほどではありませんが、BANKSELというマクロ命令を使うとSFRに対するBANKを自動的に設定してくれます。
 ERRORLEVEL -302は、エラー番号302のエラー表示をしないようにするマクロ命令です。

-----------------------------------------------------
              LIST      P=PIC16F648A
              INCLUDE           P16F648A.INC
              
              __CONFIG _INTOSC_OSC_NOCLKOUT & _CP_OFF & _CPD_OFF & _WDTE_OFF & _PWRTE_ON & _BOREN_OFF & _LVP_OFF & _MCLRE_OFF
            ERRORLEVEL -302
;入出力設定
              BANKSEL           TRISA
              MOVLW              b'00100001'
              MOVWF              TRISA                 ;RA0とRA5は入力、他は出力
              MOVLW              b'00010110'
              MOVWF              TRISB                 ;RB1,RB2は入力、他は出力
              BANKSEL           CMCON
              MOVLW              b'00000111'
              MOVWF              CMCON                            ;コンパレータOFF
              
;USART設定
              BANKSEL           TXSTA
              MOVLW              b'00100100'
              MOVWF              TXSTA                ;非同期モード、高速通信モード
              MOVLW              019h                    ;
              MOVWF              SPBRG                ;4MHz,9600bps
              BANKSEL           RCSTA
              MOVLW              090h
              MOVWF              RCSTA                ;受信可、非同期モード
              
MAIN
              BANKSEL           PORTA
              BTFSC   PORTA,0                          ;RA0=0ならスキップ
              GOTO   MAIN
              MOVLW              "H"
              CALL     SENDCHR
              MOVLW              "e"
              CALL     SENDCHR
              MOVLW              "l"
              CALL     SENDCHR
              MOVLW              "l"
              CALL     SENDCHR
              MOVLW              "o"
              CALL     SENDCHR
              MOVLW              " "
              CALL     SENDCHR
              MOVLW              "W"
              CALL     SENDCHR
              MOVLW              "o"
              CALL     SENDCHR
              MOVLW              "r"
              CALL     SENDCHR
              MOVLW              "l"
              CALL     SENDCHR
              MOVLW              "d"
              CALL     SENDCHR
              MOVLW              "!"
              CALL     SENDCHR
              MOVLW              " "
              CALL     SENDCHR
              
              GOTO   MAIN
              
SENDCHR
              BANKSEL           TXSTA
              BTFSS   TXSTA,TRMT     ;送信可能かチェック(1:可 0:禁止)
              GOTO   $-1
              BANKSEL           TXREG
              MOVWF              TXREG
              RETURN
              
              END
-----------------------------------------------------

ブレッドボードです。ICSPで書き込みます。


 SWを押すとTeraTermに「Hello World!」がSWを押している間表示されました。


 これで送信機能は確認できました。次に受信機能を確認します。同じ回路で、Tera Termから送信された文字を受信して送り返すエコーバックをやってみます。
 プログラムです。
----------------------------------------------------
              LIST      P=PIC16F648A
              INCLUDE P16F648A.INC
              __CONFIG _INTOSC_OSC_NOCLKOUT & _CP_OFF & _CPD_OFF & _WDTE_OFF & _PWRTE_ON & _BOREN_OFF & _LVP_OFF & _MCLRE_OFF
              ERRORLEVEL    -302
              
;入出力設定
              BANKSEL           TRISA
              CLRF     TRISA                 ;PORTAはすべて出力、ただし、RA5は入力
              MOVLW              b'00010110'
              MOVWF              TRISB                 ;RB1,RB2は入力、他は出力
              BANKSEL           CMCON
              MOVLW              b'00000111'
              MOVWF              CMCON                            ;コンパレータOFF

;USART設定
              BANKSEL           TXSTA
              MOVLW              b'00100100'
              MOVWF              TXSTA                ;非同期モード、高速通信モード
              MOVLW              019h                    ;
              MOVWF              SPBRG                ;4MHz,9600bps
              BANKSEL           RCSTA
              MOVLW              090h
              MOVWF              RCSTA                ;受信可、非同期モード

MAIN
              CALL     GETCHR                           ;1文字受信
              CALL     SENDCHR                        ;1文字送信
              GOTO   MAIN
              
;1文字受信
GETCHR
              BANKSEL           PIR1
              BTFSS   PIR1,RCIF           ;RCIF=1ならスキップ
              GOTO   $-1
              BANKSEL           RCREG
              MOVFW              RCREG
              RETURN
              
;1文字送信
SENDCHR
              BANKSEL           TXSTA
              BTFSS   TXSTA,TRMT     ;送信可能かチェック(1:可 0:禁止)
              GOTO   $-1
              BANKSEL           TXREG
              MOVWF              TXREG
              RETURN
              
              END
----------------------------------------------------


パソコンのキーボードを押した文字がPICに送信され、PICから送り出された文字がTera Termに表示されます。


ストレートキーコンテスト終了

2024-10-28 17:27:20 | アマチュア無線
 昨日10月27日(日)15:00~2100に第9回A1 CLUB STRAIGHT KEY コンテスト が開催されました。

 当局JH7UBCは、今年もフル参戦しました。このコンテストは7MHzと3.5MHzの2バンドが使用され、QSYルール(CQを出して交信した局は、次にCQを出す場合は約1KHz以上離れた周波数でCQを出す。つまり、同じ周波数でCQを出し続けることはできません)が適応されます。

 いつものように、7MHzから交信を始めました。コンディションはまずまずです。たくさんの局が出ているときには、CQを出している局をコールして交信して、次に自局がCQを出し、交信が終わったら次のCQを探して交信するという交信方法が最も効率的だと思います。ただ、CQ局を複数局がコールして、負けてしまった場合、1交信待つことになります。負け続けると、ちょっと嫌になってしまいますね。

 バンド内をCQ局を探して、周波数を上げたり下げたりして交信を続けました。しばらくするとCQ局がほとんど交信した局になってきます。この辺から空き周波数を探して、CQを出していくことになります。

 約2時間ごとに休憩(コーヒーブレーク)しながら、17時まで7MHzで交信を続けました。ちょっとお腹がすいたので、カップヌードルをお腹に流し込んで、コンテストを再開。

 18時からは、3.5MHzで交信を始めました。バンドスコープで見ると7MHzに比べ出ている局が少ないと思いました。こちらもコンディションはまずまずです。一通り呼び回った後はCQを出し始めました。

 20時頃までは、順調に交信できたのですが、CQを出しても呼ばれなくなってきました。例年より3.5MHzでの参加局が少ないという感じがしました。

 そこで、7MHzに戻ってみると、さすがサイクル25のピークですね。まだ聞こえます。呼び回りとCQで何局か交信したところで、タイムアウト。

 スコアは、昨年には及びませんでしたが、縦振電鍵での交信を十分に楽しむことができました。交信いただいた各局ありがとうございました。

 次は、私がマネージャーを務める12月7日(土)9:00~21:00の第16回FCWA CW QSOパーティです。規約はこちら。各局ふるってご参加ください。

10月27日(日)は、ストレートキーコンテスト

2024-10-25 19:31:30 | アマチュア無線
 来る10月27日(日)15:00~21:00に第9回 A1 CLUB STRAIGHT KEY コンテストが開催されます。規約はこちら

 このコンテスは、縦振電鍵などの単一接点のキーを用いるユニークなコンテストです。当局JH7UBCは、このコンテストの前身のLet's A1コンテストに2011年から参加し、最高順位は2位です。

 昨年度は、6位(東北地区1位)でした。今年も頑張って参加したいと思います。衆議院議員選挙と重なってしまいましたが、期日前投票を済ませましたので、ゆっくりとコンテストを楽しみたいと思います。CWをやられている方、ぜひご参加を。

今日の畑

2024-10-24 10:11:32 | 家庭菜園と花
 10月も下旬になりましたが、比較的暖かい日が続いています。

 昨日の畑の様子です。


 コマツナとチンゲンサイは、もうすぐ収穫が終わります。今年の出来はまずまずですが、暖かいせいか、やや間延びした感じです。


 シュンギクとホウレンソウは一日おきに収穫しています。


 オータムポエムも収穫できるようになりました。例年より若干早めです。


 トマトは、まだ実をつけているのですが、気温が下がったのでなかなか赤くなりません。もう赤くならないかもしれません。



 

MPLABアセンブラ PIC16F648A PWM テスト

2024-10-22 16:00:06 | MPLAB アセンブラ
 MPLAB IDE v8.92 MPASM v5.51 PICKit3の環境で、PIC16F648AのPWM(Pulse Width Modulation)の使い方を勉強します。

 このPICでPWMを出力するには、CCP1モジュールを使います。PWMのブロックダイアグラムです。(PIC16F648Aの取説より)


 PWM信号発生の原理は、私のホームページ(JH7UBCホームページ)のこちらのページで説明していますので、参照してください。

 PWM信号は下の図のようにPWM PeriodとDuty Cycleで決まり、それぞれ下の式のように、PR2,Tosc,TMR2 prescale value,CCP1RL,CCP1CON<5:4>で計算できます。



 例として、1000Hz,デューティ比50%のPWM信号を発生させてみます。
クロックは、内蔵クロック4MHz(4000000Hz)とし、TMR2 prescale valueは4(1:4)とします。

 以上の値でPR2の値を計算すると
 PR2 =( 4000000 / 1000 ・4・4) - 1 = 249
 デューティ比50%なので、CCPRL1=(RP2+1)・0.5=125 となります。

 これらの値でプログラミングするわけですが、それぞれのレジスタ(SFR)に値をセットするときに注意しなければならないのがBANK切り替えです。
 PIC16F648AのBANKマップは次のようになっていますので注意します。


 プログラムです。
------------------------------------------
              LIST      P=PIC16F648A
              INCLUDE           P16F648A.INC
              
              __CONFIG _INTOSC_OSC_NOCLKOUT & _CP_OFF & _CPD_OFF & _WDTE_OFF & _PWRTE_ON & _BOREN_OFF & _LVP_OFF & _MCLRE_OFF
              
;入出力設定
      BSF                      STATUS,RP0      ;BANK1
     CLRF            TRISA                 ;PORTAはすべて出力、ただし、RA5は入力
     CLRF            TRISB                 ;PORTBはすべて出力
     BCF                            STATUS,RP0      ;BANK0
     MOVLW       b'00000111'
     MOVWF       CMCON                            ;コンパレータOFF
;PWM設定
              MOVLW              b'00001100'
              MOVWF              CCP1CON                         ;PWMモード
              MOVLW              b'00000101'
              MOVWF              T2CON               ;TMR2 ON,プリスケーラ1:4      
              BSF                      STATUS,RP0      ;BANK1               
              MOVLW              0F9h                    ;249
              MOVWF              PR2

;カウンタ、レジスタ初期値
              BCF                     STATUS,RP0      ;BANK0
              CLRF     CCPR1L
              CLRF     CCPR1H
              CLRF     TMR2
                            
;デューティサイクルセット
              MOVLW              07Dh                    ;デューティ比50% 250/2=125=07Dh
              MOVWF              CCPR1L 

LOOP
              GOTO LOOP
     END
------------------------------------------
 テストした回路図です。



 アセンブルしてPICにプログラムを書き込むと、PWM信号は、RB3から出力されます。

 出力されたPWM信号をPicoScopeで見てみました。約1000Hz(周期約1ms)でデューティ比50%の信号が確かに出力されました。


 周波数を測定してみました。1028Hzで若干高めの周波数が出力されました。内部クロックの誤差と思われます。


 CCPR1Lの値をPR2の1/4(25%)にした時のPWM波形です。


 デューティ比25%のPWM信号が出力されました。

 次に、500Hz、デューティ比50%の信号を発生させてみましょう。
 TMR2のプリスケーラ値が4のままですと、PR2の値が255を超えてしまいますので、プリスケーラ値を16とします。プリスケーラ値を決めるのは、T2CONレジスタのbit1とbit0で、これを11とします。つまり
  MOVWL    b'00000111'
       MOVWF    T2CON
とします。PR2とCCP1RLの値は
 PR2 =( 4000000 / 500 ・4・16) - 1 = 124
 CCP1RL = (PR2+1)・0.5 = 62 となります。



 512HzのPWMが出力されました。