Hallo! Ich habe mir eine kleine LED Matrix mit 10 x 10 Leds gebaut und möchte diese nun über C programmieren. Habe auch schon ein kleines Testprogramm geschrieben, um zu sehen ob es funktioniert. Laut dem Testprogramm sollten eigentlich die Leds 15 und 1 leuchten, jedoch leuchten reell die Leds 1,5,11,15,81,85,91,95. Die Matrix ist folgendermaßen aufgebaut: PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 PB0 PB1 x x x x x O x x x O Transistor auf PB2 x x x x x O x x x O Transistor auf PB3 x x x x x x x x x x Transistor auf PB4 x x x x x x x x x x Transistor auf PB5 x x x x x x x x x x Transistor auf PB6 x x x x x x x x x x Transistor auf PB7 x x x x x x x x x x Transistor auf PC0 x x x x x x x x x x Transistor auf PC1 x x x x x O x x x O Transistor auf PC2 x x x x x O x x x O Transistor auf PC3 Die leuchtenden LEDs sind mit einem großen O gekennzeichnet. Wahrscheinlich liegt der Fehler an meinen Programmierkenntissen, die Schaltung habe ich überprüft. Ich hoffe hier kann mir jemand helfen, indem er meinem Fehler auf die Schliche kommt. Anbei liegt das Tesprogramm. Schonmal herzlichen Dank im Vorraus! qa729
Du solltest das Pferd besser nicht von hinten aufzäumen. Multiplexen lebt davon, daß man die LEDs für ein konstantes Zeitintervall leuchten läßt. Durch zufällige Programmlaufzeiten des Main wirst Du daher nie glücklich. Fange also erstmal damit an, einen Timerinterrupt zu programmieren, 1ms ist eine gute Multiplexzeit. Dann klappts auch mit dem Multiplexen. Peter
Mir ist bewusst das Multiplexing sehr zeitkritisch ist, und das ganze ist ja nur ein Testprogramm. Trotzdem werde ich, wenn ich das ganze mit einem Timer Interrupt alle 1ms oder ähnliches ansteuere kein anderes Ergebnis bezüglich des Leuchtens feststellen können. Das Leuchten der Leds werde ich egal ob mit oder ohne Timer Interrupt gleich lösen. Ich hätte so oder so nicht um den Timer herumkommen können, da ich verschiedene Ausführungszeiten in der Main haben werde. Trotzdem würde mich immer noch interessieren wieso die Leds so undefiniert leuchten (Wobei mir aufgefallen ist das zumindest die Zeilen stimmen...). Danke für die schnelle Antwort, aber leider hat sie nicht gerade zur Lösung meines Problems beigetragen.
Hallo, mach mal die Semikolons hinter den for-Schleifen und hinter den if-Abfragen weg. Ausserdem beginnt dasn array led[100] bei led[0] und nicht bei led[1]. Zudem reicht ein unsigned char array. Gruß
qa729 wrote: > Danke für die schnelle Antwort, aber leider hat sie nicht gerade zur > Lösung meines Problems beigetragen. Nur, weil Du es nicht ernst genommen hast. Du denkst, for-Schleifen haben eine definierte Laufzeit, aber das ist völliger Quatsch mit Soße. Du kannst keinen Transistor in Emitterschaltung für 1µs ein- und ausschalten! Wenn Du Timerinterrupts dermaßen verabscheust, dann nimm wenigstens die Funktionen der delay.h. Peter
Für row hast du sicher auch Aufrufe von 3 bis 11?! Ich denke der ganze Code ist vom Ansatz her falsch. Du solltest dir mal aufmalen was in welcher Reihenfolge passieren muss. Reihenpin low Reihenpin high Spaltenpin low Spaltenpin high warten/timer
Danke für die Hilfe! Ich glaube das dies die Lösung ist. Ich habe einfach nicht darauf gedacht das ein Transistor eine bestimmte Schaltzeit hat. Das ein Array mit 0 beginnt ist mir schon klar, trotzdem ist es einfacher zum nachdenken, und das 0te Teil im Array wird höchstwahrscheinlich sowieso wegoptimiert. Die Semikolons hinter den ifs und fors werde ich auch einmal entfernen, liegt wahrscheinlich daran das ich schon lange nichts mehr in C programmiert habe. Auf jedenfall schonmal Danke für die Hilfe. Ich werde jetzt einfach ein Delay setzen und es wieder ausprobieren. An dem Timer Interrupt arbeit ich auch schon und ich werde einfach später das Ganze richtig programmieren, sollte jetzt einfach nur ein Test sein. Danke für die Hilfe!
> Das ein Array mit 0 beginnt ist mir schon klar, trotzdem ist es > einfacher zum nachdenken Solange du auch dran denkst, dass led[100] nicht das 100. Element ist sondern bereits nichtmehr zum Speicherbereich deines 100 elementigen Arrays gehört :-)
qa729 wrote: > Das ein Array mit 0 beginnt ist mir schon klar, trotzdem ist es > einfacher zum nachdenken, und das 0te Teil im Array wird > höchstwahrscheinlich sowieso wegoptimiert. Dir ist auch klar, dass led[100] dann außerhalb des Arrays liegt und dir was kaputt schreibt?
1 | int led[100]; |
2 | |
3 | for(i = 1;i<101;i++) |
4 | {
|
5 | led[i] = 0; |
6 | };
|
MfG Thomas Pototschnig
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.