Arrayproblem

Gast #4834725
Lesenswert?

uint8_t digi_leds [] = { LED1, LED2, LED3, LED4, LED5, LED6, LED7, LED8, 
LED9};
uint8_t digi_etage [] = { zero, first, secound, third };

void digi_ausgabe(uint8_t leds, uint8_t etage){
  PORTD|= digi_leds[leds]; //LED8 und 9
  PORTB|= digi_leds[leds]; //LED1-7
  PORTA = digi_etage[etage];

  PORTD &= ~ digi_leds[leds];
  PORTB &= ~ digi_leds[leds];
  PORTA &= ~ digi_etage[etage];

}

int main(void) {

  while(1){
//       digi_ausgabe(1,1);
//      digi_ausgabe(2,1);
//      digi_ausgabe(3,1);
//      digi_ausgabe(4,1);
//      digi_ausgabe(5,1);
//      digi_ausgabe(6,1);
//      digi_ausgabe(7,1);
     digi_ausgabe(8,1);//!
     digi_ausgabe(9,1);//!
  }
}

Hallo zusammen. Ich probier mich gerade an einem 3x3x3 LED Cube.
da gibts schon n kleines Problem.
Ich kann alle LEDs einzeln mit der Funktion digi_ausgabe ansteuern. 
allerdings wie im Code zusehen(LED 8 & 9 sollen angesteuert werden), 
dann leuchten die auch. Zusätzlich leuchten aber auch wieder LED 1 & 2 
mit.

Quasi, wenn ich  digi_leds[8] oder digi_leds[9] schreibe, fängt er im 
Array wieder von vorn an.


Hoffe ihr versteht wie ich es meine.? :)
wie kann ich das am besten umschreiben.?

danke im vorraus
Gast #4834742
Lesenswert?

Da fängt nichts im Array wieder von vorne an.

Vollziehe nochmal Schritt für Schritt das Programm nach. Hilfsweise 
einen Simulator verwenden.

P.S. Bitte kompilierbaren Code posten. Dieser ist es nicht.
Gast #4834782
Lesenswert?

>  PORTD|= digi_leds[leds]; //LED8 und 9
>  PORTB|= digi_leds[leds]; //LED1-7
in diesen beiden Zeilen passiert etwas anderes als du denkst.

PD0 und PB0 haben den gleichen Wert. PD1 und PB1 ebenfalls. Kannst du 
leicht verifizieren.
Mit diesem Wissen haben LED1 und LED8 sowie LED2 und LED9 jeweils die 
gleichen Werte.
Also spielt es keine Rolle, ob du "digi_ausgabe(1,1);" oder 
"digi_ausgabe(8,1);" schreibst, das Ergebnis ist in beiden Fällen das 
selbe.
Gast #4834790
Lesenswert?

Mach eine Fallunterscheidung:

if (leds >= 8)
    PORTD |= digi_leds[leds];
else
    PORTB |= digi_leds[leds];

Im übrigen halte ich den namen "leds" für etwas irreführend gewählt. Es 
wird damit ja nur EINE led gesetzt. "led" wäre also passender.
#4834828
Lesenswert?

AVerr schrieb:
> Mach eine Fallunterscheidung:

...und nicht vergessen die LEDs am anderen Port auch wieder aus zu 
machen...
Und damit es nicht unkontrolliert flackert, erstmal die ganze Etage 
ausmachen.
1
PORTA = 0;
2
if (leds >= 8)
3
{
4
    PORTB &= ~0x3F;
5
    PORTD |= digi_leds[leds];
6
}
7
else
8
{
9
    PORTB |= digi_leds[leds];
10
    PORTD &= ~0x03;
11
}
12
PORTA = digi_etage[etage];}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren