2016-06-03 2 views
-2

Это готовит мой мозг часами. Я просто не понимаю, что я делаю неправильно. Код кажется неправильным при вводе цикла if (seereate == ..). Поэтому я хочу прочитать по порядку, применить значение к первому регистру, затем прочитать и применить ко второму регистру, затем прочитать и применить к третьему регистру и, наконец, «сбросить» счетчик (и начать заново).Почему это не контролирует мои регистры сдвига?

#define data_r 2 //data input red register 
#define data_g 3 //data input green register 
#define data_b 4 //data input blue register 
#define clock_r 6 //clock input red register 
#define clock_g 7 //clock input green register 
#define clock_b 8 //clock input blue register 
#define clock 9 //clock pin for all three registers 
#define reset 5 
int seperate; 
int val; 

void setup() { 
    // put your setup code here, to run once: 
    pinMode(clock, OUTPUT); 
    pinMode(clock_r, OUTPUT); 
    pinMode(clock_g, OUTPUT); 
    pinMode(clock_b, OUTPUT); 
    pinMode(data_r , OUTPUT); 
    pinMode(data_g , OUTPUT); 
    pinMode(data_b , OUTPUT); 
    pinMode(reset, OUTPUT); 
    digitalWrite(reset, LOW); 
    delay(50); 
    digitalWrite(reset, HIGH); 
    Serial.begin(9600); 
    while (!Serial); 
    Serial.setTimeout(10); 
} 

void loop() { 
    // put your main code here, to run repeatedly: 
    if (Serial.available()) { 
    int seperate_mod = seperate % 3; 
    Serial.print("seperate_mod = "); 
    Serial.println(seperate_mod); 
    if (seperate_mod == 0) { 

     val = Serial.parseInt(); 
     shiftOut(data_r, clock_r, MSBFIRST, val); 

    } else if (seperate_mod == 1) { 

     val = Serial.parseInt(); 
     shiftOut(data_g, clock_g, MSBFIRST, val); 

    } else if (seperate_mod == 2) { 

     val = Serial.parseInt(); 
     shiftOut(data_b, clock_b, MSBFIRST, val); 

    } 
    seperate += 1; 
    } 
} 

Но еще более странным является то, что этот код работает, это только с помощью одного регистра:

#define data 2 
#define clock 6 
#define reset 5 

void setup() 
{ 
    pinMode(clock, OUTPUT); // make the clock pin an output 
    pinMode(data , OUTPUT); // make the data pin an output 
    pinMode(reset, OUTPUT); 
    randomSeed(analogRead(0)); 
    digitalWrite(reset, LOW); 
    delay(1500); 
    digitalWrite(reset, HIGH); 
    Serial.begin(9600); 
    Serial.setTimeout(10); 
    while(!Serial); 
} 

void loop() { 
    if (Serial.available()) { 
    int val = Serial.parseInt(); 
    if (val > 255) { 
     Serial.println("ERR: Value out of range"); 
    } else { 
     shiftOut(data, clock, LSBFIRST, val); 
    } 
    } 
} 

Может кто-нибудь сказать мне, пожалуйста, что я делаю неправильно?


Для ZMO:

5 
5 
5 
5 
5 
>ENTERED A NUMBER< 
0 ; seperate_mod = 0 
1 
4 ; END of conditional 
5 
5 
5 
5 
5 
5 
5 
5 
5 
5 
5 
5 
5 
5 
>ENTERED A NUMBER< 
0 ; seperate_mod = 1 
2 
4 ; END of conditional 
5 
5 
5 
5 
5 
5 
>ENTERED A NUMBER< 
0 ; seperate_mod = 2 
3 
4 ; END of conditional 
5 
5 
5 
5 
5 
5 
5 
+1

Что вы подразумеваете под 'Код кажется неправильным'? –

+0

@ MichałWalenciak Ну, во втором коде первый регистр сдвига дает выход, поэтому он должен делать также и в первом коде. Но код не контролирует _any_ регистров, поэтому кажется, что он даже не учитывает. Я действительно не могу найти ошибку. – Sessho

ответ

0

Может кто-нибудь сказать мне, пожалуйста, что я делаю неправильно?

Ваш код выглядит в основном с первого взгляда, поэтому, скорее всего, это будет что-то еще в контексте вашего кода, который не подходит.

  • Вы пытались добавить отладочные отпечатки?
  • Вы пытались использовать отладчик (используя устройство, такое как ICM Atmel)?

Здравый смысл сомневаться в себе, когда то, что вы написали, не работает так, как вы ожидаете, - если предположить, что PEBCAK часто является первым лучшим ответом. Но тогда, проходя через ваш код, отображение значений по пути докажет вам, делаете ли вы это правильно или неправильно, и если это неправильно, то где.

Тогда мне кажется, что ваш код вообще не работает, потому что Serial инициализация блокируется навсегда в setup() или потому, что Serial.available() никогда не будет правдой по каким-либо другим причинам.


Вы можете попробовать добавить, что другое заявление отладки печати:

void loop() { 
    // put your main code here, to run repeatedly: 
    if (Serial.available()) { 
    int seperate_mod = seperate % 3; 
    Serial.print("0 ; seperate_mod = "); 
    Serial.println(seperate_mod); 
    if (seperate_mod == 0) { 
     Serial.println("1"); 
     val = Serial.parseInt(); 
     shiftOut(data_r, clock_r, MSBFIRST, val); 

    } else if (seperate_mod == 1) { 

     Serial.println("2"); 
     val = Serial.parseInt(); 
     shiftOut(data_g, clock_g, MSBFIRST, val); 

    } else if (seperate_mod == 2) { 
     Serial.println("3");  

     val = Serial.parseInt(); 
     shiftOut(data_b, clock_b, MSBFIRST, val); 

    } 
    seperate += 1; 
    Serial.println("4 ; END of conditional"); 
    } 
    Serial.println("5"); 
} 

и обновить свой вопрос с результирующим выходом?

+0

Но код застревает после Serial.println (seperate_mod); (он печатает его, а затем shiftOut не работает, поэтому он просто возвращается в цикл) – Sessho

+0

, пожалуйста, cf мое редактирование обновит ваш Q с необходимым выходом – zmo