Ligando 2 shift register em série com lógica (física) invertida

Pessoal, preciso de ajuda pra desenvolver o raciocínio para melhorar o código da seguinte questão:

Quero acender 12 leds (L1 à L12) 1 por vez usando dois shift registers em série (SRA e SRB).
A ligação no SRA acabou ficando invertida, o L1 está na porta H.
No SRB está OK.

Eu consegui (mais ou menos) fazer o que queria, porém o código está uma bagunça pois não consegui desenvolver o raciocínio lógico para tal.

for (int i=0; i<=totalSaidas; i++){
      bitSet(leds, i);
      shiftWrite(leds,i);
      delay(t);
    }
    delay(tempo);
    for (int i=0; i<=totalSaidas; i++){
      bitClear(leds, i);
      shiftWrite(leds,i);
      delay(t);
    }

e o controle do SR:

void shiftWrite(unsigned int _leds, unsigned int pos) {
  digitalWrite(latchPin, LOW);
  if (pos < 8) {
    shiftOut(dataPin, clockPin, MSBFIRST, _leds);
    shiftOut(dataPin, clockPin, MSBFIRST, _leds >> 8);
  }
  else{
    shiftOut(dataPin, clockPin, LSBFIRST, _leds);
    shiftOut(dataPin, clockPin, LSBFIRST, _leds >> 8);
  }
  
  digitalWrite(latchPin, HIGH);
}

No caso queria melhorar, porque assim preciso de outra função para praticamente cada sequencia diferente que tentar com os LEDs

Nunca trabalhei com SR's nestas condições, por isso duvido que consiga ajudar. No entanto fiquei curioso por saber o que fazem as funções:

bitSet(leds, i);

e

bitClear(leds, i);

http://arduino.cc/en/Reference/BitSet
http://arduino.cc/en/Reference/BitClear
Basicamente seta(1) ou zera o bit i na variável leds.
Creio que deve ser uma espécie de macro para leds |= (1<<i) e leds &= ~(1<<i)

PS.: Estou quebrando a cabeça a horas, e acredito que está certo mesmo o que eu fiz visto que ordem dos leds é SRA[7…0],SRB[0…7]

Pensava que as funções eram suas.

Também não entendo o que quer dizer com:

A ligação no SRA acabou ficando invertida, o L1 está na porta H.

Talvez ajudasse o esquema e a ref. do SR.

as portas do Shift Register são de A à H (0 a 7). ao invés de eu ligar o led L0 a porta A (0), liguei a porta H (7) e inverteu todo o resto (L1 -> 6, L2 -> 5, etc). porém, no segundo shift register ficou certo, L8 na porta A, L9 na porta B, etc

Posso até postar o esquemático, mas não seria de grande ajuda sendo que o erro foi na instalação.

O correto aliás, seria eu corrigir a instalação, mas já me custou o domingo inteiro, prefiro tratar disso no software :sweat_smile:

OK, percebi, era o que eu estava a pensar, mas é a parte mais difícil, por isso preferia que não fosse isso.

Então aquilo que tem, não é um Shift Register, mas sim, um Shift Swap Shift Register :slight_smile: .
Eu diria que o código está OK, a menos que após o bitSet(leds, i); faça o swap.

Portanto, aquilo que diz para escrever é: 0000 1100 1110 1001, por exemplo, mas aquilo que realmente quer escrever, devido a essa falha na montagem é: 1100 0000 1110 1001. Por tanto, ou faz aquilo que está a fazer, ou então faz a operação que eu acabei de fazer. Certo?

Luis, acredito que o código é aquilo mesmo, estava com a cabeça tão cansada que não sabia direito o que estava fazendo e na tentativa e erro acabou funcionando para o que eu queria daquele jeito mas não conseguia trabalhar em cima do código.

No caso de mudar a sequencia, é só levar em consideração que a variável led contem os bytes pra cada registrador, e a variável i indica a posição do led na ordem em que ele está instalado.

Postei o vídeo do projeto "final" no outro tópico, mas vou por aqui também para referência futuras:

https://www.youtube.com/watch?v=Yu8I_pT2ZEY

Vi agora mesmo o vídeo no outro tópico. Não sabia que isto era para aquela questão :) . Sim, pelos vistos está a funcionar.