\o/ Ajuda pra entender sintaxe 74HC595 RESOLVIDO

Pessoal, tô montando um novo expansor, pq queimei todos os meus PCF8574 :D e, como ele é bem mais caro, mudei pro 74HC595.

A montagem é bastante simples:

http://arduino.cc/en/Tutorial/ShiftOut

mas os códigos são mais complidados e não funcionaram, fazendo o garagino reiniciar.

Então busquei no instructables esse código, mas não entendo a sintaxe dele. Além disso, ao invés de contar os bytes, simplesmente pisca todos os LEDs ao msm tempo.

Agradeceria se alguém me ajudasse nos comentários a entender a lógica dessa sintaxe pra eu poder modifica-la/corrigi-la:

int clockPin = 12; //IC Pin 11, Yellow Jumper
int dataPin = 11; //IC Pin 14, Blue Jumper
int latchPin = 8; //IC Pin 12, Green Jumper

// aqui começa o problema

// byte é um tipo de dado, tranquilo, mas como funciona essa sintaxe?

// parece uma matriz de 30 termos, mas só contei 28 :/

byte patterns[30] ={

B00000001, 100,
B00000010, 100,
B00000100, 100,
B00001000, 100,
B00010000, 100,
B00100000, 100,
B01000000, 100,
B10000000, 100,
B01000000, 100,
B00100000, 100,
B00010000, 100,
B00001000, 100,
B00000100, 100,
B00000010, 100
};

// não entendi essa sintaxe da função byte :(

//o valor 30 representa oq? qual sua função?

//o valor decimal 100 no final de cada byte representa oq?

int index = 0;
int count = sizeof(patterns) / 2;

//como assim o tamanho do byte patterns???

void setup()

{
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}

void loop()

{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, patterns[index * 2]);

// essa linha ta descrita assim no arduino.cc:

//shiftOut(dataPin, clockPin, bitOrder, value)

//MSBFIRTS=bit mais significante primeiro, como saber qual é mais significante?

// valor = patterns[index * 2], pra que multiplicar index por 2?

digitalWrite(latchPin, HIGH);
delay(patterns[(index * 2) + 1]);

//pra que esse incremento no delay ?
index++;
if (index >= count){
index = 0;
}
}

Exibições: 1669

As respostas para este tópico estão encerradas.

Respostas a este tópico

Vê se essa imagem "da uma luz nas ideia".

A diferença é que o 595 tem um latch (memória de 1 bit) para armazenamento do estado.

Aqui nesse link do Rogercom podes ler um pouco mais sobre o funcionamento: http://rogercom.com/pparalela/Dsp32es.htm

Multiplexador funcionando com 16 LEDs as 4:30 da madrugada (ô vício!).

Por algum motivo não consegui ativar 32 leds, só 16.

Segue o código e novos problemas pra chegar aos 64 LEDs, se alguem puder ajudar:

/*
Projeto Arduino contador binário com saída em 8 leds que formam 1 byte.
Por Jota
Modificado por j011yr0g3r no labdegaragem.com em 28/10/2013.
----------------------------------------
--=<| www.ComoFazerAsCoisas.com.br |>=--
----------------------------------------
*/
int const clock = 2; //pino do arduino ligado ao clock do 74HC595
int const latch = 3; //pino do arduino ligado ao latch do 74HC595
int const data = 4; //pino do arduino ligado ao data do 74HC595

void setup()
{
//definindo os pinos como de saída
pinMode(clock,OUTPUT);
pinMode(latch,OUTPUT);
pinMode(data,OUTPUT);
}

void loop()
{
//Contando de 0 até 255 (para 8 LEDs). Aqui mudei o valor de i pra 65535 (16 leds, 1.111.111.111.111.111 em binario)
for (int i = 0; i < 65535; i++)
{
digitalWrite(latch,LOW); //permite o fluxo dos dados. Se utilizar 8 LEDs, x<8. Pra 16 LEDs, x<16.
for (unsigned long x = 0; x < 16; x++)
{
digitalWrite(clock,LOW); //pronto para receber o bit.
if (i & (1 x))
{
digitalWrite(data,HIGH);
}
else
{
digitalWrite(data,LOW);
}
digitalWrite(clock,HIGH); //grava o bit recebido.
}
digitalWrite(latch,HIGH); //finaliza o fluxo dos dados e envia os 8 bits.
delay(50); //tempo de espera entre a exibição de um número e o outro.
// com 16 LEDs e 100 milissegundos vc dorme e no termina a contagem :D
//Grande duvida: montei com 32 LEDs e no funcionou.
//Tentei mudar o tipo de dados de i pra long, unsigned int, unsigned long e nem assim.
//Trava tudo, acende todos os LEDs e nao inicia a contagem.
//Nova solucao, novo problema, alguem pode me ajudar nisso?
}
}


Ache outros vídeos como este em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)

No meu blog tem vários posts sobre o 595, pesquise 74HC595 por lá: http://automatobr.blogspot.com.br

Resolvido \o/ Só pude postar agora pq precisava relembrar depois de todo esse tempo e hoje tive um tempinho, mas vai lá: Fiz umas modificações pra contar bits de 0 a 256, 1 byte por minuto:

/*
This code lights up each LED connected to
a 74HC595 as determined by the binary value
of a counter.
*/
int led = 13;
// Pin connected to SRCLK of 74HC595
int CLOCK = 2;
// Pin connected to RCLK of 74HC595
int LATCH = 3;
// Pin connected to SER of 74HC595
int DATA = 4;


void setup() {
pinMode(led, OUTPUT);
//set pins to output so you can control the shift register
pinMode(LATCH, OUTPUT);
pinMode(CLOCK, OUTPUT);
pinMode(DATA, OUTPUT);
}

void loop()
{
int t=60000/256;
for (int led=0; led<256; led++)
{
// take the latchPin low
digitalWrite(LATCH, LOW);
// shift out the bits:
shiftOut(DATA, CLOCK, MSBFIRST, led);
//take the latch pin high so the LEDs update:
digitalWrite(LATCH, HIGH);
// pause before next value:
delay(t);
}
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
delay(t); // wait for a second
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
delay(t); // wait for a second
}

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço