5.EE−PROMの読み書きについて

 

 ここでは、PIC16F88のEE−PROMについて解説します。 EE−PROMは一度書き込むと、プログラム・メモリと同じように電源を落としても消滅することはなく、かつプログラムで簡単に読み書きできる特徴をもっています。   16F88のEE−PROMは256バイトと非常に少ないのですが、電源を落としても、残したい設定情報やログ情報等はEE−PROMに格納しましょう。

 例えば、5分毎に温度の測定し、その結果を時刻情報と一緒にEE−PROMに収納し、あとで読み出してホストに転送してEXCELでグラフを表示するようなアプリケーションに利用できそうですね。

当工房では、設定情報の格納に使っていますので、以下その方法を実際のコーディング例で説明します。

 

5.1 EE−PROMを利用した設定情報の読み書き

 複数のモードに切り替えてプログラムを実行したい場合、一般的にはディップSWやロータリーSWをマイコンのポートに接続して、その読み取り値をもとに、プログラムがそのモードで実行できるようにコーディングします。

16F88のように使えるポートの数が少ないと、例えば表示器等に多く使うと残りポートに余裕がなくなり、ディップSWやロータリーSWに割り当てできません。 そこで、当工房ではこの様な場合、1つのポートを使ったプッシュSWで代用しています。

 例えば、プッシュSWを長押しすると通常モードからモード選択機能が作動するようにし、表示器にモード名を順次表示させ、選びたい表示のところでプッシュSWを押すことでモードを決定する方法を使って、ピンの不足をカバーします。 ただ、この場合ディップSWやロータリーSWと違って電源を落とすとその設定情報は消えてしまい、電源を入れるたびに再設定が必要になります。 そこで登場するのがEE−PROMに格納する方法です。

 

5.2 コーディング例

ここで紹介するコーディング例はメインルーティンの中で通常処理を行っているときにプッシュSWを1秒以上長押しされた場合、複数のLEDを1秒間隔で順次点灯させ、設定したいLEDが点灯した時、プッシュSWを短く押すと、そのカウント値を設定値としてCFLAGエリアとEE−PROMの0番地に収納する簡単なものです。

収納した設定値は電源を入れる度に、メインルーチンに入る前の初期設定ルーチンでEE−PROMの0番地から読み出し、CFLAGエリアに書き込んだ後、メインルーティンで参照して、プログラムの動き方を決定します。

;

;*******************************************

;  Select Mode

;*******************************************

四角形吹き出し: 通常処理の中で、プッシュSWが1秒以上長押しされると、このサブルーチンに入る。
入ると、すぐ全てのLEDを点灯させ、モード選択処理に入ったことを操作者に知らせる。
;

MODESEL

                            MOVLW              0FFH                                 ;light on all LEDs

                            MOVWF              PORTB                             ;

                            CALL                   T1SEC                               ;wait for 1 sec.

                            CLRF                   PORTB                              ;light off all LEDs

                            CALL                   T1SEC                               ;wait for 1 sec.

;***************

;MODE1

四角形吹き出し: 1番目のLEDを約1秒点灯させ、プッシュSWが押されたかチェックする。 もし押されたら、そのLEDをウインクさせ確定したことを操作者に知らせた後、PVALに収納しておいた1(モード1)のデータを持って後処理(MODSELE)にジャンプする。
 プッシュSWが押されないと、1秒後に2番目のLED
を点灯させ、同じ処理を5番目のLEDまで繰り返す。
MODSEL1

                            BSF                     PORTB,BD1                     ;LED1 on

                            MOVLW              01H                                   ;preset mode 1

                            MOVWF              PVAL                                 ;

                            MOVLW              .9                                       ;get loop cnt

                            MOVWF              PCNT                                ;

MODSEL11

                            CALL                   T01SEC                             ;wait for 0.1sec

                            BTFSC                PORTA,PSW                     ;check push sw

                            GOTO                  MODSEL12                      ;

                            BCF                     PORTB,BD1                    ;LED1 off

                            CALL                   T01SEC                             ;wait for 0.1sec

                            BSF                     PORTB,BD1                    ;LED1 on

                            CALL                   T01SEC                             ;wait for 0.1sec

                            BCF                     PORTB,BD1                     ;LED1 off

                            CALL                   T01SEC                             ;wait for 0.1sec

                            GOTO                  MODSELE                        ;                          

MODSEL12

                            DECFSZ              PCNT,F                             ;check loop end

                            GOTO                  MODSEL11                       ;loop

;***************

;                                        

;                                         省略

;                                        

;***************

;MODE5

                            BCF                     PORTB,BD4            ;LED4 off

                            BSF                     PORTB,BD5            ;LED5 on                                               

                            MOVLW              010H           ;preset mode 5

                            MOVWF              PVAL                     ;

                            MOVLW              .9                           ;get loop cnt

                            MOVWF              PCNT                    ;

MODSEL5

                            CALL                   T01SEC                 ;wait for 0.2sec

                            BTFSC                PORTA,PSW         ;check push sw

                            GOTO                  MODSEL51          ;

                            BCF                     PORTB,BD5            ;LED3 off

                            CALL                   T01SEC                 ;wait for 0.1sec

                            BSF                     PORTB,BD5            ;LED3 on

                            CALL                   T01SEC                 ;wait for 0.1sec

                            BCF                     PORTB,BD5            ;LED3 off

                            CALL                   T01SEC                 ;wait for 0.1sec

                            GOTO                  MODSELE            ;

MODSEL51

                            DECFSZ              PCNT,F                             ;check loop end

                            GOTO                  MODSEL5                        ;loop

;***************

                            CLRF                   PORTB                              ;try again

四角形吹き出し: モード選択データをCFLAGに格納した後、Wレジスタにデータを持って書き込みサブルーチン(EE−PROMの0番地に書き込む。)ヘジャンプする。  書き込みが終了すると通常処理に戻り、CFLAGを参照してモードを切り替える。
 
                            CALL                   T1SEC                               ;

                            GOTO                  MODSEL1                        ;loop

;***************                                          

MODSELE

                            MOVF                 CFLAG,W                         ;insert mode bits to ICF

                            ANDLW               0E0H                                 ;

                            IORWF                PVAL,W                             ;

                            MOVWF              CFLAG                              ;

                            CALL                   EEWRITE                         ;save mode value to EE-PROM

;

                            CLRF                   PORTB                              ;light off all LEDs

                            CALL                   T1SEC                               ;wait for 1 sec.

                            RETURN

;

;*******************************************

;  Read Previous CFLAG value from EE-PROM

;

四角形吹き出し: このサブルーチンは以前にEE−PROMの0番地に書き込まれたモード選択データを読み出す為のルーチンです。
 初期設定ルーチンの中でコールし、読み出したデータをCFLAGエリアに格納する。
;*******************************************

;

EEREAD

                            BSF                     STATUS,RP1                     ;Bank 2

                            MOVLW              00H                                   ;set address(0) to read

                            MOVWF              EEADR                             ;

                            BSF                     STATUS,RP0                     ;Bank 3

                            BCF                     EECON1,EEPGD             ;point to data memory

                            BSF                     EECON1,RD                    ;read data

                            BCF                     STATUS,RP0                     ;Bank 2

                            MOVF                 EEDATA,W                      ;

                            BCF                     STATUS,RP1                     ;Bank 0

                            RETURN

;

;*******************************************

;  Write CFLAG value to EE-PROM

;

;*******************************************

;

EEWRITE

                            BSF                     STATUS,RP1                     ;Bank 2

                            MOVWF              EEDATA                            ;set data to write

                            MOVLW              00H                                   ;set address(0) to write

                            MOVWF              EEADR                             ;

四角形吹き出し: モード選択データをEE−PROMの0番地に書き込むルーチン。                            BSF                     STATUS,RP0                     ;Bank 3

                            BCF                     EECON1,EEPGD             ;point to data memory                    

                            BSF                     EECON1,WREN               ;enable write

                            BCF                     INTCON,GIE                    ;disable  all INTs

                            MOVLW              055H                                 ;unlock write

                            MOVWF              EECON2                           ;

                            MOVLW              0AAH                                ;

                            MOVWF              EECON2                           ;

                            BSF                     EECON1,WR                    ;start the write

                            BSF                     INTCON,GIE                    ;enable all INTs

                            BCF                     EECON1,WREN               ;enable write

                            BCF                     STATUS,RP0                     ;Bank 0

                            BCF                     STATUS,RP1                     ;

                            RETURN

 

5.3       後書き

 EEREADEEWRITEのサブルーチンはEE−PROMの0番地に1バイトのデータを読み書きする専用のルーチンです。 もし、ログ情報を順次読み書きしたい場合はEEADRレジスタに設定するアドレス情報を順次変更する必要があります。