Pages: [1]   Go Down
Author Topic: 74HC595 recebendo sinal serial  (Read 1405 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 7
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3289
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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:
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.
Logged

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).

0
Offline Offline
Newbie
*
Karma: 0
Posts: 7
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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??

Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3289
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

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).

0
Offline Offline
Newbie
*
Karma: 0
Posts: 7
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3289
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

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).

0
Offline Offline
Newbie
*
Karma: 0
Posts: 7
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3289
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

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.
Logged

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).

Pages: [1]   Go Up
Jump to: