Forum: Mikrocontroller und Digitale Elektronik Arrayproblem


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Cupp (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Code ist nicht vollständig.

Schaltplan?

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

von Tutor (Gast)


Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht lesenswert
...

von Cupp (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Ok. Wie kann ich es dann schreiben?

von AVerr (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Macht eigentlich sinn die variante. ;) danke schön

von Joe F. (easylife)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.