回答編集履歴

3

参考サイト

2019/05/07 23:55

投稿

ikadzuchi
ikadzuchi

スコア3047

test CHANGED
@@ -193,3 +193,13 @@
193
193
  }
194
194
 
195
195
  ```
196
+
197
+ 追記:
198
+
199
+ 割り込みとSD出力の参考にしたページです。あとデータシートも。
200
+
201
+ [https://qiita.com/suzukinori/items/939cc9f49e535c4eadd7](https://qiita.com/suzukinori/items/939cc9f49e535c4eadd7)
202
+
203
+ [http://usicolog.nomaki.jp/engineering/avr/avrInterrupt.html](http://usicolog.nomaki.jp/engineering/avr/avrInterrupt.html)
204
+
205
+ [https://garretlab.web.fc2.com/arduino_reference/libraries/standard_libraries/SD/File/write.html](https://garretlab.web.fc2.com/arduino_reference/libraries/standard_libraries/SD/File/write.html)

2

試した

2019/05/07 23:55

投稿

ikadzuchi
ikadzuchi

スコア3047

test CHANGED
@@ -15,3 +15,181 @@
15
15
  2つのバッファを交互に使い、書くべき値を作る処理はタイマー割り込みで行い、メインでは512バイト溜まったらSDに書き出すという形でたぶんできると思います。
16
16
 
17
17
  ArduinoのSDライブラリでは割り込みは使っていませんので、ライブラリ自体を書き換えなくてもいけるはずです。
18
+
19
+
20
+
21
+ ---
22
+
23
+ 気になったので試してみました。
24
+
25
+ 割り込みを利用してのバックグラウンドでの書き込み自体はどうやら成功しました。
26
+
27
+ ・400us間隔のタイマー割り込みでバッファに値を溜める
28
+
29
+ ・メインのコードでは「バッファを切り替え、書き込んでいない側のバッファをSDに書き出す」を繰り返す
30
+
31
+ という処理で、SDには値が400us間隔で生成されているような書き込みがなされました。
32
+
33
+ (なお考えてみれば512バイト待つ必要も無かったのと容量を食うのでバッファは256バイトにした)
34
+
35
+
36
+
37
+ ただ、プログラムの挙動は異常で、setup()がループしてしまっています。どこかで割り込みが使われていて干渉しているのかもしれません(SDライブラリ内か、あるいはSerialか、microsも怪しい)。あるいは何かつまらないミスがあるかもしれません。
38
+
39
+ とりあえず思っていた処理はできそうだと分かったので私は満足です。
40
+
41
+ ```Arduino
42
+
43
+ #include <SD.h>
44
+
45
+ #include <SPI.h>
46
+
47
+
48
+
49
+ const byte SD_SS = 4;
50
+
51
+ String fname = "SDwrite.txt";
52
+
53
+ File file;
54
+
55
+
56
+
57
+ unsigned long time_last = 0;
58
+
59
+ unsigned long time_now = 0;
60
+
61
+
62
+
63
+ byte buf[2][256] = {0};
64
+
65
+ int count[2] = {0};
66
+
67
+ byte phase = 0;
68
+
69
+ int i = 0;
70
+
71
+
72
+
73
+ ISR(TIMER2_COMPA_vect)
74
+
75
+ {
76
+
77
+ time_now = micros();
78
+
79
+ i++;
80
+
81
+ unsigned long time_diff = time_now-time_last;
82
+
83
+ buf[phase][count[phase] ] = time_diff&0xFF;
84
+
85
+ buf[phase][count[phase]+1] = (time_diff>> 8)&0xFF;
86
+
87
+ buf[phase][count[phase]+2] = (time_diff>>16)&0xFF;
88
+
89
+ buf[phase][count[phase]+3] = i&0xFF;
90
+
91
+ count[phase]+=4;
92
+
93
+ time_last = time_now;
94
+
95
+ }
96
+
97
+
98
+
99
+ void setup()
100
+
101
+ {
102
+
103
+ TCCR2A = 0b10000010;
104
+
105
+ TCCR2B = 0b00000011; // clk/32
106
+
107
+ OCR2A = 199; // 400usで割り込み
108
+
109
+ TIMSK2 = 0b00000010;
110
+
111
+ Serial.begin(57600);
112
+
113
+
114
+
115
+ unsigned long temp = 0L;
116
+
117
+
118
+
119
+ if (!SD.begin(SD_SS))
120
+
121
+ {
122
+
123
+ Serial.println("SD_FAIL");
124
+
125
+ return;
126
+
127
+ }
128
+
129
+
130
+
131
+ Serial.println("start");
132
+
133
+ file = SD.open(fname, FILE_WRITE); //ファイル新規作成、書き込みモード
134
+
135
+ sei();
136
+
137
+
138
+
139
+ byte buf_x[100] = {0};
140
+
141
+ int num = 100;
142
+
143
+
144
+
145
+ while (true)
146
+
147
+ {
148
+
149
+ if(micros() > 5000000L)
150
+
151
+ {
152
+
153
+ break;
154
+
155
+ }
156
+
157
+ phase ^= 1;
158
+
159
+ temp += count[phase^1];
160
+
161
+ if(count[phase^1] != 0)
162
+
163
+ {
164
+
165
+ file.write(buf[phase^1], count[phase^1]);
166
+
167
+ count[phase^1] = 0;
168
+
169
+ }
170
+
171
+ }
172
+
173
+ file.close();
174
+
175
+
176
+
177
+ Serial.println("close");
178
+
179
+ Serial.println(i);
180
+
181
+ Serial.println(temp);
182
+
183
+ }
184
+
185
+
186
+
187
+ void loop()
188
+
189
+ {
190
+
191
+ //何もしない
192
+
193
+ }
194
+
195
+ ```

1

誤字訂正

2019/05/07 16:48

投稿

ikadzuchi
ikadzuchi

スコア3047

test CHANGED
File without changes