気候センシングに挑戦2

3.高速気圧測定プログラム

NEW

1 @ARUN:CLV
4 POKE#880,248,181,224,35,27,136,152,71,0,36,202,38,10,39,9,77,51,136,152,71,3,0,48,59,9,43,3,216,124,67,5,77,228,24,245,231,1,61,0,45,1,221,10,40,240,209,32,0
8 POKE#8B0,248,189,192,70,0,#10,0,0
10 UART0:CLT:CLK:CLO:P=1:PLAY”O4CCC.DD.EFGARARAR”
12 IF SOUND() CONT
14 PLAY”<<AA”:OUT2,1:A=tick()
16 FOR W=#700TO#7FF STEP 2
20 CLS:?”No”;P;:U=USR(#880,#EB):?” “;U
60 LED1:POKE W,PEEK(#8F4),PEEK(#8F5)
70 LED0:GSB @LCD:P=P+1
75 WAIT2
80 NEXT
85 B=tick():OUT2,0:CLS:?”tk=”;B-A;
90 ?” ホゾンチュウ “:W=#700
92 POKE #8EC,PEEK(W),PEEK(W+1):’Q
95 FOR J=0 TO 1:POKE #800+J,PEEK(W+J):NEXT
97 [1]=(U-Q)*86/10
99 LED1:L=2:LRUN1:LED0
100 @continu
110 W=W+2:IF W<=#7FF GOTO 95
120 ?”オワリマシタ”
125 UART2
200 LRUN3:END
990 @LCD:LET[96],640,64,#5639,#C6C,#C080,64:Z=I2CW(62,#8C3,5):Z=I2CW(62,#8C0,3,#900,16):Z=I2CW(62,#8C8,3,#920,16):RTN

SAVE0

プログラム説明では、高速化の手法も解説しています

  • 4-8行目 高速なマシン語サブルーチンをメモリに書き込みます。気圧計測マイコンへデータ要求を伝えて、タイムアウト付きのINPUT処理を行います。
  • 10-14行目 初期設定と開始の合図
  • 16-80行目 高速データ採取処理。128個のデータを採取します。データ採取を高速にするためにむだな処理をはぶいたループになっています。採取したデータはいったん高速アクセス可能なRAMに保存されます。RAMと比較すると低速なEEPROMへの保存はこのループが終わってから行います。
  • 75行目 この数値を大きくすると、 採取間隔が伸びます。
  • 85行目 128個のデータを採取するのにかかった時間(単位 1/60秒)を表示します。速度を計算するときや、グラフの時間軸を決める時に使います。
  • 90-120行目 RAMからデータを読みだして、電源を切っても内容が消えないEEPROMへ保存します。
  • 125-200行目 値の表示やグラフを表示します。この部分は各自で工夫して作っても良いです。
  • 900行目 LCDに表示するためのサブルーチンです。

NEW

1000 @EWRIT2:’Write(Init) to EEPROM
1010 N=0:IF !L ? “EEPROM Undefined L!”:BEEP100,50:LOAD0
1020 IF I2CR(82,#8E6,2,#8E4,2) ?”EEPROM I2C ERROR!”:GOTO@ERR
1030 M=M+1
1035 IF M>16383/L*2 ?”EEPROM OverFlow M=”;M,N:GOTO@ERR

1040 N=M*L*2
1050 N=N<<8|N>>8&#FF
1060 IF I2CW(82,#8E6,2,#800,L*2) ?”EEPROM Write Error WP?”:GOTO@ERR
1070 N=0
1080 R=I2CW(82,#8E6,2,#8E4,2)
1090 @END1:GOSUB @LCD
1100 IF FILE()=1 LRUN0,100
1110 RTN


1111 @EINIT2:N=0:M=0
1112 IF I2CW(82,#8E6,2,#8E4,2) ?”EEPROM I2CW ERROR!”:GOTO@ERR
1113 IF I2CR(82,#8E6,2,#8E4,2) ?”EEPROM I2CR ERROR!”:GOTO@ERR
1114 IF M ?”EEPROM ライトプロテクト?”:GOTO@ERR
1115 ?”EEPROM ヲ ショキカ シマシタ”
1116 IF FILE()=1 LOAD0
1117 RTN
1900 @ERR:BEEP1,-1:CONT

9010 @LCD
9020 LET[96],640,64,#5639,#C6C,#C080,64
9030 Z=I2CW(62,#8C3,5)
9040 Z=I2CW(62,#8C0,3,#900,16)
9050 Z=I2CW(62,#8C8,3,#920,16)
9060 RTN

SAVE1


NEW

2000 @EREAD:’Read from EEPROM
2010 CLS:N=0:Q=0
2020 IF I2CR(82,#8E6,2,#8E4,2) ?”EEPROM I2C ERROR!”:GOTO@ERR
2030 IF !M ?”EEPROM NOT DATA”:BEEP100,50:GOTO @END
2040 IF !L L=2:’INPUT”DATA length?”,L
2050 FOR I=1 TO M
2060 N=I*L*2
2070 N=N<<8|N>>8&#FF
2080 Z=I2CR(82,#8E6,2,#800,L*2)
2090 Q=Q+1
2100 ?”No”;DEC$(I,4);” ,”;
2110 FOR J=0 TO L-1
2120 ?[J];”,”;
2130 NEXT
2140 ?
2150 IF Q<23 GOTO @L4
2160 IF !INKEY() AND !BTN() CONT ELSE Q=0
2170 @L4:NEXT
2180 @END:LC0,POS(2),1
2190 IF !INKEY() AND !BTN() CONT
2200 IF FILE()=2 LOAD0
2210 RTN

2900 @ERR:BEEP1,-1:CONT

SAVE2


NEW

300 @RAM_READ:’Read from RAM
310 CLK:UART2:P=0:G=0:W=#700:GSB800:Q=U
325 CLS:?”ボタンヲオストススミマス”:GSB@LCD
327 GSB @W_KEY
329 CLS:?”No,Pr, H, V
330 FOR W=#700 TO #7FF STEP2
350 GSB 800:IF U=0 LC 14,0:?”Er”
370 LC0,1:?P;”,”;U;”,”;H;”,”;V;” “:GSB@LCD:P=P+1:G=H
374 GSB @W_KEY
380 NEXT
385 GOTO300
390 END
800 POKE #8F4,PEEK(W),PEEK(W+1)
810 H=(U-Q)*86/10
820 V=(H-G)*33
830 RTN
900 @W_KEY:K=INKEY():IF !K AND !BTN() CONT
905 IF K!=8 GOTO 910
906 P=P-2:IF P<0 P=0
907 W=W-4:IF W<#700 W=#700
910 IF !BTN() RTN ELSE CONT
990 @LCD:LET[96],640,64,#5639,#C6C,#C080,64:Z=I2CW(62,#8C3,5):Z=I2CW(62,#8C0,3,#900,16):Z=I2CW(62,#8C8,3,#920,16):RTN


SAVE3

  • 329-350行目 LCDに表示するための処理です
  • 370行目 値を表示します。
  • 800-830行目 RAMの内容を計算後、変数に割り当てるサブルーチンです。
  • 900-910行目 キーボードからの入力、または、ボタンを押すまで待つ処理です。キーボードから「バックスペース」を押すとひとつ戻ります。バックスペースで戻ります。他のキーでは次に進みます。
  • 990行目 LCDに表示するためのサブルーチンです。