Go Down

Topic: 74HC595 recebendo sinal serial (Read 1 time) previous topic - next topic

difemen

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
Code: [Select]

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);
     
   
}

bubulindo

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:

Code: [Select]
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:
Code: [Select]

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.
This... is a hobby.

difemen

muitissimo obrigado pela ajuda....

fiz a alteração que voce sugeriu

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

porque??


bubulindo

Eu vejo isto mais tarde... Os bits vão estar invertidos e provavelmente a Serial.print() não coloca o leading zero na string.

This... is a hobby.

difemen

mas não é so no serial print....os leds se comportam assim

bubulindo

O serial print vai condizer com os LEDs... ligaste o sinal de carry?

This... is a hobby.

difemen

;/ acredito que não. voce consegue me dizer como ou dar um exemplo??

bubulindo

Já viste isto:

http://www.arduino.cc/en/Tutorial/ShiftOut
e isto:

http://arduino.cc/forum/index.php?topic=62858.0   ?

Experimentaste código assim:

Code: [Select]


index = 15;
b = 0; //importante.
while (index-- >= 0) {
    inChar = Serial.read();
    if (inChar == '1') {   
        b|= 1<< index;
    }
}


O problema está nos shifts creio... mas se vais passar logo 16 bits é preferível fazer isto duma vez em vez de fazeres um byte de cada vez.

Experimenta o código como escrevi agora.
This... is a hobby.

Go Up