collapse

* Posts Recentes

+ LASERs por dropes
[03 de Julho de 2025, 19:35]


Cerca eléctrica por SerraCabo
[14 de Junho de 2025, 23:26]


Alguém arranja motores? por almamater
[10 de Junho de 2025, 22:34]


Condensador 4.7uF 0603 por brunus
[09 de Junho de 2025, 15:52]


Lenovo IdeaPad 3 Não liga por jm_araujo
[07 de Maio de 2025, 19:10]


Identificar Diodo Zenner por filjoa
[01 de Maio de 2025, 23:07]


Meu novo robô por dropes
[18 de Março de 2025, 14:51]


JBL partybox On-The-Go por almamater
[21 de Fevereiro de 2025, 23:32]


Talking Reverse Engineering with an Absolute Legend! por SerraCabo
[13 de Fevereiro de 2025, 09:56]


Motoserra Stihl 120C por brunus
[11 de Fevereiro de 2025, 16:29]

Autor Tópico: Shift registers- Pequena duvida ?!?  (Lida 4910 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline iyahdub

  • Mini Robot
  • *
  • Mensagens: 280
Shift registers- Pequena duvida ?!?
« em: 11 de Maio de 2012, 14:22 »
Quero controlar um Shift register numa situacao parecida com um emulador de DAC basico quase.
Como a intencao e passar a voltagem resultante para um VCO, a resolucao que e possivel chega e sobra para o que quero.
A minha duvida e referente ao shift register do qual nao tenho grande experiencia para alem de uso basico com um ou mais chips em serie.
Gostava de quem tenha experiencia com eles que me de a opiniao para a questao de controlar o speed/rate com que a sequencia e disparada.
Vamos supor para fins deste exemplo, um scanner Larson ( "Kitt, vem-me buscar" lol) .
Um implementacao simples

Código: [Seleccione]
/*este e um caso basico para que possa perceber facilmente qualquer implementacao.
*Pino conectado ao ST_CP do stop*/
int latchPin = 8;
//Pino conectado ao SH_CP of stop
int clockPin = 12;
//Pino conectado ao DS do stop
int dataPin = 11;
int delayInput = 0;//pin para entrada analogica, neste caso um potenciometro
int outDelay =0;//O valor que vamos usar para converter  a leitura do pin analogico do pot para //usar como valor de delay entre accoes

// Saida para 74HC595 (Serial TO Parallel OUT)

void stopout(int numberToDisplay)
{
  // baixar o latchPin para low para que
  // os LEDs nao mudem enquanto os bits sao enviados:
  // digitalWrite(latchPin, LOW);
  // passar os bits:
  shiftOut(dataPin, clockPin, MSBFIRST, numberToDisplay);

  //mudar o latch pin para HIGH para que os leds acendam:
  digitalWrite(latchPin, LOW);
  digitalWrite(latchPin, HIGH);
}

void setup() {
  //Configurar os pins para saida, para poder controlar o shift register
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(delayInput, INPUT);//Atribuir o pin a entrada analogicado potenciometro
  //Apagar qualquer memoria que o 74HC595 possa ter da ultima configuracao dos pins
  stopout(B00000000);
  delay(500);
}

void loop() {
  outDelay = analogRead (delayInput);//Atribuir o valor a leitura, dentro do scope correcto
  stopout(B10000000);//cada 1 representa um led aceso; um 0, um led apagado
  delay(outDelay);
  stopout(B01000000);
  delay(outDelay);
  stopout(B00100000);
  delay(outDelay);
  stopout(B00010000);
  delay(outDelay);
  stopout(B00001000);
  delay(outDelay);
  stopout(B00000100);
  delay(outDelay);
  stopout(B00000010);
  delay(outDelay);
  stopout(B00000001);
  delay(outDelay);
  stopout(B00000010);
  delay(outDelay);
  stopout(B00000100);
  delay(outDelay);
  stopout(B00001000);
  delay(outDelay);
  stopout(B00010000);
  delay(outDelay);
  stopout(B00100000);
  delay(outDelay);
  stopout(B01000000);
}

Agora, apesar de simples, esta maneira trabalha bem para mim... Entretanto gostava de ouvir ideias. Os rates que serao necessarios nunca serao grandes o suficiente para atrasar de algum modo perceptivel o funcionamento. Mas mesmo assim, gostava de ouvir outras ideias e picar os vossos miolos, sff.
De notar que ( entre outros valores e data) o valor do outDelay vai ser tb passado para um LCD, e o mais provavel e tb usar mais um Shift register pelo menos o que me da 16 bits.
Para  casos em que mais precisao de valores sejam necessaarios estou a pensar usar a biblioteca ShiftPWM.
« Última modificação: 11 de Maio de 2012, 14:31 por iyahdub »
ps-Desculpen a falta de pontuacao, mas vivo no estrangeiro e os teclados sao xenofobos !!

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • Tróniquices
Re: Shift registers- Pequena duvida ?!?
« Responder #1 em: 13 de Maio de 2012, 05:07 »
Se a precisão do ponto de disparo não for muito crítica, podes usar o método "multitasking cooperativo":

http://embeddeddreams.com/site/2011/07/10/how-to-do-several-things-at-the-same-time/
http://embeddeddreams.com/site/2011/07/23/more-on-doing-several-things-at-the-same-time/

Caso contrário terás que fazer as coisas acontecer usando uma interrupção. Não é preciso (nem propriamente recomendável) fazer tudo dentro da interrupção; podes simplesmente activar uma flag que estás constantemente a verificar no main loop.

Se te referes a melhorar o código do "justiceiro", então eu faria assim:

loop ()
{
    outDelay = analogRead (delayInput);
    for (unsigned char ctr = 0, mask = 0x80; ctr < 14; ctr++)
    {
        stopout(mask);
        delay(outDelay);
        mask = (ctr < 7? mask >> 1: mask << 1);
    }
}


Não compilei, e pode estar errado por 1 ou 2 contagens mas facilmente levas ao sítio. Repara que este código é relativamente fácil de alterar para fazer apenas um stopout/delay por cada passagem na loop() ;).

Offline iyahdub

  • Mini Robot
  • *
  • Mensagens: 280
Re: Shift registers- Pequena duvida ?!?
« Responder #2 em: 14 de Maio de 2012, 22:35 »
Yah, assim ate posso usar o tipo que eu tinha para padroes mais especificos, se necessario.
Obrigado !!
ps-Desculpen a falta de pontuacao, mas vivo no estrangeiro e os teclados sao xenofobos !!