;**************************************************************** ;* * ;* 電圧ロガーシステム ADR−100 * ;* PA.EXE でアッセンブル * ;*--------------------------------------------------------------* ;* CPU = PIC16F84 10MHz * ;* 外部EEPROM= AT25256−10PC * ;* A/D = CS5529 * ;* LCD = SC1602BS * ;*システム概要 * ;* 直流電圧を計測し設定時間毎にEEPROMに格納し * ;* RS−232Cで出力する。 * ;*校正 * ;* 各レンジ(320mV/3.2V/32V/320V)の利得をCPU内の * ;* EEPROMに自動校正し格納する * ;*設定項目(CPUのEEPROMに格納) * ;* レンジ(320mV/3.2V/32V/320V) * ;* インターバルタイム(0/1/5/10/30/60分) * ;*機能 * ;* EEPROMのアップロード * ;* レンジ切り替え(320mV/3.2V/32V/320V) * ;*キー処理 * ;* 測定モード * ;* EEPROMのアップロード * ;* レンジ切り替え * ;* インターバル時間の切り替え * ;* 校正 * ;* * ;* Copyright (c) by ALTECH Corp. 増田 幸夫 * ;* * ;*--------------------------------------------------------------* ;* 履歴 * ;* Ver1.00 '99/10/07 * ;* Ver1.01 '00/01/13 基板の関係でlcd_eとlcd_rsを交換 * ;* Ver2.00 '00/05/19 ロギング中データを出力、DC表示を削除 * ;* * ;**************************************************************** include 16f84.h .osc hs ;オシレータ .pwrt on ;パワーアップタイマ .wdt off ;ウォッチドッグ .protect on ;プロテクト ;**************************************************************** ;* 変数定義 * ;**************************************************************** lcd_e equ ra.0 ;LCDのE lcd_rs equ ra.1 ;LCD RS ポート txd equ ra.2 ;RS-232C TXD ポート rom_cs equ ra.3 ;EEPROM CS ポート swe equ ra.4 ;SW E ポート sdi equ rb.0 ;シリアルデータ出力 sdo equ rb.1 ;シリアルデータ入力 ad_cs equ rb.2 ;A/D CS ポート sclk equ rb.3 ;シリアル クロックとLCDのE db4 equ rb.4 ;データバス db5 equ rb.5 ;データバス db6 equ rb.6 ;データバス db7 equ rb.7 ;データバス btime equ 83 ;ボーレート設定 9600bps at 10MHz org 0ch w_temp ds 1 ;Wレジスタ退避 sts_temp ds 1 ;ステータスレジスタ退避 high_byte ds 1 ;A/Dの上位バイト mid_byte ds 1 ;A/Dの中位バイト low_byte ds 1 ;A/Dの下位バイト command_byte ds 1 ;A/Dのコマンドバイト swsts ds 1 ;スイッチ、監視状態 swup ds 1 ;スイッチ、監視立ち上がり swold ds 1 ;スイッチ、監視前回値 counter ds 1 ;カウンター counter1 ds 1 ;カウンター time1m ds 1 ;1分カウンタ time1s ds 1 ;1秒カウンタ time20 ds 1 ;20mSカウンター cnt ds 2 ;EEPROMアドレスカウンター log_cnt ds 2 ;ログ数カウンター spdr ds 1 ;シリアルデータレジスター wait_cn ds 1 ;ウエイトカウンター wait_cn2 ds 1 ;ウエイト内部カウンター d4 ds 1 ;LCD 4bit DATA d8 ds 1 ;LCD 8bit DATA rs ds 1 ;ウェイト時間調整用 cn ds 1 ;ビット数 flag ds 1 ;各種フラグ log_flag equ flag.0 ;ログ=1 sign equ flag.1 ;極性 1=- 0=+ key_flag equ flag.2 ;キー受付フラグ disp_rs equ flag.3 ;DISPルーチンのRS出力 log_out equ flag.4 ;データの出力フラグ wk ds 2 ;Work poi ds 1 ;ポインター addres ds 2 ;EEPROM アドレス work ds 2 ;作業エリア bcd_data ds 5 bcd_top ;**************************************************************** ;* EEPROMの初期値 * ;**************************************************************** r0gain equ 0 rng equ 12 intval equ 13 total equ 14 debug equ 20h eeorg r0gain eedata 040h,000h,000h ;320mVGAINの初期値 eedata 040h,000h,000h ;3.2VGAINの初期値 eedata 040h,000h,000h ;32VGAINの初期値 eedata 040h,000h,000h ;320VGAINの初期値 eeorg rng eedata 00 ;レンジ情報320mVレンジ eeorg intval eedata 01 ;インターバルの初期値(1分) eeorg total eedata 00,00 ;ロガーデータ数 eeorg debug eedata 000h ;デバッグ用エリア ;**************************************************************** ;* ベクターテーブル * ;**************************************************************** org 0 jmp start org 4 jmp int ;**************************************************************** ;* 文字列テーブル * ;**************************************************************** title_tbl: jmp pc+w title equ $-title_tbl-1 retw 'ADR-100 Ver.2.00',0 name equ $-title_tbl-1 retw 'ALTECH Inc.',0 int_val equ $-title_tbl-1 retw 'Intval=',0 val00 equ $-title_tbl-1 retw '00',0 retw '01',0 retw '05',0 retw '10',0 retw '30',0 retw '60',0 val01 equ $-title_tbl-1 retw 1,5,10,30,60,0 range equ $-title_tbl-1 retw 'Range=',0 range0 equ $-title_tbl-1 retw '.32V',0 retw '3.2V',0 retw ' 32V',0 retw '320V',0 over equ $-title_tbl-1 retw 'Over ' log equ $-title_tbl-1 retw 'Log',0 upload equ $-title_tbl-1 retw 'Up Load',0 calib equ $-title_tbl-1 retw 'Calibration',0 ok equ $-title_tbl-1 retw ' OK?',0 clear equ $-title_tbl-1 retw ' ',0 ;dcv equ $-title_tbl-1 ; retw 'DC',0 v equ $-title_tbl-1 retw 'V',0 ;**************************************************************** ;* 文字列表示(0でエンド)(disp_rs=1でRSに出力) * ;**************************************************************** putchar: setb lcd_rs putchar0: mov w,poi call title_tbl mov d4,w cje d4,#0,putchar1 sb disp_rs call write_lcd4 ;LCDに出力 snb disp_rs call transmit ;データ送信 inc poi jmp putchar0 putchar1: clrb lcd_rs ret ;**************************************************************** ;* メイン * ;*--------------------------------------------------------------* ;* 0123456789012345 * ;* 通常表示 Intval=10 Log * ;* 00000 +32.000V * ;**************************************************************** start: call init ;初期化 ; 割り込みの設定 setb rp0 ;割り込みタイマースタート mov option,#07h ;インターバル20ms clrb rp0 mov tmr0,#03ch setb t0ie setb gie ;---------------------------------------メイン main: call disp_clear ;画面クリアー call disp_intval ;Intval=XX ; mov d4,#11000000b+6 ;DC表示スタートアドレス ; call write_lcd4 ; mov poi,#dcv ;DC ; call putchar meas: call convert ;変換開始 snb key_flag jmp key_chg ;キーが押されている meas0: snb log_flag call logdat ;データ格納 call cvt_dat ;符号付きデータに変換 call bin_to_ascii mov d4,#11000000b+8 ;サイン表示スタートアドレス call write_lcd4 call disp ;結果の表示 mov poi,#v ;V call putchar jmp meas ;**************************************************************** ;* 20m秒インターバル割り込み * ;**************************************************************** int: clrb t0if mov w_temp,w mov sts_temp,status mov tmr0,#03ch inc time20 ;20mSタイマー cjne time20,#50,int00 clr time20 inc time1s ;1秒タイマー cjne time1s,#60,int00 clr time1s inc time1m ;1分タイマー int00: mov status,sts_temp mov w,w_temp retfie ;**************************************************************** ;* 各種初期化 * ;**************************************************************** init: ; ポートの初期化 mov w,#00011000b ;romcs/sweのみH mov ra,w mov w,#00000100b ;A/DCSのみH mov rb,w mov !ra,#00000000b ;ポートAの設定 mov !rb,#00000010b ;ポートBの設定 clr flag clr swold ;======================================= ; 液晶初期化 clr wait_cn ;wait 256ms call wait mov d8,#00110000b call write_lcd8 mov wait_cn,#5 ;wait 5ms call wait mov d8,#00110000b call write_lcd8 mov wait_cn,#1 ;wait call wait mov d8,#00110000b call write_lcd8 ;0 0 0011 (3) mov d8,#00100000b call write_lcd8 ;0 0 0010 (4bit) mov d4,#00101000b ;duty,font set9 call write_lcd4 mov d4,#00000110b ;entry mode set call write_lcd4 mov d4,#00001100b ;display on call write_lcd4 call disp_clear ;画面クリアー mov d4,#10000000b ;カーソルを1行目に移動 call write_lcd4 mov poi,#title ;タイトル表示 call putchar mov d4,#11000000b+5 ;カーソルを2行目に移動 call write_lcd4 mov poi,#name call putchar call wait call wait ;======================================= ; CS5529シリアルポートの初期化 clrb ad_cs ;CS=L mov counter,#0fh ;loop count=f init_ad0: mov w,#0ffh call send_spi ;A/Dへ0ffhを15回送信 djnz counter,init_ad0 mov w,#0feh call send_spi ;A/Dへ0fehを送信 ;======================================= ; CS5529のオフセット校正 ;---------------------------------------入力の短絡 cal00: mov high_byte,#01000000b ;offset range=0 clr low_byte call write_config ;オフセット校正 call wait call wait call offset ;入力の解放 mov eeadr,#rng call read_eeprom mov high_byte,eedata ;レンジ設定 clr low_byte call write_config call gain_read setb ad_cs ;CS=H ret ;**************************************************************** ;* CS5529のオフセット校正 * ;**************************************************************** offset: mov low_byte,#00000101b ;offset system calibration call write_config offset1: mov command_byte,#094h ;configから読み込み call read_register sb low_byte.3 ;calibration終了 jmp offset1 ret ;**************************************************************** ;* キー処理 * ;**************************************************************** key_chg: clrb key_flag sb swup.7 jmp menu_key ;**************************************************************** ;* ENTキー処理(フラグの反転) * ;**************************************************************** ent_key: ; フラグの反転 xor flag,#00000001b ; 表示の反転 mov d4,#10000000b+13 ;カーソルを1行目に移動 call write_lcd4 sb log_flag jmp ent0 ; モードの初期化 mov poi,#log call putchar ;LOGの表示 clr cnt clr cnt+1 clr log_cnt clr log_cnt+1 call logdat1 ;1回目のデータログ call out_intval ;rs-232cに出力 clrb log_out jmp meas ;exit ent0: mov poi,#clear call putchar ;LOGの消去 mov d4,#11000000b ;カーソルを2行目に移動 call write_lcd4 mov poi,#clear call putchar ;ログ数の消去 jmp meas0 ;exit ;**************************************************************** ;* MENUキー処理 * ;---------------------------------------------------------------* ;* MENU-- RANGE=XX OK ?(ENT) * ;* (MENU) RANGE=.32(ENT)でEND * ;* (MENU) RANGE=3.2(ENT)でEND * ;* (MENU) RANGE=32 (ENT)でEND * ;* (MENU) RANGE=320(ENT)でEND * ;* INTVAL=XX OK ?(ENT) * ;* (MENU) INTVAL=00(ENT)でEND * ;* (MENU) INTVAL=01(ENT)でEND * ;* (MENU) INTVAL=05(ENT)でEND * ;* (MENU) INTVAL=10(ENT)でEND * ;* (MENU) INTVAL=30(ENT)でEND * ;* UPLOAD OK ?(ENT) * ;* UPLOADでEND * ;* Calibration OK ?(ENT) * ;* CalibrationでEND * ;**************************************************************** menu_key: snb log_flag jmp meas0 ;ロギング中は何もしない call wait ;---------------------------------------レンジ表示 call disp_clear ;画面クリアー call disp_range ;RANGE=XXXV call disp_ok ;OK? call key ;キー入力待ち snb swup.7 ;ent key jmp range_0 ;レンジ選択 ;---------------------------------------NEXT インターバル表示 call disp_clear ;画面クリアー call disp_intval ;Intval=XX call disp_ok ;OK? call key ;キー入力待ち snb swup.7 ;ent key jmp intval_0 ;---------------------------------------NEXT アップロード call disp_clear ;画面クリアー mov poi,#upload ;アップロード call putchar call disp_ok ;OK? call key ;キー入力待ち snb swup.7 ;ent key jmp up_load ;アップロード処理 ;---------------------------------------NEXT 校正表示 call disp_clear ;画面クリアー mov poi,#calib ;Calibration call putchar call disp_ok ;OK? call key ;キー入力待ち snb swup.7 ;ent key jmp cal jmp main ;menu end ;=======================================レンジ選択 range_0: call disp_clear ;画面クリアー call disp_range ;RANGE=XXXV call key ;キー入力待ち snb swup.7 ;ent key jmp range_1 ;レンジ変更 add eedata,#00010000b and eedata,#00110000b mov eeadr,#rng call write_eeprom ;書き込み jmp range_0 range_1: call cal00 ;system cal jmp main ;menu end ;=======================================インターバル選択 intval_0: call disp_clear ;画面クリアー call disp_intval ;Intval=XX call key ;キー入力待ち snb swup.7 ;ent key jmp main ;menu end ;インターバル変更 clr work csbe eedata,#00 inc work csbe eedata,#01 inc work csbe eedata,#05 inc work csbe eedata,#10 inc work csbe eedata,#30 inc work mov w,#val01 add w,work call title_tbl ;次のインターバルを取得 mov eedata,w mov eeadr,#intval call write_eeprom ;書き込み jmp intval_0 ;=======================================アップロード処理 up_load: call disp_clear ;画面クリアー mov poi,#upload ;アップロード call putchar ; setb disp_rs ;rs-232cに出力 ; call disp_intval ;Intval=XX ; clrb disp_rs ; mov d4,#0dh ; call transmit ;改行送信 call out_intval ;rs-232cに出力 clr cnt clr cnt+1 clr log_cnt clr log_cnt+1 mov eeadr,#total+1 call read_eeprom mov wk+1,eedata mov eeadr,#total call read_eeprom mov wk,eedata up00: call disp_log ;ログ数の表示 call read ;外部EEPROMの読込 call cvt_dat ;符号付きデータに変換 call bin_to_ascii mov d4,#11000000b+8 ;サイン表示スタートアドレス call write_lcd4 call disp ;結果の表示 mov poi,#v ;V call putchar setb disp_rs call disp ;データ送信 clrb disp_rs mov d4,#0dh call transmit ;改行送信 cjne log_cnt,wk,up01 cje log_cnt+1,wk+1,main ;menu end up01: add cnt+1,#2 jnc up02 inc cnt up02: incsz log_cnt+1 jmp up00 inc log_cnt jmp up00 ;=======================================校正 cal: call disp_clear ;画面クリアー mov poi,#calib ;Calibration call putchar cal1: call convert ;変換 mov wk,high_byte mov wk+1,mid_byte call bin_to_ascii ; mov d4,#11000000b+6 ;DC表示スタートアドレス ; call write_lcd4 ; mov poi,#dcv ;DC ; call putchar mov d4,#11000000b+8 ;サイン表示スタートアドレス call write_lcd4 call disp ;結果の表示 mov poi,#v ;V call putchar ;データチェック(30000カウント) mov command_byte,#092h ;gain reg read call read_register cjb wk,#075h,calinc2 cja wk,#075h,caldec2 cjb wk+1,#030h,calinc1 cja wk+1,#030h,caldec1 jmp main ;menu end ;データの調整 calinc1: add low_byte,#40h jnc cal_next calinc2: add mid_byte,#01h jnc cal_next inc high_byte jmp cal_next caldec1: sub low_byte,#40h jc cal_next caldec2: sub mid_byte,#01h jc cal_next dec high_byte cal_next: call gain_write jmp cal1 ;**************************************************************** ;* キー入力 * ;**************************************************************** keyin: snb key_flag ret mov !rb,#11000010b ;DB6-DB7ピンをINに clrb swe ;SWイネーブル=0 mov w,rb ;キーデータ and w,#11000000b xor w,#11000000b mov swsts,w ;make SW Status not swold ;make SW UP data and w,swold mov swup,w mov swold,swsts ;make SW OLD data setb swe mov !rb,#00000010b ;ポートBの設定 cse swup,#0 setb key_flag ;キーの受付 ret ;**************************************************************** ;* キー入力(入力があるまで戻らない) * ;**************************************************************** key: clrb key_flag key0: call keyin jnb key_flag,key0 ;キー入力待ち clrb key_flag jmp wait ; ret ;**************************************************************** ;* CS5529の変換 * ;**************************************************************** convert: clrb ad_cs ;CS=L mov command_byte,#0c0h ;single conv call send_spi ;A/Dへ書き込み setb ad_cs ;CS=H done1: mov wait_cn,#20 ;wait 20ms call wait ;EEPROMの書き込み許可 clrb rom_cs mov w,#00000110b call send_spi ;書き込み許可コマンドの送信 setb rom_cs call keyin mov command_byte,#094h ;configから読み込み call read_register sb low_byte.3 jmp done1 ;---------------------------------------変換終了 mov command_byte,#096h ;変換データ読み込み jmp read_register ; ret ;**************************************************************** ;* 16ビットデータをサイン付きに変換 * ;**************************************************************** cvt_dat: clrb sign mov w,high_byte add w,#80h sc ret ;変換データが正 ;---------------------------------------;変換データが負 setb sign not high_byte not mid_byte ret ;**************************************************************** ;* CS5529のConfigRegへ書き込み * ;**************************************************************** write_config: mov command_byte,#084h ;configに書き込み mov mid_byte,#10100000b ;1.88Hz jmp write_register ; ret ;**************************************************************** ;* CS5529へ全データ書き込み * ;**************************************************************** write_register: clrb ad_cs ;CS=L mov w,command_byte call send_spi ;コマンドの送信 mov w,high_byte call send_spi ;上位バイトの送信 mov w,mid_byte call send_spi ;中位バイトの送信 mov w,low_byte call send_spi ;下位バイトの送信 setb ad_cs ;CS=H ret ;**************************************************************** ;* CS5529の全データ読み込み * ;**************************************************************** read_register: clrb ad_cs ;CS=L mov w,command_byte call send_spi ;コマンドの送信 call receive_spi ;上位バイトの受信 mov high_byte,w call receive_spi ;中位バイトの受信 mov mid_byte,w call receive_spi ;下位バイトの受信 mov low_byte,w setb ad_cs ;CS=H ret ;**************************************************************** ;* シリアルSPIバスへ1バイト書き込み * ;**************************************************************** send_spi: mov spdr,w mov counter1,#08h ;ループカウンターセット send_spi0: clrb sclk rl spdr ;左回転 snc setb sdi ;carry=1で書き込みビット=1 sc clrb sdi ;carry=0で書き込みビット=0 setb sclk nop djnz counter1,send_spi0 clrb sclk clrb sdi ;シリアルデータの立ち下げ ret ;**************************************************************** ;* シリアルSPIバスの1バイト読み込み * ;**************************************************************** receive_spi: mov counter1,#08h ;ループカウンターセット receive_spi0: clrb sclk snb sdo ;skip if sdo=0 stc ;set carry sb sdo ;skip if sdo=1 clc ;clear carry rl spdr ;左回転 setb sclk nop djnz counter1,receive_spi0 clrb sclk mov w,spdr ret ;**************************************************************** ;* 16ビットバイナリ→アスキーデータに変換 * ;*--------------------------------------------------------------* ;* high_byte,mid_byte * ;**************************************************************** bin_to_ascii: ;データが7FFFでオーバー判定する cjne high_byte,#07fh,cvt_bcd cjne mid_byte,#0ffh,cvt_bcd mov fsr,#bcd_data ;格納場所初期値 mov poi,#over mov counter,#5 ;5桁分 over0: mov w,poi call title_tbl mov indirect,w inc fsr inc poi djnz counter,over0 ret cvt_bcd ;10進変換(上位桁は0下位桁のみ) mov fsr,#bcd_top ;格納場所初期値 call devide ;最下位変換 call devide call devide call devide call devide ;最上位変換 ;アスキーデータに変換(上位桁に3を加算) mov counter,#5 ;5桁分 mov fsr,#bcd_data ;格納場所初期値 cvt_ascii0: mov work,indirect add work,#030h mov indirect,work inc fsr djnz counter,cvt_ascii0 ret ;======================================= devide: mov counter,#16 ;16ビットくり返し clr work devide0: clc rl mid_byte rl high_byte rl work movlw 11110110b addwf work,0 snc ;skip if carry=0 mov work,w snc ;skip if carry=0 inc mid_byte djnz counter,devide0 ;skip if counter=0 dec fsr mov indirect,work ;余り ret ;**************************************************************** ;* A/Dデータの表示(disp_rs=1でRSに出力) * ;*--------------------------------------------------------------* ;* レンジによりデシマルポイントを追加する 計7桁 * ;* レンジ情報 表示 * ;* 320mV 00000000 +.32000 * ;* 3.2V 00010000 +3.2000 * ;* 32.0V 00100000 +32.000 * ;* 320V 00110000 +320.00 * ;**************************************************************** disp: ;レンジ情報の取得 mov eeadr,#rng call read_eeprom swap eedata inc eedata setb lcd_rs mov counter,#7 ;7桁分 mov fsr,#bcd_data ;格納場所初期値 sb sign mov w,#'+' snb sign mov w,#'-' mov d4,w jmp disp2 disp0: decsz eedata jmp disp1 mov d4,#'.' jmp disp2 disp1: mov d4,indirect inc fsr disp2: sb disp_rs call write_lcd4 ;LCDに出力 snb disp_rs call transmit ;データ送信 snb log_out call transmit ;データ送信 djnz counter,disp0 clrb lcd_rs sb log_out ret clrb log_out mov d4,#0dh jmp transmit ;改行送信 ; ret ;**************************************************************** ;* RS232C送信 * ;**************************************************************** transmit: setb txd not d4 mov rs,#btime trans05: djnz rs,trans05 ;スタートビット mov cn,#8 nop trans10: rr d4 nop movb txd,c ; データ出力(LSBから) mov rs,#btime trans15: djnz rs,trans15 ;8ビットデータ djnz cn,trans10 nop nop clrb txd mov rs,#btime trans20: djnz rs,trans20 ;ストップビット ret ;**************************************************************** ;* A/Dのゲインを設定 * ;**************************************************************** gain_read: call get_gain_adr call eeprom_adr call read_eeprom mov high_byte,eedata inc eeadr call read_eeprom mov mid_byte,eedata inc eeadr call read_eeprom mov low_byte,eedata mov command_byte,#082h ;gain reg write jmp write_register ; ret ;**************************************************************** ;* A/Dのゲインを書き込み * ;**************************************************************** gain_write: call get_gain_adr call eeprom_adr mov eedata,high_byte call write_eeprom inc eeadr mov eedata,mid_byte call write_eeprom inc eeadr mov eedata,low_byte call write_eeprom mov command_byte,#082h ;gain reg write jmp write_register ; ret ;**************************************************************** ;* A/Dのゲインデータのアドレス取得 * ;**************************************************************** get_gain_adr: mov eeadr,#rng call read_eeprom clr work csbe eedata,#00000000b ;320mV inc work csbe eedata,#00010000b ;3.2v inc work csbe eedata,#00100000b ;32v inc work ret eeprom_adr: mov w,#r0gain add w,work add w,work add w,work mov eeadr,w ret ;**************************************************************** ;* OKを表示 * ;**************************************************************** disp_ok: mov poi,#ok ;OK? jmp putchar ; ret ;**************************************************************** ;* レンジを表示 表示アドレスをセット後CALL * ;**************************************************************** disp_range: mov poi,#range ;RANGE= call putchar call get_gain_adr mov w,#range0 add w,work add w,work add w,work add w,work add w,work mov poi,w jmp putchar ;現在のレンジを表示 ; ret ;**************************************************************** ;* インターバルを表示 表示アドレスは1行目の先頭 * ;**************************************************************** disp_intval: mov poi,#int_val ;Intval= call putchar mov eeadr,#intval call read_eeprom clr work csbe eedata,#00 inc work csbe eedata,#01 inc work csbe eedata,#05 inc work csbe eedata,#10 inc work csbe eedata,#30 inc work mov w,#val00 add w,work add w,work add w,work mov poi,w jmp putchar ;現在のインターバルを表示 ; ret ;**************************************************************** ;* インターバルを出力 * ;**************************************************************** out_intval: setb disp_rs ;rs-232cに出力 call disp_intval ;Intval=XX clrb disp_rs mov d4,#0dh jmp transmit ;改行送信 ; ret ;**************************************************************** ;* LCD画面クリアー * ;**************************************************************** disp_clear: mov d4,#00000001b ;クリアコマンド call write_lcd4 mov wait_cn,#2 ;クリアが終わるまで待つ jmp wait ; ret ;**************************************************************** ;* データのロギング * ;**************************************************************** logdat: mov eeadr,#intval call read_eeprom cse eedata,time1m ret ;---------------------------------------;データの記録 cje cnt,#080h,logend ;256 bit eeprom logdat1: ;タイマーのクリアー clrb gie clr time20 clr time1s clr time1m setb gie ;ロガー数の表示 mov wk,high_byte mov wk+1,mid_byte call disp_log ;ログ数の表示 mov high_byte,wk mov mid_byte,wk+1 ;データの格納 mov eedata,log_cnt+1 mov eeadr,#total+1 call write_eeprom mov eedata,log_cnt mov eeadr,#total call write_eeprom ;アドレスの格納 call write ;データの格納 ;カウンターのインクリメント add cnt+1,#2 jnc logdat0 inc cnt logdat0: incsz log_cnt+1 jmp logend inc log_cnt logend: setb log_out ;データ出力フラグ ret ;**************************************************************** ;* ログ数の表示 * ;**************************************************************** disp_log: mov high_byte,log_cnt mov mid_byte,log_cnt+1 call bin_to_ascii mov d4,#11000000b ;スタートアドレス call write_lcd4 setb lcd_rs mov counter,#5 ;5桁分 mov fsr,#bcd_data ;格納場所初期値 mov eedata,#0ffh jmp disp1 ;アドレス表示 ; ret ;**************************************************************** ;* 外部EEPROMの書き込み * ;**************************************************************** write: clrb rom_cs mov w,#00000010b call send_spi ;書き込みコマンドの送信 mov w,cnt call send_spi ;上位アドレス書き込み mov w,cnt+1 call send_spi ;下位アドレス書き込み mov w,high_byte call send_spi ;上位データ書き込み mov w,mid_byte call send_spi ;下位データ書き込み setb rom_cs ret ;**************************************************************** ;* 外部EEPROMの読込 * ;**************************************************************** read: clrb rom_cs mov w,#00000011b call send_spi ;読込コマンドの送信 mov w,cnt call send_spi ;上位アドレス書き込み mov w,cnt+1 call send_spi ;下位アドレス書き込み call receive_spi mov high_byte,w ;上位データ読込 call receive_spi mov mid_byte,w ;下位データ読込 setb rom_cs ret ;**************************************************************** ;* 8ビットモード専用液晶ライト * ;**************************************************************** write_lcd8: and d8,#11110000b or d8,#00000100b mov rb,d8 ;RBポートへ出力 setb lcd_e ;Eピンを'H' nop clrb lcd_e mov wait_cn,#1 jmp wait ; ret ;**************************************************************** ;* 4ビットモード専用液晶ライト * ;**************************************************************** write_lcd4: mov d8,d4 call write_lcd8 mov d8,d4 swap d8 jmp write_lcd8 ; ret ;**************************************************************** ;* EEPROM読込 * ;*--------------------------------------------------------------* ;* 入力=eeadr 出力=eedata * ;**************************************************************** read_eeprom: clrb gie setb rp0 setb rd clrb rp0 setb gie ret ;**************************************************************** ;* EEPROM書き込み * ;**************************************************************** write_eeprom: clrb gie setb rp0 setb wren mov eecon2,#55h mov eecon2,#0aah setb wr write_eeprom0: jb wr,write_eeprom0 clrb rp0 setb gie ret ;**************************************************************** ;* msオーダーのウェイト * ;**************************************************************** wait: clr wait_cn2 wait1: nop nop nop nop nop nop nop djnz wait_cn2,wait1 djnz wait_cn,wait ret