mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Led Matrix 10x10; Multiplexing; Programm funktioniert nicht


Autor: qa729 (Gast)
Datum:
Angehängte Dateien:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: qa729 (Gast)
Datum:

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

Autor: Jean Player (fubu1000)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Alexander Schmidt (esko) Benutzerseite
Datum:

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

Autor: qa729 (Gast)
Datum:

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

Autor: Flo (Gast)
Datum:

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

Autor: Thomas Pototschnig (pototschnig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?
  int led[100];
  
  for(i = 1;i<101;i++)
  {
    led[i] = 0;
  };

MfG
Thomas Pototschnig

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.