

現在SDカード内の sample.txt には行ごとに `1,3,5,6,17...` と数字があり、これはカウンタ値として `val` に代入されます。  
`val=TimeDivCounter` となったら `switch`
内が実行されモータを回転させたいのですが、下記コードにて問題がいくつかあり、その解決方法が分からなくつまずいているので教えていただければ幸いです。

**実現したいこと**  
SDカードから1行ずつ値を得て `val` に代入し、モータ回転させたい。

**疑問点**  
今割り込みは 1ms で行われているが、SDカードからの読み取り間に合うのか。

**現状のコード**

<https://writening.net/page?VJ47Xp>

[code]

    #include<SD.h>
    #include<SPI.h>
    
    int APHASE=2;
    int AENBL=3;
    int BPHASE=6;
    int BENBL=7;
    volatile int count=0;
    volatile int RotCounter=0;
    volatile int TimeDivCounter=0;
    volatile int datacount=0;
    volatile int val;
    
    ISR(TIMER1_COMPA_vect){ //1ms(0.001s)で読みだす
        //18度回転の処理
        if(TimeDivCounter==val){//==のあとの数字はSDの値
            switch(RotCounter){
                case 0:
                    digitalWrite(APHASE, LOW);
                    digitalWrite(AENBL, HIGH);
                    digitalWrite(BPHASE, LOW);
                    digitalWrite(BENBL, HIGH);
                    break;
                case 1:
                    digitalWrite(APHASE, HIGH);
                    digitalWrite(AENBL, HIGH);
                    digitalWrite(BPHASE, LOW);
                    digitalWrite(BENBL, HIGH);
                    break;
                case 2:
                    digitalWrite(APHASE, HIGH);
                    digitalWrite(AENBL, HIGH);
                    digitalWrite(BPHASE, HIGH);
                    digitalWrite(BENBL, HIGH);
                    break;
                case 3:
                    digitalWrite(APHASE, LOW);
                    digitalWrite(AENBL, HIGH);
                    digitalWrite(BPHASE, HIGH);
                    digitalWrite(BENBL, HIGH);
                    break;
            }
            RotCounter++;
    
            if(RotCounter>=4){
                RotCounter=0;
            }
            TimeDivCounter=0;
        }else{
            TimeDivCounter++;
        }
    }
    
    void setup() {
        pinMode(APHASE,OUTPUT);
        pinMode(AENBL,OUTPUT);
        pinMode(BPHASE,OUTPUT);
        pinMode(BENBL,OUTPUT);
        digitalWrite(AENBL,HIGH);
        digitalWrite(BENBL,HIGH);
    
        Serial.begin(9600);
        while (!Serial) {
            ;
        }
        Serial.println("SDカードの初期化");
    
        if (!SD.begin(4)) {
            Serial.println("初期化に失敗");
            while(1);
        }
        Serial.println("初期化完了");
    
        //ファイルを開く,1sごとにデータとる
        if(datacount==1000){
            File dataFile = SD.open("sample.txt");
            if(dataFile){
                while (dataFile.available()){
                    val=dataFile.parseInt();
                    Serial.println(val);
                }
                dataFile.close();
            }else{
                Serial.println(F("error opening sample.txt"));
            }
    
            TCCR1A = 0b00000010;
            TCCR1B = 0b00000011;
            TIMSK1 = 0b00000010;
            OCR1A = 249;
        }
    
        void loop(){
        }
    
[/code]


CC BY-SA 4.0
2020-09-11T17:52:10.797
70324
2020-09-12T08:23:58.670
2020-09-12T07:09:41.687
32986
41866
question
c arduino
ArduinoとSDカードについて


変数datacountは、プログラムの最初のほうで

[code]

    volatile int datacount=0;
    
[/code]

と、初期値の0が入れられているだけで、その後datacountに別の値が代入されませんから、値は0のままです。

そのため、loopの中のIF文の条件(datacount==1000)が満たされることは永遠に無く、SDのファイルが開かれることもありません。

[code]

        //ファイルを開く,1sごとにデータとる
    if(datacount==1000){
        File dataFile = SD.open("sample.txt");
        if(dataFile){
    
[/code]

これが思ったように動かない原因だと思います。

１msごとの割り込みで、カウンター(変数datacount)の値を増やしてゆき、カウンターの値が1000に達したら、SDからの読み込みをするようにプログラムを修正してみてください。


CC BY-SA 4.0
2020-09-12T08:23:58.670
70329
2020-09-12T08:23:58.670
217
70324
answer