JH7UBCブログ

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

MPLABアセンブラ PIC16F1827 AQM0802A表示テスト

2025-01-27 20:55:18 | MPLAB アセンブラ
 久しぶりにMPLABアセンブラによるPICのプログラミングの勉強を再開します。
 MPLAB IDE v9.82, MPASM v5.51, PICKit3の環境で、PIC16F1827のI2C LCD表示器AQM0802Aの表示テストをします。 

 回路図です。AQM0802Aは秋月電子のモジュールを使います。このモジュールにはI2Cプルアップ抵抗が内蔵されています。ICSPでプログラムの書き込みテストをします。電源は、PICKit3から3.3Vを供給します。


 PIC16F1827はMSSPモジュールを2つ持っています。今回はMSSP1を使います。
 クロックは、4MHzとします。
 入出力設定は、I2CのSDAとSCLになるRB1とRB4は、入力に他は出力に設定します。
 I2Cの設定をします。
 まず、SSP1CON1レジスタのbit5 SSP1EN=1,bit3:bit0=1000としてI2C Master Modeに設定します。


 次に、SSP1STAレジスタで、I2Cの速度を設定します。bit7のSMP=1として、I2C Master Modeの時の標準速度100KHzに設定します。
 

 この速度にするために、SSP1ADDレジスタの値を設定します。
 計算式は、ADD=Fosc/(4*clock) - 1
 Fosc=4000000hZ(4MHz),clock=100000Hz(100KHz)とすると
 ADD=4000000/(4*100000) -1 =9 となり、SSP1ADDに9を設定します。


 スタートコンディションとストップコンディションは、SSP1CON2で設定します。

 今回は、単純化して、I2C slaveデバイスからのACKは確認しません。また、slaveデバイスは1個のため、信号の衝突回避もしていません。
 
プログラムです。
----------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; PIC16F1827 AQM0802A TEST
; 2025.1.27
; JH7UBC Keiji Hata
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

              LIST      P=PIC16F1827
              INCLUDE P16F1827.INC
              
              __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF
              __CONFIG _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_OFF & _BORV_19 & _LVP_OFF
              ERRORLEVEL    -302    ;ERRORメッセージ302を表示しない
              
              CBLOCK             020h
              COMMAND
              CHAR
              CNT1ms
              CNTms
              X
              Y
              ENDC
              
;定数定義
              #DEFINE             LCDADD            07Ch      ;AQM0802AのI2Cアドレス
              #DEFINE             LINE1    080h
              #DEFINE             LINE2    0C0h
                            
SETUP
;クロック設定
              BANKSEL           OSCCON
              MOVLW              b'01101000'                       ;PLLなし、4MHz,Fosc
              MOVWF              OSCCON
;入出力設定
              BANKSEL           ANSELA
              CLRF     ANSELA                                          ;AN0-AN4 使用しない
              CLRF     ANSELB                                          ;AN5-AN11使用しない
              BANKSEL           TRISA
              CLRF     TRISA                               ;RA5は入力、他は出力
              MOVLW              b'00010010'                       ;RB1とRB4は入力、他は出力
              MOVWF              TRISB

;I2C初期化
              BANKSEL           SSP1CON1
              MOVLW              b'00101000'                       ;SSPEN=1,I2C Master Mode
              MOVWF              SSP1CON1
              BANKSEL           SSP1STAT
              BSF                      SSP1STAT,SMP  ;標準速度モード(100KHz)
              BANKSEL           SSP1ADD
              MOVLW              09h                                                  ;Fosc/(4*Clock)-1,Clock=100KHz,Fosc=4MHz
              MOVWF              SSP1ADD

;LCD初期化
              MOVLW              028h                                                ;028h=40
              CALL     DELAY_ms                        ;40ms wait
              MOVLW              038h
              CALL     WRITE_COMMAND        ;8bit,2line
              MOVLW              039h
              CALL     WRITE_COMMAND        ;IS=1,extention mode set
              MOVLW              014h
              CALL     WRITE_COMMAND        ;Internal OSC Frequency
              MOVLW              070h
              CALL     WRITE_COMMAND        ;Contrast set
              MOVLW              056h
              CALL     WRITE_COMMAND        ;Power/ICON/Contrast Control
              MOVLW              06Ch
              CALL     WRITE_COMMAND        ;Follower control
              MOVLW              0C8h                                  ;0C8=200
              CALL     DELAY_ms                        ;200ms wait
              MOVLW              038h
              CALL     WRITE_COMMAND        ;IS=0,extention mode cancel
              MOVLW              0Ch
              CALL     WRITE_COMMAND        ;Display ON
              MOVLW              01h
              CALL     WRITE_COMMAND        ;Clear Display
              MOVLW              2
              CALL     DELAY_ms                        ;2ms wait

MAIN
              MOVLW              'J'
              CALL     WRITE_CHARACTER
              MOVLW              'H'
              CALL     WRITE_CHARACTER
              MOVLW              '7'
              CALL     WRITE_CHARACTER
              MOVLW              'U'
              CALL     WRITE_CHARACTER
              MOVLW              'B'
              CALL     WRITE_CHARACTER
              MOVLW              'C'
              CALL     WRITE_CHARACTER
              BANKSEL X
              MOVLW              2            ;CURSORをX=2,Y=1に移動
              MOVWF              X
              MOVLW              1
              MOVWF              Y
              CALL     CURSOR_XY
              MOVLW              'H'
              CALL     WRITE_CHARACTER
              MOVLW              'e'
              CALL     WRITE_CHARACTER
              MOVLW              'l'
              CALL     WRITE_CHARACTER
              MOVLW              'l'
              CALL     WRITE_CHARACTER
              MOVLW              'o'
              CALL     WRITE_CHARACTER
LOOP
              GOTO   LOOP
              
              GOTO   MAIN        
              
;LCDにコマンドを送る
WRITE_COMMAND
              BANKSEL           COMMAND
              MOVWF              COMMAND
              CALL     I2C_START
              MOVLW              LCDADD
              CALL     I2C_WRITE
              MOVLW              00h
              CALL     I2C_WRITE
              MOVFW              COMMAND
              CALL     I2C_WRITE
              CALL     I2C_STOP           
              RETURN
              
;LCDに文字を送る
WRITE_CHARACTER
              BANKSEL           CHAR
              MOVWF              CHAR
              CALL     I2C_START
              MOVLW              LCDADD
              CALL     I2C_WRITE
              MOVLW              40h
              CALL     I2C_WRITE
              MOVFW              CHAR
              CALL     I2C_WRITE
              CALL     I2C_STOP           
              RETURN

;Clear Display
CLEAR_DISPLAY
              MOVLW              01h
              CALL     WRITE_COMMAND
              MOVLW              2
              CALL     DELAY_ms
              RETURN
              
;Return Home
HOME_DISPLAY
              MOVLW              02h
              CALL     WRITE_COMMAND
              MOVLW              2
              CALL     DELAY_ms
              RETURN
              
;カーソルをX,Yにセット
CURSOR_XY
              BANKSEL X
              MOVFW              Y
              IORLW  00h
              BTFSS   W,Z                     ;Y=0ならYOへ Y!=0ならY1へ
              GOTO   Y1
Y0
              MOVLW              LINE1
              ADDWF X,W
              CALL     WRITE_COMMAND
              RETURN
Y1
              MOVLW              LINE2
              ADDWF X,W
              CALL     WRITE_COMMAND
              RETURN
              
;スタートコンディション
I2C_START
              BANKSEL           SSP1CON2
              BSF                      SSP1CON2,SEN
              BTFSC   SSP1CON2,SEN
              GOTO   $-1
              RETURN
              
;ストップコンディション
I2C_STOP
              BANKSEL           PIR1
              BCF                     PIR1,SSP1IF
              BANKSEL           SSP1CON2
              BSF                      SSP1CON2,PEN
              BTFSC   SSP1CON2,PEN
              GOTO   $-1
              BANKSEL           PIR1
              BCF                     PIR1,SSP1IF
              RETURN

;I2Cに1BYTE送信
I2C_WRITE
              BANKSEL           PIR1
              BCF                     PIR1,SSP1IF
              BANKSEL           SSP1BUF
              MOVWF              SSP1BUF
              BANKSEL           PIR1
              BTFSS   PIR1,SSP1IF
              GOTO   $-1
              RETURN
              
;任意のms待つ WREGに1から255をセットしてコールする
DELAY_ms
              BANKSEL           CNTms
              MOVWF              CNTms
LOOP2
              CALL     LOOP1ms
              DECFSZ              CNTms
              GOTO   LOOP2
              RETURN  
              
;1ms待つ
LOOP1ms
              BANKSEL           CNT1ms
              MOVLW              0F9h      ;0F9h=249
              MOVWF              CNT1ms
LOOP1
              NOP
              DECFSZ              CNT1ms,F
              GOTO   LOOP1
              RETURN
              
              END
----------------------------------

 ブレッドボードです。


 1行目に「JH7UBC」2行目(X=2,Y=1)に「Hello」が表示されました。

FQPログ処理プログラム(HSP)

2025-01-24 13:59:25 | アマチュア無線
 ここ1週間おだやかな日が続いています。降雪もなく積雪深は80cmくらいまで沈みました。雪片付けをしなくてもよいので体が楽で、若干余裕ができました。

 そこで、FQP(FCWA CW QSOパーティ)の電子ログの処理プログラムの改良を行いました。このプログラムは、HSP(Hot Soup Prosesser)というBASICに似たインタープリタで作っています。HSPはこちらサイトからダインロードですきます。

 今は様々なプログラム言語があり、いまさらBASICかと思われるかもしれませんが、私たちおじいさんには、BASICなんですよね。(と言いますが、C言語やPythonも使います)インタープリタといっても今はパソコンの速度が上がっていますので、十分速く動作します。

 さて、FQPログ処理プログラムですが、いただいた電子ログ(本文に記載または添付ファイル)をコールサイン名のテキストファイルで保存します。HSPでそのテキストファイルを読み込んで処理をしています。

 実際に提出されてくるログですが、前の記事のようにCTESWINで作成されてたものが69%、logsheetformが11%で合わせると80%になります。これらが問題なく処理できるように注意してプログラミングしました。

 基本的には、提出されたログファイル(テキストファイル)から必要な情報をExcelにコピペします。(手で入力すると誤りの元になります)得点もこの時点で入力します。これがマスターファイルにになります。

 このマスターファイルをプリントアウトして、交信局数、重複交信、無効交信、をチェックし、最終交信時間もチェックします。この時チェック用にHSPで作ったFQP処理プログラムを利用しています。下の図は当局JH7UBCの交信チェックと得点、最終交信時間を表示しているところです。

      
 QSOパーティですので、KCJのコンテストやA1クラブのコンテスのように交信相手局のログと比較して、コールの間違いやコンテストナンバーの間違いなどはチェックしていません。

 この処理プログラムを使っても変な結果が出たり、うまく処理できない場合もあります。その場合は、提出されたログをじっくり見て正しいデータを取り出すようにしてます。

 今後、Pythonでログ処理プログラムを作ってみようかとも思っていますが、いつになることやら・・・・

第16回FCWA CW QSOパーティのまとめ

2025-01-14 22:10:13 | アマチュア無線
 昨年の12月7日(土)に開催しました第16回FCWA CW QSOパーティ(FQP)の結果を1月10日にFCWAのホームページに発表しました。結果は、こちら

 今回のログ提出局は、過去2番目に多い168局でした。(一般部門135局、QRP部門31局、チェックログ2局)
 第1回からのログ提出局の推移は、下のグラフのとおりです。


 エリア別の局数のグラフです。最も多いのは1エリア、最も少ないのは9エリアでした。


 出力別のグラフです。50W以下の局が59%を占めます。本パーティが比較的小出力でも十分楽しめるということですね。


 提出されたログの種類です。CTESTWINでの作成されたJARL形式のログが69%になりました。2位はlogsheetformでした。
 私は、提出されたログのチェック(重複チェックと得点の計算)を自作のプログラムで行っています。CTESTWINとlogsheetformはうまくチェックできるのですが、他のログは、ほぼ手作業になります。勝手なのですが、できればCTESTWINで提出していただけるとありがたいところです。


 ログの提出方法です。96%をE-mailでいただきました。でも、紙ログでもOKです。


 FCWAのホームページには、各局から寄せられたコメントもpdfファイルで掲載していますので、ご覧いただきたいと思います。コメントはこちら

 コメントを読ませていただくと、FQPが恒例行事として認識され各局に楽しんでいただいていることが実感できます。

 今回のコメントで気になったことがあります。FQPはWARCバンドも使用するQSOパーティですので、呼び出しは「CQ FQP」としています。ところが、「CQ TEST」で呼び出しをする局が多数あったようです。特に10MHzでの「CQ TEST」呼び出しは、ひんしゅくをかったようです。注意してほしいところです。次回の規約には「CQ TEST」呼び出しをしないことを追加したいと考えています。

 今回もたくさんの局に参加をいただき、ありがとうございました。今年のFQPにもまたぜひご参加いただきたいと思います。よろしくお願いします。

   FCWA CW QSOパーティ・マネージャー JH7UBC 畠 惠治

大雪です

2025-01-10 17:36:24 | 夢の森から
 こちら喜多方市熱塩加納町は、1月8日(水)から今日まで雪が降り続いています。降雪の量は、8日は30cm、9日が60cm、今日10日が50cmで、積雪深は1mを超えました。

 写真は、今朝の車付近の様子です。昨日きれいにした車の上に新たに50cmの雪が乗っかっています。手前には屋根から落ちた雪がうずたかく積もっています。


 昨年、一昨年と雪の少ない冬を過ごしたので、今年の大雪はこたえます。

 喜多方市では、65歳以上の高齢者家庭には除雪補助券が交付されて、30分あたり490円で機械除雪を業者にやっていただけます。ただ、車の周辺とか軒下とか人力でやらなければならない場所も多く、今回のような降雪の時は除雪に2時間以上かかります。

 除雪は概ね15cm以上の降雪の時にお願いしています。12月は既に7回お願いしました。1月もかなりの回数になると予想しています。

 今年は10年に一度の大雪と言われていました。確かにそのとおり、雪の多い冬になりました。

今年もよろしくお願いします。

2025-01-02 21:22:12 | アマチュア無線
 今日1月2日9:00から7日21:00まで、JARL主催のニューイヤーパーティが開催されえています。
 毎年、午前中に144MHzか430MHzでローカル局20局と交信していたのですが、今年は都合が悪く、夜20時からの参加になりました。

 シャックに入り、ストーブに点火。まずコーヒーを入れて144MHzからワッチを始めました。が、メイン周波数でもサブチャンネルでもニューイヤーパーティらしい信号は聞こえません。「あれ!・・・」VUHFでの交信をあきらめ、HFのCWでの交信に切り替えました。これには、今日は風邪気味で声がでにくいという理由もありました。

 3.5MHz CWでまず2局ほどコールしてから、CQランニングに切り替えました。順調に交信でき、1時間で21局交信することができました。交信いただいた各局、ありがとうございました。

 今回は、Digital Sound CWでCQを送出し、ロギングソフトは、HAMLOGというスタイルで、応答は手打ちです。ところが、日ごろ縦振電鍵ばかり使っているので、パドル操作の下手なこと。途中からすべて縦振電鍵での交信としました。この方がのんびりして、気持ちも伝わって良いような気がします。

 今年の初交信を無事に終えることができました。今年もCW交信を楽しんでいきたいと思います。今年もどうぞよろしくお願いします。