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
Code ist nicht vollständig. Schaltplan? Warum wird PORTD und PORTB gleich behandelt wenn offenbar verschiedene LEDs dranhängen?
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.
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
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)
> 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.
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];} |
:
Bearbeitet durch User
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.