■Garbagecollection■
Last Update : 2010/05/03

■ Waitルーチンを考える・・・・・・

テストプログラム これで計って見ましょう。

#include "2144s.h"

#define LED_B (P6.DR.BIT.B4)
#define LED_R (P6.DR.BIT.B5)
#define SW1 (P7.PIN.BIT.B2)
#define SW2 (P7.PIN.BIT.B3)
#define SW3 (P7.PIN.BIT.B4)
#define SW4 (P7.PIN.BIT.B5)
#define SW5 (P7.PIN.BIT.B6)
#define OUT96 (P9.DR.BIT.B6)

int main(void){
unsigned long i,j,K;
P9.DDR= 0xff;
OUT96 = 0;
LED_B = 0;
while(1){
LED_B = 1;
for (i=0; i<10000; i++){
for (j=0; j<23; j++){
}
}
LED_B = 0;
for (i=0; i<10000; i++){
for (j=0; j<23; j++){
}
}
}
}

青いLEDが光ったり、消えたりします。
この光ってる間の時間を測定してみましょう。

for (i=0; i<1000; i++){
for (j=0; j<1000; j++){
測定時間 4.4秒

for (i=0; i<1000; i++){
for (j=0; j<2000; j++){
測定時間 8.8秒   ちゃんと2倍になってる・・・・そりゃそうだ・・

for (i=0; i<10000; i++){
for (j=0; j<1000; j++){
測定時間 44.0秒  おお〜10倍になってますね。

んじゃ・・・1秒を作るには・・・っと・・
1000/4.4 = 227.272

では・・
for (i=0; i<100; i++){
for (j=0; j<2272; j++){
測定時間 1.0秒  計算どおり(実は若干1秒より少ない・・・)。

表にするとこんな感じか?

 iの値    jの値    時 間  
0 23 100μs
0 227 1ms
2272 10ms
10 2272 100ms
100 2272 1s
1000 2272 10s


普通はアセンブラで、1命令の実行時間で計算するのだろうけど、まぁ厳密でなくとも
少し多めに取れば、周辺装置の制御には問題ないかと・・・

これらをサブルーチン化してCallで呼び出す事で、余裕で間に合うと思う。

こんなやり方は少々邪道ではあるけど・・・

inserted by FC2 system