mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 3x3 LED-Matrix Atmega8


Autor: Der Lars (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin moin, ZUERST ERWÄHNT: ICH BIN NEWBIE!!

Ich bin im Moment am rumprobieren und habe mir aus 9LEDs eine kleine 
Matrix gebaut.

  a b c
3 X X X

2 X X X

1 X X X

und habe sie wie folgt an meinen Atmega8 angeschlossen.

a = PC1
b = PC2
c = PC3
1 = PB1
2 = PB2
3 = PB3

Um zu schauen ob es funktionier habe ich ein Programm geschrieben, 
welches jede LED von a1 bis c3 einmal anschaltet und wieder ausschaltet.
Das hat auch alles Prima geklappt.

jetzt möchte ich aber ein Schritt weiter gehen und beispielsweise
c3 und b2 gleichzeitig schalten, ohne dass c2 und b3 leuchten.
Durch googeln habe ich herausgefunden, dass es machbar ist, indem ich 
die LEDs so schnell an und ausschalte, dass es fürs menschliche Auge nur 
als AN zu erkennen ist.

Ich verstehe das also so:
1.Takt: c3=AN, b2=AUS;
2.Takt: c3=AUS, b2=AN;
3.Takt: c3=AN, b2=AUS;
4.Takt: c3=AUS, b2=AN;
5.Takt: c3=AN, b2=AUS;
6.Takt: c3=AUS, b2=AN;
7.Takt: c3=AN, b2=AUS;
8.Takt: c3=AUS, b2=AN;
...

mein Code dazu sieht wie folgt aus:
#include <avr/io.h>

void initialisieren()
{
DDRB = 0xff;
DDRC = 0xff;
}

void LEDOFF()
{
PORTB = 0x00;
PORTC = 0xff;
}

int LED(unsigned char state)
{
switch(state)
    {
    case 1:
        PORTB = (1<<PB3);
        PORTC = (1<<PC1) | (1<<PC2);
        break;
    case 2:
        PORTB = (1<<PB2);
        PORTC = (1<<PC1) | (1<<PC2);
        break;
    case 3:
        PORTB = (1<<PB1);
        PORTC = (1<<PC1) | (1<<PC2);
        break;
    case 4:
        PORTB = (1<<PB3);
        PORTC = (1<<PC1) | (1<<PC3);
        break;
    case 5:
        PORTB = (1<<PB2);
        PORTC = (1<<PC1) | (1<<PC3);
        break;
    case 6:
        PORTB = (1<<PB1);
        PORTC = (1<<PC1) | (1<<PC3);
        break;
    case 7:
        PORTB = (1<<PB3);
        PORTC = (1<<PC2) | (1<<PC3);
        break;
    case 8:
        PORTB = (1<<PB2);
        PORTC = (1<<PC2) | (1<<PC3);
        break;
    case 9:
        PORTB = (1<<PB1);
        PORTC = (1<<PC2) | (1<<PC3);
        break;
    default:
        break;
    }

return(1);
}

void main()
{

initialisieren();

LEDOFF();

while(1)
{
LED(1);
LED(5);
}

}

Mein Problem ist nun, dass c3 und b2 zwar leuchten, c2 und b3 leuchten 
aber auch leicht. Desshalb nun meine Frage: Wie setze ich es in der 
Software um, dass nur c3 und b2 leuchten und nicht c2 und b3???

Autor: Christoph S. (mixer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

du solltest die ganze Matrix multiplexen LED-Matrix

Wenn du noch nie mit nem Timer gearbeitet hast, dann schau am besten mal 
ins AVR-GCC-Tutorial

Gruss
Mixer

Autor: Der Lars (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Timer Tutorial habe ich heute schon durchgearbeitet. Es war zwar 
eher ein "sehen, staunen und noch nicht so ganz verstehen" aber es hat 
funktioniert.

Also nehm ich quasi den Timer und programmier das so?
Overflow1: c1= an und wieder aus
Overflow2: b2= an und wieder aus
Overflow3: c1= an und wieder aus
Overflow4: b2= an und wieder aus
...

Autor: Christoph S. (mixer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Lars schrieb:
> Das Timer Tutorial habe ich heute schon durchgearbeitet. Es war zwar
> eher ein "sehen, staunen und noch nicht so ganz verstehen" aber es hat
> funktioniert.
>
> Also nehm ich quasi den Timer und programmier das so?
> Overflow1: c1= an und wieder aus
> Overflow2: b2= an und wieder aus
> Overflow3: c1= an und wieder aus
> Overflow4: b2= an und wieder aus
> ...

Nein.

Overflow 1: Zeile 1 an, LEDs von Zeile 1 einschalten die gewünscht sind
Overflow 2: Zeile 2 an, LEDs von Zeile 2 einschalten die gewünscht sind
Overflow 3: Zeile 3 an, LEDs von Zeile 3 einschalten die gewünscht sind
Overflow 4: wie 1
usw.

Du kannst natürlich auch Zeilen und spalten tauschen, das ist dir 
überlassen.

Mit dem Timerinterrupt kannst du ein bisschen experimentieren. Fang 
einfach mal bei 10ms an.

Gruss
Mixer

Autor: Der Lars (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay. Damit komm ich doch schon wieder ein ganzes Stück weiter. :-) Ich 
bedanke mich :-)

Autor: Bob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber zur eigentlichen Frage des "Warum?":
Du wechselst in der Endlosschleife immer wischen den beiden Zuständen 
hin und her. Während des Wechselns stimmt die Ansteuerung aber kurz 
nicht, weil es nun mal seine Zeit dauert bis die Befehle abgearbeitet 
sind.

Ohne kurze Wartepause sind die Ausgänge aber immer am Wechseln. Darum 
leuchten Die LEDs die nicht leuchten sollen.

Mit einer kleinen Pause am Ende der Funktion "LED()" würden die kurzen 
Übergänge (zeitlich) nicht mehr ins Gewicht fallen und nur noch die 
gewünschten LEDs leuchten.

Autor: Skua (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bau noch einen Zustand für keine LED ein und schalte vor jedem Wechsel 
erst mal alle aus.

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.