;****************************************************************************************** ; EEP-ROM(AT93C86)アクセスサンプル(ORG:8Bitで使用) ; Program Name : ; Programer : ; Create date : Version 1.0 H19.06.13 ; History : ; Description : ; 1.ADRESS AND DATA ; 8Bit Data => D0-D7, A0-A10 ; 16Bit Data => D0-D15,A0-A9 ; 2.GPIO I/O ; GPIO(0);AT93C86(SK) ; GPIO(1);AT93C86(DI) ; GPIO(2);AT93C86(DO) ; GPIO(3);RS232(RX) ; GPIO(4);AT93C86(CS) ; GPIO(5);RS232(TX) ;****************************************************************************************** LIST P=PIC12F683,ST=OFF,R=DEC INCLUDE "P12F683.inc" ;標準ヘッダ定義ファイル __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOD_OFF & _IESO_OFF & _FCMEN_OFF ; IODAT EQU 20H SENDLP EQU 21H SENDWAT EQU 22H RECLP EQU 23H RECWAT EQU 24H MSGCNT EQU 25H CNT EQU 26H CNT1 EQU 27H EEPWDAT EQU 28H EEPADD0 EQU 29H EEPADD1 EQU 2AH EEPDAT EQU 2BH PLSHL EQU 2CH LPEEPRDR EQU 2DH DUMPTMP EQU 2EH DM0 EQU 2FH DM1 EQU 30H ORG 0 GOTO START ORG 4 GOTO START START BSF STATUS,RP0 ; BANK1を選択 BSF OSCCON,6 ; 8MHzを設定 BSF OSCCON,5 ; 8MHzを設定 BSF OSCCON,4 ; 8MHzを設定 NOP NOP BCF STATUS,RP0 ; BANK0を選択 MOVLW 07H ; BANK0でデジタルIO設定 MOVWF CMCON0 ; BANK0でデジタルIO設定 CLRF GPIO ; BANK0でポート初期化 BSF STATUS,RP0 ; BANK1を選択 CLRF ANSEL ; BANK1でデジタルIO初期化 MOVLW B'00001100' ; BANK1でPORT設定 MOVWF TRISIO ; BANK1でPORT設定 BCF STATUS,RP0 ; BANK0を選択 ; シリアル送信ポートの初期化 BSF GPIO,5 ; CALL DEMO1 CALL EEP93EWN MAIN CALL DEMOR CALL DEMOW GOTO MAIN ;****************************************************************************************** ; Function Name : DEMO1 ; Title : PowerON デモ ; Input : ; Output : ;****************************************************************************************** DEMO1 CALL WATP001 MOVLW H'1B' MOVWF MSGCNT DEMO1A MOVFW MSGCNT CALL DEMO1TBL CALL SEND CALL WATP001 DECFSZ MSGCNT,F GOTO DEMO1A RETURN DEMO1TBL ADDWF PCL,F RETLW ' ' RETLW '>' RETLW 'K' RETLW 'O' RETLW ' ' RETLW '3' RETLW '8' RETLW '6' RETLW 'F' RETLW '2' RETLW '1' RETLW 'C' RETLW 'I' RETLW 'P' RETLW ' ' RETLW 'd' RETLW 'e' RETLW 't' RETLW 'c' RETLW 'e' RETLW 'n' RETLW 'n' RETLW 'o' RETLW 'C' RETLW ' ' RETLW ' ' RETLW ' ' RETLW ' ' ;****************************************************************************************** ; Function Name : DEMOR ; Title : EEPを5バイト読む ; Input : ; Output : ;****************************************************************************************** DEMOR MOVLW '-' CALL SEND CALL WATP001 MOVLW 'R' CALL SEND CALL WATP001 MOVLW '-' CALL SEND CALL WATP001 ; ; ; MOVLW H'00' MOVWF EEPADD1 MOVLW H'00' MOVWF EEPADD0 CALL EEP93RDR CALL SEND CALL WATP001 ; ; ; MOVLW H'00' MOVWF EEPADD1 MOVLW H'01' MOVWF EEPADD0 CALL EEP93RDR CALL SEND CALL WATP001 ; ; ; MOVLW H'00' MOVWF EEPADD1 MOVLW H'02' MOVWF EEPADD0 CALL EEP93RDR CALL SEND CALL WATP001 ; ; ; MOVLW H'00' MOVWF EEPADD1 MOVLW H'03' MOVWF EEPADD0 CALL EEP93RDR CALL SEND CALL WATP001 ; ; ; MOVLW H'00' MOVWF EEPADD1 MOVLW H'04' MOVWF EEPADD0 CALL EEP93RDR CALL SEND CALL WATP001 ; ; ; MOVLW ' ' CALL SEND CALL WATP001 RETURN ;****************************************************************************************** ; Function Name : DEMOW ; Title : EEPに5バイト書く ; Input : ; Output : ;****************************************************************************************** DEMOW MOVLW '-' CALL SEND CALL WATP001 MOVLW 'W' CALL SEND CALL WATP001 MOVLW '-' CALL SEND CALL WATP001 ; ; ; MOVLW H'00' MOVWF EEPADD1 MOVLW H'00' MOVWF EEPADD0 CALL REC MOVWF IODAT CALL EEP93WTR MOVFW IODAT CALL SEND CALL WATP001 ; ; ; MOVLW H'00' MOVWF EEPADD1 MOVLW H'01' MOVWF EEPADD0 CALL REC MOVWF IODAT CALL EEP93WTR MOVFW IODAT CALL SEND CALL WATP001 ; ; ; MOVLW H'00' MOVWF EEPADD1 MOVLW H'02' MOVWF EEPADD0 CALL REC MOVWF IODAT CALL EEP93WTR MOVFW IODAT CALL SEND CALL WATP001 ; ; ; MOVLW H'00' MOVWF EEPADD1 MOVLW H'03' MOVWF EEPADD0 CALL REC MOVWF IODAT CALL EEP93WTR MOVFW IODAT CALL SEND CALL WATP001 ; ; ; MOVLW H'00' MOVWF EEPADD1 MOVLW H'04' MOVWF EEPADD0 CALL REC MOVWF IODAT CALL EEP93WTR MOVFW IODAT CALL SEND CALL WATP001 ; ; MOVLW ' ' CALL SEND CALL WATP001 RETURN ;****************************************************************************************** ; Function Name : EEP93EWN ; Title : EWENコマンド(Writeする場合は、EWENコマンドによるモードの変更が必須) ; Input : ; Output : ; Description : ; GPIO(0);AT93C86(SK) ; GPIO(1);AT93C86(DI) ; GPIO(2);AT93C86(DO) ; GPIO(4);AT93C86(CS) ;****************************************************************************************** EEP93EWN ; 0.初期化 CALL INITPIO ; 1.EWENコマンド出力(10011) ; (0)CS信号を出力 BSF GPIO,4 ; CS(4) ; (1)'1'を出力 MOVLW H'01' CALL OUTPLS ; (2)'0'を出力 MOVLW H'00' CALL OUTPLS ; (3)'0'を出力 MOVLW H'00' CALL OUTPLS ; (4)'1'を出力 MOVLW H'01' CALL OUTPLS ; (5)'1'を出力 MOVLW H'01' CALL OUTPLS ; (6)ダミー(8Bit-Wordの時は9クロック必要) MOVLW H'09' MOVWF LPEEPRDR EEP93EWN1 MOVLW H'00' CALL OUTPLS DECFSZ LPEEPRDR,F GOTO EEP93EWN1 ; ; 2.完了処理 ; 1)戻す BCF GPIO,4 ; CS(4) ; 2)待つ CALL WATP1 ; RETURN ;****************************************************************************************** ; Function Name : EEP93WTR ; Title : EEPにデータを書く ; Input : EEPADD1,EEPADD0,W-REG ; Output : ; Description : ; GPIO(0);AT93C86(SK) ; GPIO(1);AT93C86(DI) ; GPIO(2);AT93C86(DO) ; GPIO(4);AT93C86(CS) ;****************************************************************************************** EEP93WTR ; 0.初期化 MOVWF EEPDAT CALL INITPIO ; 1.WRITE-ヘッダー出力(101) ; (0)CS信号を出力 BSF GPIO,4 ; CS(4) ; (1)'1'を出力 MOVLW H'01' CALL OUTPLS ; (2)'0'を出力 MOVLW H'00' CALL OUTPLS ; (3)'1'を出力 MOVLW H'01' CALL OUTPLS ; 2.アドレス出力 ; (1)アドレス(A10-A8)を出力 MOVLW H'03' MOVWF LPEEPRDR EEP93WTR1 ; 1)アドレス出力 BTFSC EEPADD1,2 MOVLW H'01' BTFSS EEPADD1,2 MOVLW H'00' ; 2)出力 CALL OUTPLS ; 3)左シフト RLF EEPADD1,F DECFSZ LPEEPRDR,F GOTO EEP93WTR1 ; ; (2)アドレス(A7-A0)を出力 MOVLW H'08' MOVWF LPEEPRDR EEP93WTR2 ; 1)アドレス出力 BTFSC EEPADD0,7 MOVLW H'01' BTFSS EEPADD0,7 MOVLW H'00' ; 2)出力 CALL OUTPLS ; 3)左シフト RLF EEPADD0,F DECFSZ LPEEPRDR,F GOTO EEP93WTR2 ; 3.データ出力 ; (2)データ(D7-D0)を出力 MOVLW H'08' MOVWF LPEEPRDR EEP93WTR3 ; 1)データ出力 BTFSC EEPDAT,7 MOVLW H'01' BTFSS EEPDAT,7 MOVLW H'00' ; 2)出力 CALL OUTPLS ; 3)左シフト RLF EEPDAT,F DECFSZ LPEEPRDR,F GOTO EEP93WTR3 ; ; 4.完了処理 ; 1)DIビットを戻す BCF GPIO,1 ; DI(1) BCF GPIO,4 ; CS(4) ; 2)待つ CALL TMD4PL CALL TMD4PL ; 3)CS信号を送る BSF GPIO,4 ; CS(4) ; 4)Lを待つ BTFSC GPIO,2 GOTO $-1 ; 5)Hを待つ BTFSS GPIO,2 GOTO $-1 ; 6)10mS以上待つ(不要) ; CALL WATP1 ; 7)終了 BCF GPIO,4 ; CS(4) CALL TMD4PL ; RETURN ;****************************************************************************************** ; Function Name : EEP93RDR ; Title : EEPのデータを読む ; Input : EEPADD1,EEPADD0 ; Output : W-REG,EEPDAT ; Description : ; GPIO(0);AT93C86(SK) ; GPIO(1);AT93C86(DI) ; GPIO(2);AT93C86(DO) ; GPIO(4);AT93C86(CS) ;****************************************************************************************** EEP93RDR ; 0.ポートの初期化 CALL INITPIO ; 1.READ-ヘッダー出力(110) ; (0)CS信号を出力 BSF GPIO,4 ; CS(4) ; (1)'1'を出力 MOVLW H'01' CALL OUTPLS ; (2)'1'を出力 MOVLW H'01' CALL OUTPLS ; (3)'0'を出力 MOVLW H'00' CALL OUTPLS ; 2.アドレス出力 ; (1)アドレス(A10-A8)を出力 MOVLW H'03' MOVWF LPEEPRDR EEP93RDR1 ; 1)アドレス出力 BTFSC EEPADD1,2 MOVLW H'01' BTFSS EEPADD1,2 MOVLW H'00' ; 2)出力 CALL OUTPLS ; 3)左シフト RLF EEPADD1,F DECFSZ LPEEPRDR,F GOTO EEP93RDR1 ; ; (2)アドレス(A7-A0)を出力 MOVLW H'08' MOVWF LPEEPRDR EEP93RDR2 ; 1)アドレス出力 BTFSC EEPADD0,7 MOVLW H'01' BTFSS EEPADD0,7 MOVLW H'00' ; 2)出力 CALL OUTPLS ; 3)左シフト RLF EEPADD0,F DECFSZ LPEEPRDR,F GOTO EEP93RDR2 ; ; 3.データ読込み ; (1)データ読込み ; 1)変数初期化 CLRF EEPDAT ; 2)データ読込み MOVLW H'08' ; MOVWF LPEEPRDR EEP93RDR3 ; 3)データシフト RLF EEPDAT,F ; 4)クロックパルス(H) CALL TMD4PL ; BSF GPIO,0 ; SK(0) ; 5)データ読む BTFSC GPIO,2 BSF EEPDAT,0 ; DO(2) BTFSS GPIO,2 BCF EEPDAT,0 ; DO(2) ; 6)クロックパルス(L) CALL TMD4PL ; BCF GPIO,0 ; SK(0) ; 7)待つ CALL TMD4PL ; ; DECFSZ LPEEPRDR,F GOTO EEP93RDR3 ; 4.処理終了 ; (1)CS信号を戻す BCF GPIO,4 ; CS(4) ; (2)W-REGへ代入 MOVFW EEPDAT ; RETURN ;****************************************************************************************** ; Function Name : OUTPLS ; Title : EEPに1パルスを出力する ; Input : W-REG ; Output : ;****************************************************************************************** OUTPLS ; 0.引数を保存 MOVWF PLSHL ; 1.DIパルス出力 BTFSC PLSHL,0 BSF GPIO,1 ; DI(1) BTFSS PLSHL,0 BCF GPIO,1 ; DI(1) ; 2.クロックパルスを出力 CALL TMD4PL ; BSF GPIO,0 ; SK(0) CALL TMD4PL ; BCF GPIO,0 ; SK(0) CALL TMD4PL ; RETURN ;****************************************************************************************** ; Function Name : TMD4PL ; Title : 1/4 クロック待つ ; Input : ; Output : ; Description : >>250nS ※OSC:8MHz用 ;****************************************************************************************** TMD4PL NOP NOP RETURN ;****************************************************************************************** ; Function Name : INITPIO ; Title : ポートの初期化 ; Input : ; Output : ;****************************************************************************************** INITPIO BCF GPIO,0 BCF GPIO,1 BCF GPIO,4 BSF GPIO,5 RETURN ;****************************************************************************************** ; Function Name : REC ; Title : RS232C受信サブルーチン(GPIO,3) ; 9600BPS OSC;8.000MHz仕様 ; Input : ; Output : W-Reg ;****************************************************************************************** REC ; (0)変数初期化 CLRF IODAT ; (1)受信データを待つ REC0 BTFSC GPIO,3 GOTO REC0 ; (2)1/2ビット分待つ MOVLW H'21' ; 9600BPS,OSC;8MHz MOVWF RECWAT REC1 DECFSZ RECWAT,F GOTO REC1 ; (3)データ受信(8ビット分) MOVLW 8 MOVWF RECLP NOP REC2 MOVLW H'42' ; 9600BPS,OSC;8MHz MOVWF RECWAT REC3 DECFSZ RECWAT,F GOTO REC3 NOP BTFSS GPIO,3 ; ビットデータが0の時, 0を立てる BCF STATUS,C BTFSC GPIO,3 ; ビットデータが1の時, 1を立てる BSF STATUS,C RRF IODAT,F ; 変数内でビットをシフトする DECFSZ RECLP,F GOTO REC2 NOP NOP ; MOVFW IODAT ; RETURN ;****************************************************************************************** ; Function Name : SEND ; Title : RS232C送信サブルーチン(GPIO,5) ; 9600BPS OSC;8.000MHz仕様 ; Input : W-Reg ; Output : ;****************************************************************************************** SEND MOVWF IODAT ; (1)送信開始 SEND0 BCF GPIO,5 ; 送信開始 MOVLW H'42' ; 9600BPS,OSC;8MHz MOVWF SENDWAT SEND1 DECFSZ SENDWAT,F GOTO SEND1 ; ; (2)データ送信(8ビット) MOVLW 8 ; 8ビットデータ分、送信する MOVWF SENDLP NOP SEND2 RRF IODAT,F NOP BTFSS STATUS,C ; ビットデータが0の時, 0を立てる BCF GPIO,5 BTFSC STATUS,C ; ビットデータが1の時, 1を立てる BSF GPIO,5 MOVLW H'42' ; パルス(9600BPS,OSC;8MHz) MOVWF SENDWAT SEND3 DECFSZ SENDWAT,F GOTO SEND3 DECFSZ SENDLP,F GOTO SEND2 ; (3)終了 BSF GPIO,5 ; フラグを戻す ; (4)送信後、少し待つ CALL TIMER RETURN ; ;****************************************************************************************** ; Function Name : TIMER ; Title : タイマー(1000回ループ) ; Input : ; Output : ;****************************************************************************************** TIMER MOVLW H'0A' MOVWF CNT1 TIMER1 MOVLW H'64' MOVWF CNT TIMER2 DECFSZ CNT,F GOTO TIMER2 DECFSZ CNT1,F GOTO TIMER1 RETURN ;******************************************************************************************* ; 関数名 : WATP1     ; 機能 : 0.1秒(100mS)タイマー ; 引数 : なし ; 変数 : ;******************************************************************************************* WATP1 CALL WATP01 CALL WATP01 CALL WATP01 CALL WATP01 CALL WATP01 CALL WATP01 CALL WATP01 CALL WATP01 CALL WATP01 CALL WATP01 RETURN ;******************************************************************************************* ; 関数名 : WATP01     ; 機能 : 0.01秒(10mS)タイマー ; 引数 : なし ; 変数 : ;******************************************************************************************* WATP01 CALL WATP001 CALL WATP001 CALL WATP001 CALL WATP001 CALL WATP001 CALL WATP001 CALL WATP001 CALL WATP001 CALL WATP001 CALL WATP001 RETURN ;******************************************************************************************* ; 関数名 : WATP001     ; 機能 : 0.001秒(1mS)タイマー ; 引数 : なし ; 変数 : ; 注意 : 8/4MHz =(200)=> 10KHz =(10)=> 1KHz ;******************************************************************************************* WATP001 MOVLW H'0A' MOVWF CNT1 WATP001B MOVLW H'43' MOVWF CNT WATP001A DECFSZ CNT,F GOTO WATP001A DECFSZ CNT1,F GOTO WATP001B RETURN END