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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.