3x3 LED-Matrix Atmega8

Gast #1906557
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???
Gast #1906576
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
...
Persönliche Seite #1906582
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
Gast #1906598
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren