質問編集履歴
2
誤記あり、追加訂正
title
CHANGED
File without changes
|
body
CHANGED
@@ -20,6 +20,7 @@
|
|
20
20
|
#include <SPI.h>
|
21
21
|
#define SS_PIN 10
|
22
22
|
|
23
|
+
SPISettings mySPISettings = SPISettings(500000, MSBFIRST, SPI_MODE0);
|
23
24
|
int val = 0;
|
24
25
|
long int frq;
|
25
26
|
|
1
極力ループさせずにやりたい処理はArduino標準ライブラリで外部ICをシリアル2byteでイニシャライズさせることです。
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
先月からArduinoを始めた超初心者ですが、外部のハードウエアを制御を勉強中です。
|
2
2
|
ArduinoのdigitalPin#5に入力された信号を周波数カウンタのスケッチで処理し、6段階に制御を割り振るスケッチを
|
3
3
|
書いてますが、切替にもたつきが出てしまい苦労してます。(周波数を変数として扱い、if構文で割り振り)
|
4
4
|
|
@@ -7,10 +7,8 @@
|
|
7
7
|
[http://interface.khm.de/wp-content/uploads/2009/01/FreqCounter_1_12.zip
|
8
8
|
](http://interface.khm.de/wp-content/uploads/2009/01/FreqCounter_1_12.zip)
|
9
9
|
|
10
|
-
外部のハードウエア制御の関係上、if構文の各ループ切替時のみ極力ループさせず
|
11
|
-
|
12
|
-
別のdigitalpin#6に入れ、Hレベルになった際、処理を力技で止めさせてますが、外部のワンショットパルスの設定幅に
|
13
|
-
自由度が無く、切替時に相当もたつき感があり、レスポンスがよろしく無いです。(切替時に極短時間だけやらせたい処理は1回だけでも可)
|
10
|
+
外部のハードウエア制御の関係上、if構文の各ループ切替時のみ極力ループさせず1回だけさせたい処理(外部のICを標準SPIライブラリでシリアルで送り、2byteでイニシャライズ)ありますが、いいアイデアが無く、今のところ、外部から負のワンショットパルスに近い信号(といっても0.5sec.程度?)を貰い、別のdigitalpin#6に入れ、Hレベルになった際、処理を力技で止めさせてますが、外部のワンショットパルスの設定幅に
|
11
|
+
自由度が無く、切替時に相当もたつき感があり、レスポンスがよろしく無いです。(切替時のイニシャライズは1回だけでも可)
|
14
12
|
|
15
13
|
変数(frq)は若干ふらつきますが(±2%程度)、変数(frq)がダイナミックに切り替わる際のみ、ソフト上でflagを立てて
|
16
14
|
スマートに制御できないか?と考えてますが、いいアイデアが思いつきません。
|
@@ -19,6 +17,8 @@
|
|
19
17
|
現行の外部からワンショットパルスを貰い制御しているスケッチを記述しますので、お知恵をお借りしたくアドバイスお願いします。
|
20
18
|
|
21
19
|
#include <FreqCounter.h>
|
20
|
+
#include <SPI.h>
|
21
|
+
#define SS_PIN 10
|
22
22
|
|
23
23
|
int val = 0;
|
24
24
|
long int frq;
|
@@ -28,6 +28,8 @@
|
|
28
28
|
pinMode(8, OUTPUT);
|
29
29
|
pinMode(7, OUTPUT);
|
30
30
|
pinMode(6, INPUT);
|
31
|
+
SPI.begin(); //SPI有効
|
32
|
+
pinMode(SS_PIN, OUTPUT);
|
31
33
|
}
|
32
34
|
|
33
35
|
void loop(){
|
@@ -39,43 +41,67 @@
|
|
39
41
|
|
40
42
|
if(frq < 10000){
|
41
43
|
if (val == 0) {
|
44
|
+
SPI.beginTransaction(mySPISettings);//ここから
|
45
|
+
digitalWrite(10, HIGH);//
|
46
|
+
SPI.transfer(B01001000);//
|
47
|
+
SPI.transfer(B11001111);//
|
42
|
-
//
|
48
|
+
digitalWrite(10, LOW);//ここまでが極力ループさせず1回だけさせたい処理です
|
43
|
-
|
49
|
+
}
|
44
|
-
|
50
|
+
//通常LOOP処理1
|
45
51
|
}
|
46
52
|
|
47
53
|
else if(frq < 20000){
|
48
54
|
if (val == 0) {
|
49
|
-
|
55
|
+
SPI.beginTransaction(mySPISettings);
|
56
|
+
digitalWrite(10, HIGH);
|
57
|
+
SPI.transfer(B01001010);
|
58
|
+
SPI.transfer(B11001111);
|
59
|
+
digitalWrite(10, LOW);
|
50
|
-
|
60
|
+
}
|
51
|
-
|
61
|
+
//通常LOOP処理2
|
52
62
|
}
|
53
63
|
|
54
64
|
else if(frq < 30000){
|
55
65
|
if (val == 0) {
|
56
|
-
|
66
|
+
SPI.beginTransaction(mySPISettings);
|
67
|
+
digitalWrite(10, HIGH);
|
68
|
+
SPI.transfer(B01011010);
|
69
|
+
SPI.transfer(B11001111);
|
70
|
+
digitalWrite(10, LOW);
|
57
|
-
|
71
|
+
}
|
58
|
-
|
72
|
+
//通常LOOP処理3
|
59
73
|
}
|
60
74
|
|
61
75
|
else if(frq < 40000){
|
62
76
|
if (val == 0) {
|
63
|
-
|
77
|
+
SPI.beginTransaction(mySPISettings);
|
78
|
+
digitalWrite(10, HIGH);
|
79
|
+
SPI.transfer(B01011010);
|
80
|
+
SPI.transfer(B11001111);
|
81
|
+
digitalWrite(10, LOW);
|
64
|
-
|
82
|
+
}
|
65
|
-
//LOOP処理4
|
83
|
+
//通常LOOP処理4
|
66
84
|
}
|
67
85
|
|
68
86
|
else if(frq < 50000){
|
69
87
|
if (val == 0) {
|
70
|
-
|
88
|
+
SPI.beginTransaction(mySPISettings);
|
89
|
+
digitalWrite(10, HIGH);
|
90
|
+
SPI.transfer(B01011110);
|
91
|
+
SPI.transfer(B11001111);
|
92
|
+
digitalWrite(10, LOW);
|
71
|
-
|
93
|
+
}
|
72
|
-
//LOOP処理5
|
94
|
+
//通常LOOP処理5
|
73
95
|
}
|
74
96
|
else{
|
75
97
|
if (val == 0) {
|
76
|
-
|
98
|
+
SPI.beginTransaction(mySPISettings);
|
99
|
+
digitalWrite(10, HIGH);
|
100
|
+
SPI.transfer(B11011010);
|
101
|
+
SPI.transfer(B11001111);
|
102
|
+
digitalWrite(10, LOW);
|
77
|
-
|
103
|
+
}
|
78
|
-
//LOOP処理6
|
104
|
+
//通常LOOP処理6
|
79
105
|
}
|
80
106
|
delay(100);
|
81
107
|
}
|