Nada como simplificar ainda mais o teste...
Faz um sketch assim:
setup(){
pinMode(5, OUTPUT);
}
loop(){
digitalWrite(5, 1);
delay(2000);
digitalWrite(5,0);
delay(2000);
}
O pino que estiver a pulsar é o pino 5 e será o que tem um D5 ao lado e não o 5º pino da placa (que é o D2).
A plataforma está feita para que se alguém quiser usar uma saída apenas tem de ver o que diz na placa e não contar pinos. Na placa original isto é um pouco mais evidente devido ao formato esquisito. Numa placa com este formato entendo a confusão que faz.
Experimenta o que disse e vê no que dá.
A propósito, essa lógica para actuar os controlos do mux está muito bem conseguido... no entanto, podes fazer "melhor"
Se vais usar os pinos 2,3 e 4 da placa, que são na realidade os pinos PD2, PD3 e PD4 podes fazer algo assim:
unsigned char count;
for(count = 0 ; count<8 ; count ++){ //count tem o valor do canal que queres ler.
unsigned char temp = (count<<2); //desvias esse valor dois bits para a esquerda
PORTD = temp; // e o bit 0 de count está agora no PD2. :)
}
Isto torna o código um pouco mais rápido de executar. No entanto, se já estiveres a usar os pinos do PORTD isto estraga tudo... para resolveres esse imbróglio, podes fazer assim:
unsigned char count;
for(count = 0 ; count<8 ; count ++){ //count tem o valor do canal que queres ler.
unsigned char temp = (count<<2); //desvias esse valor dois bits para a esquerda
unsigned char mask = PORTD & 0b11100011; //Ler todos os bits menos os três que queremos mudar
PORTD = temp | mask; //
}
Onde vês o estado das saídas e voltas a escrever o mesmo valor lá.
@Hugo
//in Arduino.h
#define bitRead(value, bit) (((value) >> (bit)) & 0x01)
#define bitSet(value, bit) ((value) |= (1UL << (bit)))
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))
#define HIGH 0x1
#define LOW 0x0
//in wiring_digital.h
void digitalWrite(uint8_t pin, uint8_t val)
{
uint8_t timer = digitalPinToTimer(pin);
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
volatile uint8_t *out;
if (port == NOT_A_PIN) return;
// If the pin that support PWM output, we need to turn it off
// before doing a digital write.
if (timer != NOT_ON_TIMER) turnOffPWM(timer);
out = portOutputRegister(port);
uint8_t oldSREG = SREG;
cli();
if (val == LOW) {
*out &= ~bit;
} else {
*out |= bit;
}
SREG = oldSREG;
}
Ou seja, o bitRead apenas retorna 0 ou 1.
a variável count e rx vão ser algo como:
count = 0; r0 = 0; r1 = 0; r2 = 0;
count = 1; r0 = 1; r1 = 0; r2 = 0;
count = 2; r0 = 0; r1 = 1; r2 = 0;
count = 3; r0 = 1; r1 = 1; r2 = 0;
count = 4; r0 = 0; r1 = 0; r2 = 1;
Como o valor 1 cabe num unsigned char (que é o uint8_t), não há problema nenhum em fazer como ele faz.
Acho que o que deve estar a acontecer é mesmo uma confusão nos pinos. Nada como actuar cada um deles individualmente para tirar isso a limpo.