Ir ao conteúdo
  • Cadastre-se

Arduino Enviando sinais invertidos para um 74hc595


Ir à solução Resolvido por .if,

Posts recomendados

Postado

Estou fazendo um projeto em Arduino, que pretendo utilizar esta placa para comandos e interface

 

https://photos.app.goo.gl/92KQccPoQwQgCwCt9

A parte dos botões eu já consegui resolver, com a ajuda do pessoal aqui do forum

Agora estou num impasse. Para comandar o display, tem 2 circuitos 74hc595. Eu verifiquei vários exemplos, mas todos usam o comando Shiftout para mandar a informação, com os pinos ligados diretos entre o 74hc595 e o Arduino.
Ocorre que nessa placa que estou trabalhando, entre o cabo e 74hc595, tem um inversor 74hc14d entre os pinos do Arduino e o os circuitos 74hc595.

Caso não for possível, e eu ter que fazer os bits via digitalWrite, eu tenho que usar delay entre os bits?

  • Curtir 1
  • Membro VIP
Postado

Criar seu próprio shiftout e inverter os bits me parece ser uma decisão inteligente.

9 horas atrás, Thiago Miotto disse:

usar delay entre os bits

depende. Se tiver resistor e capacitor nos pinos, há de se cogitar. Tenta sem pra ver.

  • Curtir 1
  • Obrigado 1
  • Membro VIP
Postado

A interface SPI também conversa com hc595

https://www.instructables.com/id/74HC595-Shift-Register-With-Arduino-Uno/

 

digitalWrite (SSpin, LOW);
SPI.transfer(byte_of_data);
// if you are daisychaining, add 2nd, 3rd SPI.transfer(next_byte_of_data )
digitalWrite (SSpin,  HIGH);

https://forum.arduino.cc/index.php?topic=149470.0

 

Rapadura :é sweet mas num é soft não

😁

  • Curtir 1
  • Obrigado 1
Postado
41 minutos atrás, if. disse:

A interface SPI também conversa com hc595

https://www.instructables.com/id/74HC595-Shift-Register-With-Arduino-Uno/

 


digitalWrite (SSpin, LOW);
SPI.transfer(byte_of_data);
// if you are daisychaining, add 2nd, 3rd SPI.transfer(next_byte_of_data )
digitalWrite (SSpin,  HIGH);

https://forum.arduino.cc/index.php?topic=149470.0

 

Rapadura :é sweet mas num é soft não

😁

Pelo que entendi, isso tornaria a rodagem mais rápida. Isso?
Mas Será que no meu caso funcionaria, lembra que tem um hex inverter "pentelho" no meio do caminho?

adicionado 27 minutos depois

Estou com um probleminha aqui que acho que entendi, mas não consigo resolver

Parece que não estou dando "Enter" na mudança no chips. Eu retirei o laço de repetição e condicionei a execução ao aperto de um dos botões.
Ocorre que no aperto, muda o vetor, mas não muda as saídas do chip. Depois disso, se eu aperto um botão. Na 2º execução, ocorre a mudança.

Segue o código da função, coloquei só ele, pois creio que seja aqui que eu devo "dar o enter"

 



 

void changeValues(){
  
  digitalWrite(RCLK, HIGH); //invertido
  for(int i=16; i >=  0; i--){
    digitalWrite(clockPin, HIGH); //invertido
    int PIN = regis[i];
    digitalWrite(SER, PIN);
    digitalWrite(clockPin, LOW); //invertido
  }
  digitalWrite(RCLK, LOW); //invertido  
  
  digitalWrite(clockPin, HIGH);  // sinal de entrada igual ao setup. Se retirar da erro na leitura de botões

  delay(100);
}

 

 

Abaixo eu coloquei o resultado do monitor serial.
O Vetor:0,0,0..... é o conteúdo do vetor regis

 

0-1022, 1-1023... é a leitura analogRead de cada um dos pinos de saída dos 2 chips

 

 

 

Botão 5 Apertado Vetor:0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,518,
0-1022   1-1023   2-1023
3-1023   4-1023   5-1023
6-1023   7-1023   8-1023
9-1023   10-1023
Botão 1 Apertado Vetor:1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,518,
0-1022   1-1023   2-1023
3-1023   4-1023   5-1023
6-1023   7-1022   8-1023
9-1023   10-1023
Botão 5 Apertado Vetor:1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,518,
0-0   1-0   2-0
3-0   4-0   5-0
6-0   7-0   8-0
9-0   10-0
Botão 2 Apertado Vetor:0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,518,
0-0   1-0   2-0
3-0   4-0   5-0
6-0   7-0   8-0
9-0   10-0
Botão 5 Apertado Vetor:0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,518,
0-1023   1-1023   2-1023
3-1023   4-1023   5-1023
6-1023   7-1023   8-1023
9-1023   10-1022

 

 

Postado

@Thiago Miotto ,

 

Que tal você mencionar quais são os sinais do hc595 que estão sendo invertidos ?

 

É muito simples você fazer algo equivalente ao shiftout por software, já levando em conta quais os sinais tem de ser invertidos.

 

Paulo

  • Curtir 1
Postado
3 horas atrás, aphawk disse:

@Thiago Miotto ,

 

Que tal você mencionar quais são os sinais do hc595 que estão sendo invertidos ?

 

É muito simples você fazer algo equivalente ao shiftout por software, já levando em conta quais os sinais tem de ser invertidos.

 

Paulo

Para mim são todos, segue circuito

Branco = SER
RCLK = MARROM
clockPin = Laranja

ps: eu já percebi que não mudei os dados em si. Mas aí eu vejo que o 1 vira 0 e o 0 vira 1.

image.png.2f5ef0525797d49f36e9efa16883f884.png

  • Curtir 1
  • Membro VIP
  • Solução
Postado

Eu minimizaria...

#define SER ...pino do dado
void changeValues(dado){
 
  for(int i=16; i >=  0; i--){
    digitalWrite(SER, !((dado>>(i-1))&1)); //MSB 1º... COLOCA O DADO INVERTIDO E 
    digitalWrite(clockPin, LOW); //invertido       ... DÁ UM 
    digitalWrite(clockPin, HIGH); //invertido      ... PULSO PRA 1 BIT
}
  digitalWrite(RCLK, HIGH); //invertido            ... PULSO PROS
  digitalWrite(RCLK, LOW); //invertido             ... 16 BITS
  
  }

algo como.

 

 

13 horas atrás, Thiago Miotto disse:

Pelo que entendi, isso tornaria a rodagem mais rápida. Isso?
Mas Será que no meu caso funcionaria, lembra que tem um hex inverter "pentelho" no meio do caminho?

Ah táh. A ideia é aproveitar o hw spi do mc. Fica + rápido e economiza recurso de processamente. Remonta ao passado quando cada byte "custava uma fortuna". Não é bem seu caso. Foi só pra mostrar alguma alternativa não pra você mas sim pra navegantes incautos do futuro ok?

E sim o hex (inversor) deve zoar

 

 

  • Obrigado 1
  • Amei 1
Postado
4 horas atrás, if. disse:

Eu minimizaria...


#define SER ...pino do dado
void changeValues(dado){
 
  for(int i=16; i >=  0; i--){
    digitalWrite(SER, !((dado>>(i-1))&1)); //MSB 1º... COLOCA O DADO INVERTIDO E 
    digitalWrite(clockPin, LOW); //invertido       ... DÁ UM 
    digitalWrite(clockPin, HIGH); //invertido      ... PULSO PRA 1 BIT
}
  digitalWrite(RCLK, HIGH); //invertido            ... PULSO PROS
  digitalWrite(RCLK, LOW); //invertido             ... 16 BITS
  
  }

algo como.

 

É o caminho correto ... com todos os sinais invertidos não vejo como usar o hardware SPI ..... então tem de ser bit a bit na marra mesmo como você fez ....

 

Paulo

  • Curtir 2
  • Obrigado 1
Postado
15 horas atrás, if. disse:

Eu minimizaria...


#define SER ...pino do dado
void changeValues(dado){
 
  for(int i=16; i >=  0; i--){
    digitalWrite(SER, !((dado>>(i-1))&1)); //MSB 1º... COLOCA O DADO INVERTIDO E 
    digitalWrite(clockPin, LOW); //invertido       ... DÁ UM 
    digitalWrite(clockPin, HIGH); //invertido      ... PULSO PRA 1 BIT
}
  digitalWrite(RCLK, HIGH); //invertido            ... PULSO PROS
  digitalWrite(RCLK, LOW); //invertido             ... 16 BITS
  
  }

algo como.

 

 

Ah táh. A ideia é aproveitar o hw spi do mc. Fica + rápido e economiza recurso de processamente. Remonta ao passado quando cada byte "custava uma fortuna". Não é bem seu caso. Foi só pra mostrar alguma alternativa não pra você mas sim pra navegantes incautos do futuro ok?

E sim o hex (inversor) deve zoar

 

 


Dado seria que ser um array de 16 posições?
Estou usando a IDE do Arduino
Não compilo lá esse digitalWrite como !((dado...)

E já tinha tentado usar !regis[i] e a IDE ignorou o !
Acabei fazendo um If para resolver. 

 
 
 

Quanto ao erro, momento loiro....
O erro estava em outro lugar do código
Eu só atribuía os valores ao vetor, fazia a leitura do pinos e depois rodava a função de trocar os pinos.....

  • Membro VIP
Postado
7 horas atrás, Thiago Miotto disse:

Dado seria que ser um array de 16 posições?
Estou usando a IDE do Arduino
Não compilo lá esse digitalWrite como !((dado...)

Dado: um inteiro de 16bits. Ele é estraçalhado em bits pela expressão !((dado>>(i-1))&1)) que passa (a cada decremento de i) o 15º...14º...13ºbit.... pro bit0 que é efetivamente o que a digitalwrite quer. Nunca fiz mas tem que compilar sim. Qualquer dia eu tento...

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...