goo blog サービス終了のお知らせ 

JH7UBCブログ

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

MPLAB アセンブラ PIC16F648A LED点滅

2024-10-16 17:27:04 | MPLAB アセンブラ
 先日、私のホームページ(JH7UBCホームページ)を見た方(アマチュア無線家)から質問のメールをいただきました。ホームページに掲載しているPIC16F628A+PIC16F883周波数カウンタの周波数測定部を使いたいと思いMPLAB IDEでアセンブル(Make)しようと思ったが、エラーが出てうまくいかない、原因を教えてほしいというものでした。

 そこで、当ブログに掲載している「今更、アセンブラ」シリーズの記事を参考にしてプロジェクトの作成から行っていただいたところ、うまくMakeできたとのことでした。

 続いて、PICにプログラムを書き込む段階でまたトラブルを生じたとのこと。PICKit3がPIC(PIC16F628A)を認識しないとのことでした。このトラブルは私もしばしば経験します。PICへの電源供給とUSBケーブルを何度か抜き差しすることにより解決できました。その後、書き込みができたとの報告メールをいただきました。

 そういえば、MPLAB IDEとアセンブラを使うのは、ほんとうに久しぶりです。この周波数カウンタを製作したのが2017年でした。MPLABもアセンブラもだいぶ忘れてきました。10年前のノートを見て思い出すことにしました。


 手元にあるPIC16F648Aを使って、MPLAB IDE v8.92 MPASM v5.51の環境で、基本的なプログラミングの復習をすることにしました。

 PIC16F648Aですが、すでにレガシーPICと言われる古いタイプのPICですですが、内蔵クロックを持っており、一応基本的な機能を持っていますので、PICの勉強には適していると思います。

 やはり、最初はLチカ(LED点滅)をやってみましょう。テスト用の回路図です。ライタはPICKit3で、電源はPICKit3から供給し、ICSPでPICをセットしたままプログラミングします。



 クロックは、内蔵クロック(デフォルトの4MHz)を使い、RB0に接続したLEDを0.5秒ごとに点滅します。0.5秒タイマーはプログラムで作ります。
 アセンブルリストです。
----------------------------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; PIC16F648A LED Blink
; 2024 10 16
; JH7UBC Keiji Hata
; 内部クロック4MHz
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

              LIST P=PIC16F648A
              INCLUDE P16F648A.INC
              
              __CONFIG _INTOSC_OSC_NOCLKOUT & _CP_OFF & _CPD_OFF & _WDTE_OFF & _PWRTE_ON & _BOREN_OFF & _LVP_OFF & _MCLRE_OFF

;レジスタ
              CBLOCK             020h
              CNT_1ms
              CNT_250ms
              ENDC

;入出力設定           
              BSF        STATUS,RP0      ;BANK1
              CLRF     TRISA                 ;PORTAはすべて出力、ただし、RA5は入力
              CLRF     TRISB                 ;PORTBはすべて出力
              BCF        STATUS,RP0      ;BANK0
              MOVLW              b'00000111'
              MOVWF              CMCON                            ;コンパレータOFF
              
              #DEFINE LED    PORTB,0
              
MAIN
              BSF       LED                     ;LED ON
              CALL     LOOP250mS       ;0.5s待つ
              CALL     LOOP250mS
              BCF       LED                      ;LED OFF
              CALL     LOOP250mS       ;0.5s待つ
              CALL     LOOP250mS
              GOTO   MAIN

;0.25s待つルーチン
LOOP250mS
              MOVLW              0FAh                    ;0FAh=250
              MOVWF              CNT_250ms
LOOP2
              CALL     LOOP1mS
              DECFSZ              CNT_250ms
              GOTO   LOOP2
              RETURN

;1ms待つルーチン
LOOP1mS
              MOVLW              0F9h                    ;0F9h=249
              MOVWF              CNT_1ms
LOOP1
              NOP
              DECFSZ              CNT_1ms,F
              GOTO   LOOP1
              RETURN
              
              END
              
----------------------------------------------------------
 タイマールーチンは、「PICで遊ぶ電子工作」というサイトのこちらのページを参考にさせていただきました。

 Programmerは、PICKit3を選択し、PICに供給する電源は、MPLABで、Programmer→Srttingでダイヤログを開き、Powerタグをクリックして、下のように設定します。


 PICをPICKit3にセットして、パソコンのUSBに接続するとIDEはPICKit3の接続を認識し、PICのID Noも表示されます。PICを認識しなかったり、品種が違う場合はエラーがでます。PICの品種をうまく認識しない場合は、USBを何度か抜き差しすると認識します。それにしても、MPLABとPICKit3の相性は良くありません。どうしてもうまく書き込みができない場合は、PICerFTの利用をお勧めします。

 ブレッドボードとICSP接続の様子です。左上の電源監視用の黄色いLEDが点灯し、左下の青いLEDが0.5秒ごとに点滅しました。



今更、MPLAB アセンブラ #7(ロジックアナライザー)

2023-05-13 22:39:39 | MPLAB アセンブラ
 MPLAB IDEのロジックアナライザーを使ってみます。

 MPLABは、#6のようにDebuggerモードにします。
 アナライザーは、クロック(命令サイクル)に同期しますので、まず、クロック周波数を合わせます。

 メニューの「Debugger」の「Setting」画面で
「OSC/Trace」のタグを開き、「Processer Frequency」をPICのクロック周波数にします。今回は10MHzとします。「OK」をクリックして、セットします。


 「Veiw」から「Simulator Logic Analyzer」をクリックして、ロジックアナライザーウインドウを表示します。



 次に上の画面の「Channels」をクリックして、「Configure Channels」画面で、モニタするポートを設定します。左側のポート記号をAddをクリックして選びます。今回はRB1を選びました。


 下の図のようにソースリストを修正して、MAINルーチンで、RB1が0と1を繰り返すようにしました。


 シミュレータ・アイコンの「Step Into」をクリックするたびにRB1の値が上の図のように表示されます。

 このように、シミュレータとロジックアナライザーを使いながらブログラムが正しく動作するかどうか、実際の回路を組まなくとも確認することができます。

今更、MPLAB アセンブラ #6(シミュレータ)

2023-05-12 20:01:43 | MPLAB アセンブラ
 MPLABのシミュレータを使ってみます。

 MPLAB IDEのメニューの「Debugger」から「Select Tool」を開き、「MPLAB SIM」を選びます。

 

 メニューアイコンに

 が表示され、シミュレーションが可能になります。

メニューの「View」を開き、「Program Memory」「Special Function Registers(SFR)」「File Registers」「Watch」などのウインドウを開きます。


 シミュレータの操作はアイコンで行います。


 連続してプログラムを実行するには「RUN」をゆっくり実行するには「Animate」をクリックします。
 1ステップずつ実行す時は、「Step Into」をクリックします。サブルーチンを1つの命令のように実行していく場合は、「Step Over」をクリックします。
 Step Intoでサブルーチンに入ったあと、一気にサブルーチン内の命令を実行して元に戻るときには、「Step Out」をクリックします。

 プログラムを最初から実行し直す場合は、「Reset」をクリックします。
 ソースリストの指定したい行でダブルクリックするとBreak Pointが設定され、RUNの途中でこのポイントで止まります。

 以上の操作をうまく使いながら、各レジスタや変数の値などを確認してデバッグを進めます。


今更、MPLAB アセンブラ #5(ブレッドボードで動作テスト)

2023-05-11 09:47:20 | MPLAB アセンブラ
 #4でHEXファイルのPICへの書き込みができましたので、ブレッドボードで動作テストをします。

 再度、回路図です。



 ブレッドボードです。


 5Vの電源を加えて、左側にあるスイッチを押すと


 LEDが点灯しました。動作OKです。

 うまく動作しない場合は、ソースリストを点検し、エラーがあれば修正します。

 このように、ブレッドボードで動作を確認することができますが、MPLABにはシミュレーション機能があり、IDE上で動作を確認することができます。次回はそれをやってみましょう。

今更、MPLAB アセンブラ #4(HEXファイルのPICへの書き込み)

2023-05-10 23:17:41 | MPLAB アセンブラ
 前回の記事でアセンブラ・ソースリストをbuildすることができました。

 生成されたHEXファイルをPICに書き込みます。
 まず、定番のプログラマ(PICライタ)であるPICKit3を使ってみます。
 メニューの「Programmer」の「Select Programmer」から「PICKit3」を選びます。


 USBポートにPICKit3を接続し、ターゲットPIC(今回は、PIC16F84A)をソケットにセットします。


 ところが、次のように表示され、PICKit3と接続できるのですが、PIC16F84Aを認識しません。


 USBコネクタを抜いたりさしたりしたのですが、うまくいきません。
 MPLABとPICKit3の相性が悪いことはPICに師匠から聞いていたのですが、ほんとうのようです。MPLABもPICKit3も32bit OS用のため? 私のPICKit3が純正品でないため? ・・・・・・・
(うまくいった方は、書き込みアイコンをクリックすると書き込みが行われます。)

 それでは、と必殺のPICerFTで書き込むことにします。(製作記事はこちら


 この時点で、MPLAB IDEは閉じてしまってOKです。

 PICerFTのアイコンをダブルクリックしてPICerFTのアプリを立ち上げます。
   

 「Connect」をクリックして、PICerFTと接続します。続いて、「Detect」をクリックすると確かにPIC16F84Aと認識しました。

 ドキュメントのMPLABというフォルダにある書き込むHEXファイル(今回は、PIC16F84A.HEX)をPICerFTのダイアログにドラッグアンドドロップすると書き込みが始まり、数秒で書き込むことができました。めでたし、めでたし。