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 |