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


von Der Lars (Gast)


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:
1
#include <avr/io.h>
2
3
void initialisieren()
4
{
5
DDRB = 0xff;
6
DDRC = 0xff;
7
}
8
9
void LEDOFF()
10
{
11
PORTB = 0x00;
12
PORTC = 0xff;
13
}
14
15
int LED(unsigned char state)
16
{
17
switch(state)
18
    {
19
    case 1:
20
        PORTB = (1<<PB3);
21
        PORTC = (1<<PC1) | (1<<PC2);
22
        break;
23
    case 2:
24
        PORTB = (1<<PB2);
25
        PORTC = (1<<PC1) | (1<<PC2);
26
        break;
27
    case 3:
28
        PORTB = (1<<PB1);
29
        PORTC = (1<<PC1) | (1<<PC2);
30
        break;
31
    case 4:
32
        PORTB = (1<<PB3);
33
        PORTC = (1<<PC1) | (1<<PC3);
34
        break;
35
    case 5:
36
        PORTB = (1<<PB2);
37
        PORTC = (1<<PC1) | (1<<PC3);
38
        break;
39
    case 6:
40
        PORTB = (1<<PB1);
41
        PORTC = (1<<PC1) | (1<<PC3);
42
        break;
43
    case 7:
44
        PORTB = (1<<PB3);
45
        PORTC = (1<<PC2) | (1<<PC3);
46
        break;
47
    case 8:
48
        PORTB = (1<<PB2);
49
        PORTC = (1<<PC2) | (1<<PC3);
50
        break;
51
    case 9:
52
        PORTB = (1<<PB1);
53
        PORTC = (1<<PC2) | (1<<PC3);
54
        break;
55
    default:
56
        break;
57
    }
58
59
return(1);
60
}
61
62
void main()
63
{
64
65
initialisieren();
66
67
LEDOFF();
68
69
while(1)
70
{
71
LED(1);
72
LED(5);
73
}
74
75
}

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???

von Christoph S. (mixer) Benutzerseite


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

von Der Lars (Gast)


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
...

von Christoph S. (mixer) Benutzerseite


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

von Der Lars (Gast)


Lesenswert?

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

von Bob (Gast)


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.

von Skua (Gast)


Lesenswert?

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

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
Noch kein Account? Hier anmelden.