TOP > PIC > EEPROM書き出し、読み出し

 EEPROM 24C1024にデータの書き出し、読み出しをPICアセンブラで試してみました。
 例によって「あ」のデータをEEPROMに書き出し、それを読み出して、ノリタケ伊勢電子のSCK25616L-Aに表示させて見ました。
 EEPROMの書き出し、読み出しはCQ出版社の作りながら学ぶPICマイコン入門のほとんどコピーであるため、比較的すんなりと進んでしまいました。

;=========================================================
;       SCK25616L-Aのテストプログラム
;       EEPROMのライト、リードのテスト
;       2008.05.24
;=========================================================
        list            p=16F877A       ; list directive to define processor
        #include        <p16F877A.inc>  ; processor specific variable definitions

        __CONFIG    _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF

EN              equ     2
LAT             equ     5
cnt             equ     0x21
;==============================================================================
        ORG     0x000             ; processor reset vector
        goto    main              ; go to beginning of program

main
;==============================================================================
;       初期化部
;==============================================================================
;       SSPモジュールの初期設定   
;==============================================================================
        bsf     STATUS, RP0     ;*****バンク1セレクト*****
        movlw   d'2'            ;ボーレート
        movwf   SSPADD
        movlw   0x80            ;I2C標準速度モード
        movwf   SSPSTAT
        bsf     TRISC, 3        ;SCLデジタル・ポートを入力に設定
        bsf     TRISC, 4        ;SDAデジタル・ポートを入力に設定
        bcf     STATUS, RP0     ;*****バンク0セレクト*****
        movlw   b'00101000'     ;SSPENイネーブル、I2Cマスターモード
        movwf   SSPCON
;==============================================================================
;       タイマー0の初期設定
;==============================================================================
        bsf     STATUS, RP0     ;*****バンク1セレクト*****
        bcf     OPTION_REG, T0CS;タイマ0選択
        bcf     OPTION_REG, PSA ;プリスケーラはタイマ0
;==============================================================================
;       USARTの初期設定
;==============================================================================
        movlw   0x04            ;同期モード500kbps
        movwf   SPBRG
        bsf     TXSTA, CSRC     ;マスターモード
        bsf     TXSTA, SYNC     ;同期モード
        bcf     STATUS, RP0     ;*****バンク0セレクト*****
        bsf     RCSTA, SPEN     ;シリアルポートイネーブル
        bsf     STATUS, RP0     ;*****バンク1セレクト*****
        bsf     TXSTA, TXEN
        bcf     STATUS, RP0     ;*****バンク0セレクト*****
;==============================================================================
;       処理部
;==============================================================================
        call    start_condition ;スタートコンディションの開始
        movlw   b'10100000'     ;EEPROMデバイスアドレス
        call    send_address    ;EEPROMアドレスをセット
        movlw   0x00
        call    write_data      ;EEPROMのデータアドレス上位バイト
        call    write_data      ;EEPROMのデータアドレス下位バイト
;==============================================================================
;       データ転送漢字「あ」
;==============================================================================
        movlw   0x00            ;16l
        call    write_data
        movlw   0x00            ;16h
        call    write_data
        movlw   0x70            ;15l
        call    write_data
        movlw   0x00            ;15h
        call    write_data
        movlw   0x88            ;14l
        call    write_data
        movlw   0x00            ;14h
        call    write_data
        movlw   0x04            ;13l
        call    write_data
        movlw   0x01            ;13h
        call    write_data
        movlw   0x04            ;12l
        call    write_data
        movlw   0x02            ;12h
        call    write_data
        movlw   0x02            ;11l
        call    write_data
        movlw   0x22            ;11h
        call    write_data
        movlw   0x82            ;10l
        call    write_data
        movlw   0x27            ;10h
        call    write_data
        movlw   0x60            ;9l
        call    write_data
        movlw   0x12            ;9h
        call    write_data
        movlw   0x18            ;8l
        call    write_data
        movlw   0x12            ;8h
        call    write_data
        movlw   0x10            ;7l
        call    write_data
        movlw   0xfe            ;7h
        call    write_data
        movlw   0xe8            ;6l
        call    write_data
        movlw   0x11            ;6h
        call    write_data
        movlw   0x84            ;5l
        call    write_data
        movlw   0x10            ;5h
        call    write_data
        movlw   0x44            ;4l
        call    write_data
        movlw   0x10            ;4h
        call    write_data
        movlw   0x38            ;3l
        call    write_data
        movlw   0x00            ;3h
        call    write_data
        movlw   0x00            ;2l
        call    write_data
        movlw   0x00            ;2h
        call    write_data
        movlw   0x00            ;1l
        call    write_data
        movlw   0x00            ;1h
        call    write_data
        call    stop_condition
        movlw   D'100'          ;約10ms待ち
        call    timer01ms
;       データ読み出し
        call    start_condition
        movlw   b'10100000'     ;EEPROMデバイスアドレス
        call    send_address    ;EEPROMアドレスをセット
        movlw   0x00
        call    write_data      ;EEPROMのデータアドレス上位バイト
        call    write_data      ;EEPROMのデータアドレス下位バイト
        call    restart_condition
        movlw   B'10100001'
        call    send_address
;       データの読み取りと表示
        movlw   D'31'           ;繰り返し回数最後は32-1
        movwf   cnt
disp000
        call    recive          ;1バイト読み出し
        call    txreg_write     ;1バイト転送
        decfsz  cnt, F
        goto    disp000
        call    recive_last     ;最後の1バイト読み出し
        call    txreg_write     ;1バイト転送
        call    stop_condition  ;終了処理
        btfss   PIR1, TXIF      ;TXIFのセットまで待つ
        goto    $-1
        bsf     STATUS, RP0     ;*****バンク1セレクト*****
        btfss   TXSTA, TRMT     ;TRMTセットまで待つ
        goto    $-1
        bcf     STATUS, RP0     ;*****バンク0セレクト*****
        bsf     PORTC, LAT      ;ラッチパルス送出
        bcf     PORTC, LAT
        bsf     PORTC, EN       ;表示イネーブル
        goto    $
;==============================================================================
recive
        bcf     PIR1, SSPIF
        bsf     STATUS, RP0     ;*****バンク1セレクト*****
        bsf     SSPCON2, RCEN
        btfsc   SSPCON2, RCEN
        goto    $-1
        bcf     SSPCON2, ACKDT
        bsf     SSPCON2, ACKEN
        btfsc   SSPCON2, ACKEN
        goto    $-1
        bcf     STATUS, RP0     ;*****バンク0セレクト*****
        movf    SSPBUF, W
        return
recive_last
        bcf     PIR1, SSPIF
        bsf     STATUS, RP0     ;*****バンク1セレクト*****
        bsf     SSPCON2, RCEN
        btfsc   SSPCON2, RCEN
        goto    $-1
        bsf     SSPCON2, ACKDT
        bsf     SSPCON2, ACKEN
        btfsc   SSPCON2, ACKEN
        goto    $-1
        bcf     STATUS, RP0     ;*****バンク0セレクト*****
        movf    SSPBUF, W
        return
;==============================================================================
stop_condition
        bcf     PIR1, SSPIF
        bsf     STATUS, RP0     ;*****バンク1セレクト*****
        bsf     SSPCON2, PEN
        btfsc   SSPCON2, PEN
        goto    $-1
        bcf     STATUS, RP0     ;*****バンク0セレクト*****
        bcf     PIR1, SSPIF
        return
;==============================================================================
write_data
        bcf     STATUS, RP0     ;*****バンク0セレクト*****
        bcf     PIR1, SSPIF     ;割り込みフラグクリア
        movwf   SSPBUF
        btfss   PIR1, SSPIF
        goto    $-1
        return
;==============================================================================
send_address
        movwf   SSPBUF
        bcf     PIR1, SSPIF
        btfss   PIR1, SSPIF
        goto    $-1
        return
;==============================================================================
start_condition
        bsf     STATUS, RP0     ;*****バンク1セレクト*****
        bsf     SSPCON2, SEN    ;スタートコンディション
        btfsc   SSPCON2, SEN
        goto    $-1
        bcf     STATUS, RP0     ;*****バンク0セレクト*****
        return
;==============================================================================
restart_condition
        bcf     PIR1, SSPIF
        bsf     STATUS, RP0     ;*****バンク1セレクト*****
        bsf     SSPCON2, RSEN
        btfsc   SSPCON2, RSEN
        goto    $-1
        bcf     STATUS, RP0     ;*****バンク0セレクト*****
        return
;==============================================================================
;       サブルーチン名 timer01ms
;       機能              Wレジスタ×0.102msの待ちループ
;       2008.05.25
;==============================================================================
timer01ms
        bcf     INTCON, T0IF    ;タイマ0の割り込みフラグクリア
        sublw   0xff
        movwf   TMR0
        btfss   INTCON, T0IF
        goto    $-1
        bcf     INTCON, T0IF
        return
;===================================================================
;       サブルーチン名 txreg_write
;       機能              wレジスタの値をTXIFがセットされるのを待ってTXREGに書き込む
;       2008.05.11
;       TXREGにデータ書き込み後、TXIFに反映されるまでには1サイクル必要
;===================================================================
txreg_write
        btfss   PIR1, TXIF
        goto    txreg_write
        movwf   TXREG
        return
        end