質問するログイン新規登録

質問編集履歴

2

誤記あり、追加訂正

2019/02/01 12:33

投稿

azt1999
azt1999

スコア13

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でイニシャライズさせることです。

2019/02/01 12:33

投稿

azt1999
azt1999

スコア13

title CHANGED
File without changes
body CHANGED
@@ -1,4 +1,4 @@
1
- 月からArduinoを始めた超初心者ですが、外部のハードウエアを制御を勉強中です。
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
- いいアイデアが無く、今のところ外部から負のワショットパルに近信号(といって0.5sec.程度?)を貰い、
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
-   //切替時に短時間だけやらせたい処理(1回だけも可)
48
+   digitalWrite(10, LOW);//ここまでが力ループさせず1回だけせたい処理で
43
-          }
49
+   }
44
-   //LOOP処理1
50
+     //通常LOOP処理1
45
51
   }
46
52
 
47
53
   else if(frq < 20000){
48
54
    if (val == 0) {
49
-   //切替時に極短時間だけやらせたい処理(1回だけでも可)
55
+   SPI.beginTransaction(mySPISettings);  
56
+   digitalWrite(10, HIGH);
57
+   SPI.transfer(B01001010);
58
+   SPI.transfer(B11001111);
59
+   digitalWrite(10, LOW);
50
-          }
60
+   }  
51
-   //LOOP処理2
61
+    //通常LOOP処理2
52
62
   }
53
63
 
54
64
   else if(frq < 30000){
55
65
    if (val == 0) {
56
-   //切替時に極短時間だけやらせたい処理(1回だけでも可)
66
+   SPI.beginTransaction(mySPISettings);  
67
+   digitalWrite(10, HIGH);
68
+   SPI.transfer(B01011010);
69
+   SPI.transfer(B11001111);
70
+   digitalWrite(10, LOW);
57
-          }
71
+   }  
58
-   //LOOP処理3
72
+    //通常LOOP処理3
59
73
   }
60
74
 
61
75
   else if(frq < 40000){
62
76
    if (val == 0) {
63
-   //切替時に極短時間だけやらせたい処理(1回だけでも可)
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
-   //切替時に極短時間だけやらせたい処理(1回だけでも可)
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
-   //切替時に極短時間だけやらせたい処理(1回だけでも可)
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
  }