Это готовит мой мозг часами. Я просто не понимаю, что я делаю неправильно. Код кажется неправильным при вводе цикла 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
Что вы подразумеваете под 'Код кажется неправильным'? –
@ MichałWalenciak Ну, во втором коде первый регистр сдвига дает выход, поэтому он должен делать также и в первом коде. Но код не контролирует _any_ регистров, поэтому кажется, что он даже не учитывает. Я действительно не могу найти ошибку. – Sessho