Mortis:
existe um problema nas variáveis declaradas, pois unsigned char é o mesmo que bit, ou seja de 0 a 255, por isso a variável LED e Max H jamais serão menores que zero ^^Edit: o ideal seria static int LED = 5;
My bad. Tens razão. Mas o ideal seria char. -126 a 127.
Segundo o que percebi, alteraste as condicões para nunca testar abaixo de zero e alteraste os decrementos e incrementos para fora da digitalWrite()... algum motivo para isso?
Edit:
Tive um tempinho para brincar com isto no Visual Studio e o meu printout deste código funciona trocando apenas o unsigned char por char.
Se quiserem experimentar num compilador de C para PC:
#define UP 0
#define DOWN 1
unsigned char ledPin[] = {8, 9, 10, 11, 12, 13};
//adaptei a digitalWrite do Arduino para PC.... he eh
void digitalWrite(unsigned char* pin, unsigned char state){
*pin = state;
};
void LEDChange() {
//alterei estas variáveis....
static char sentido = DOWN;
static char LED = 5;
static char MaxH = 5;
//mas o resto ficou igual.
if (sentido == UP) {
digitalWrite(&ledPin[LED], LOW); //desliga o que estava.
digitalWrite(&ledPin[LED++], HIGH); //liga o próximo.
if (LED > MaxH) { //se atingimos a altura máxima...
sentido = DOWN; //vamos para baixo.
LED = MaxH; //mas começamos de MaxH
}
} else { //sentido = DOWN
digitalWrite(&ledPin[LED], LOW); //desliga o anterior
digitalWrite(&ledPin[LED--], HIGH); //liga o próximo
if (LED < 0) { //se chegamos ao chão
LED = 0; // não vamos abaixo
sentido = UP; //vamos para cima
MaxH--; // mas não chegamos tão alto quanto antes.
if (MaxH < 0) { // Se atingimos repouso
MaxH = 5; // VOLTAMOS AO InÍCIO.
LED = 5;
sentido = DOWN;
}
}
}
//adicionei isto para debug na consola.
printf("LED = %d\n", (int)LED);
printf("Sentido = %d\n", (int) sentido);
printf("MaxH = %d\n", (int) MaxH);
}
int main(char argc, char** argv) {
int i;
printf("Hello, world!!\n");
//60 iteracões dá para ver o algoritmo a funcionar...
for (i = 0; i <60; i ++) {
LEDChange();
}
getchar();
return 0;
}
E tirando a parte final em que a bola regressa ao início, o código funciona. :S