ola amigos, estou enfrenteando um problema e gostaria da ajuda de vocês se possivel.
gostaria de enviar via serial por exemplo 1111000110110101 e gostaria que os registradores ligassem os leds na mesma sequencia. Eu tentei usar o codigo que fiz abaixo mas por exemplo quando envio via serial 11111111111111 ele retorna 111111101111110. alguem sabe me dizer qual o erro???
Obrigado
int latchPin = 8;
int clockPin = 12;
int dataPin = 11;
char inChar;
int index = 0;
byte b;
void setup() {
Serial.begin(9600);
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop() {
while (Serial.available() >0)
{
if(index<8){
inChar = Serial.read();
index++;
if(inChar == '1'){
b |= 1;
}else{
b |= 0;
}
b <<= 1;
}
}
if(index==8){
escreve();
index=0;
Serial.print(b, BIN);
}
}
void escreve()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, b);
digitalWrite(latchPin, HIGH);
}
Quando index = 7 (ou seja, o último bit do byte), tu adicionas o bit que recebeste ao byte e depois fazes um shift para criar espaco para o bit seguinte. No entanto, no byte seguinte, comecas de novo e introduziste um espaco em branco.
Podes fazer algo como:
void loop() {
while (Serial.available() >0)
{
if(index<8){
inChar = Serial.read();
index++;
if(inChar == '1'){
b |= 1;
}else{
b |= 0;// algo OU zero é sempre igual a algo... logo isto não faz nenhum.
}
if (index<7) b <<= 1;//se for o último bit, não precisamos de criar espaco para o seguinte.
}
}
if(index==8){
escreve();
index=0;
Serial.print(b, BIN);
}
}
Se vais mandar 16 bits, podes alterar a variável inChar para unsigned int e alterar os 16 bits dum ciclo só.
E se fosse:
index = 7;
if (index-- >= 0) {
inChar = Serial.read();
if (inChar == '1') {
b|= 1<< index;
}
}
Pode haver problemas nos indices, mas é muito menos rebuscado. Ahh e a direccão dos bits está invertida.
quando coloquei 7 ele me retornava apenas 15 bits...quando coloquei 8 ele me retornou os 16 correto...me diz uma coisa...
quando envio via serial 0101010101010101 ele me retorna 101010111010101
e quando eu mando 1010101010101010 ele retorna 1010101010101010