Forum: Mikrocontroller und Digitale Elektronik Arrayproblem


von Cupp (Gast)


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

von rmu (Gast)


Lesenswert?

Code ist nicht vollständig.

Schaltplan?

Warum wird PORTD und PORTB gleich behandelt wenn offenbar verschiedene 
LEDs dranhängen?

von Tutor (Gast)


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.

von Cupp (Gast)


Angehängte Dateien:

Lesenswert?

...

von Cupp (Gast)


Lesenswert?

rmu schrieb:
> Warum wird PORTD und PORTB gleich behandelt wenn offenbar verschiedene
> LEDs dranhängen?

ein Port hat leider nur 8 bits. deswegen brauche ich mehr als einen 
port.
nun sind es 7bit bei portb und 2bit bei portd

von Cupp (Gast)


Lesenswert?

das ganze ist wie ein multiplexer.

über  digi_leds[leds]; bestimme ich, welche Led gewählt wird x und y 
Achse
und über digi_etage[etage]; bestimme ich die dritte Achse (multiplex)

von AVerr (Gast)


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.

von Cupp (Gast)


Lesenswert?

Ok. Wie kann ich es dann schreiben?

von AVerr (Gast)


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.

von Cupp (Gast)


Lesenswert?

Macht eigentlich sinn die variante. ;) danke schön

von Joe F. (easylife)


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];}

: Bearbeitet durch User
von Dietrich L. (dietrichl)


Lesenswert?

Hat das noch keiner gesehen oder bin ich blöd?
1
uint8_t digi_leds [] = { LED1, LED2, LED3, LED4, LED5, LED6, LED7, LED8, LED9};
Das Array hat die Länge 9, der Index geht aber von 0 bis 8. Daher ist
1
     digi_ausgabe(9,1);//!
falsch!

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.