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.
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

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.

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

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?

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

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.
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Go Up
 

Quick Reply

With Quick-Reply you can write a post when viewing a topic without loading a new page. You can still use bulletin board code and smileys as you would in a normal post.

Warning: this topic has not been posted in for at least 120 days.
Unless you're sure you want to reply, please consider starting a new topic.

Note: this post will not display until it's been approved by a moderator.
Name:
Email:

shortcuts: alt+s submit/post or alt+p preview