Arrayproblem

Gast #4834725
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
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
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)
Gast
>  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
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.
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

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.