为什么这不能控制我的移位寄存器?

时间:2016-06-03 22:17:11

标签: arduino

这已经让我的大脑煮了几个小时。我只是不知道自己做错了什么。输入" if(seperate == ..)"时,代码似乎是错误的。环。所以我想从串口读取,将值应用到第一个寄存器,然后读取并应用到第二个寄存器,然后读取并应用到第三个寄存器,最后“#34; reset"柜台(并重新开始)。

#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 :(得分:0)

  

有人能告诉我,我做错了吗?

乍一看,您的代码看起来很不错,因此在代码的上下文中可能会出现其他不正确的内容。

  • 您是否尝试过添加调试打印输出语句?
  • 您是否尝试过使用调试器(使用Atmel ICE等设备)?

当你写的东西没有按照你期望的方式工作时,怀疑自己是一个明智的事情 - 假设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");
}

并使用生成的输出更新您的问题?