Hallo,
Ich steuere einen LED-grid mit 6x6Leds ueber einen Max 7219 und Atmega8
an. Funktioniert alles bestens soweit, bis auf ein kleines Problem. Wenn
ich alle Register auf 00 setze (alle LEDs abdrehe) dann glimmen alle
noch ein bisschen. Ich verwende rote LEDs und fuer jede spalte einen
vorwiderstand von 1kohm. Wo liegt das Problem? Muss ich den
Vorwiderstand erhoehen?
danke
julia
Hallo Thorsten,
Ich hab es selbst ohne Vorwiderstand probiert. Dann leuchten sie auch
leicht, obwohl ich an alle reihen 0x00 sende. Hab jetzt den Fehler
entdeckt anscheinend. Ich habe einen Elko jetzt noch am Ausgang vom 7805
gegen Masse angehaengt. Es lag wohl an der Spannungsversorgung.
danke
Julia
Nach kurzem Experimentieren, sehe ich leider, dass die Leds im off modus
noch immer ein leichtes flackern produzieren?!?! woran kann es liegen,
dass der ausgang vom MAX 7219 nicht zur gaenze auf GND geht?!
Zeig dochmal Deinen Schaltplan.
Da wird nichts auf GND gelegt, die LEDs hängen direkt zwischen den
Anschlüssen.
Und wozu die 1k Widerstände, dann glimmen die LEDs doch nur, wenn sie an
sind.
Schau Dir doch einfach mal das Datenblatt an, da ist der Schaltplan
drin.
Bei mir laufen die MAX7219 alle einwandfrei.
Allerdings kann es sein, daß Du ihn durch die Überspannung (fehlender
Elko) schon geschrottet hast.
Peter
hi,
sorry, wollte die schematic schnell im eagle zeichnen, aber habe den
max7219 nicht in der part-bibliothek gehabt. deshalb schnell mit stift
und papier eingescannt.
danke
julia
Mit den Kathoden an Digits und den Anoden an SEG leuchtet nun gar nichts
mehr :( . Mein Programm vom Atmega8 schickt alle 500ms 0x00 und 0xff,
also "verpolung" softwareseitig kanns nicht sein.
danke
Julia
Julia Kristeva wrote:
> Nach kurzem Experimentieren, sehe ich leider, dass die Leds im off modus> noch immer ein leichtes flackern produzieren?!?! woran kann es liegen,> dass der ausgang vom MAX 7219 nicht zur gaenze auf GND geht?!
Ich wage es arg zu bezweifeln, dass der MAX7219 das Flackern verursacht.
Immerhin beträgt die Wiederholfrequenz 500Hz (Minimum!).
Wie wäre es, wenn du uns mal deinen Code zeigen würdest? Ich denke, dass
der Fehler dort zu suchen ist.
Ein Tip zur Fehlersuche:
Initialisiere deinen MAX7219 wie gehabt (alle Segmente aus) und schicke
deinen Controller in eine Endlosschleife (z.B. "for(;;);"). Wenn deine
LEDs immer noch flackern, kannst du ja nochmal nachfragen ;)
Gruß,
Magnetus
[offtopic]
ich würde dir ja raten, auf c umzusteigen... :/
da hast du bei problemen auch ne chance geholfen zu werden :D
[/offtopic]
Du könntest versuchen, den ATMega8 internen SPI zu benutzen. mit
max7219_putByte bastelst du dir das ja selber. Hättest auf diese weise
eine fehlerquelle weniger:
1
voidSPI_MasterInit(void){
2
DDRB=(1<<PB2)|(1<<PB3)|(1<<PB5);// set PB2, MOSI and SCK output, all others input
3
SPCR=(1<<SPE)|(1<<MSTR)|(1<<SPR0);// enable SPI, Master, set clock rate fck/16
4
5
PORTB|=(1<<PB5)|(1<<PB2);
6
}
7
8
voidmax7219_Init(void){
9
transmit(0x0C,0x01);// normal mode
10
transmit(0x0A,0x08);// set intensity 0x00 - 0x0F
11
transmit(0x0B,0x01);// scan digits 0,1
12
transmit(0x09,0x00);// no decoding
13
transmit2dig(0,0x00);// digit 0: all off
14
transmit2dig(1,0x00);// digit 1: all off
15
}
16
17
voidtransmit(unsignedcharaddr,chardata){
18
PORTB&=~(1<<PB2);
19
20
SPDR=addr;// Start transmission
21
while(!(SPSR&(1<<SPIF)));// Wait for transmission complete
22
23
SPDR=data;// Start transmission
24
while(!(SPSR&(1<<SPIF)));// Wait for transmission complete
Was passiert, wenn du dein void loop() wie folgt gestaltest?
1
voidloop()
2
{
3
//printString("blank\n");
4
max7219_all(0xff);
5
delay(500);
6
max7219_all(0x00);
7
while(1);
8
}
Anmerkung: "while(1);" ist eine Endlosschleife ohne Inhalt und sollte
auch unter arduino funktionieren.
Nach meinem Verständnis müssten nach dem Programmstart dann alle LEDs
für 0,5 Sekunden aufleuchten, und danach allesamt abgeschaltet werden.
Trifft das in der Praxis auch auf dein Board zu?
Gruß,
Magnetus
@daniel:
super! ich moechte schon lang auf C wechseln! wuerde mir das leben
einfacher/schwieriger machen ;) aber ich scheitere leider schon am
verstaendniss fuer das << zeichen. weisst du ein gutes tutorial?
@magnetus
die void loop() ist bereits eine endlosschleife. die arduino sprache ist
eine vereinfachung von c-code, die mittels wrapper dann auf den chip
gebrannt wird. also, dieser code verursacht, dass alle leds 500ms
leuchten und 500ms nicht:
1
void loop()
2
{
3
//printString("blank\n");
4
max7219_all(0x00);
5
delay(500);
6
max7219_all(0xff);
7
delay(500);
8
}
das ist auch der fall, bloss leuchten sie halt noch ein bisschen, statt
ganz off zu sein!
danke fuer eure hilfe
Julia
Julia Kristeva wrote:
> @magnetus>> die void loop() ist bereits eine endlosschleife. die arduino sprache ist> eine vereinfachung von c-code, die mittels wrapper dann auf den chip> gebrannt wird. also, dieser code verursacht, dass alle leds 500ms> leuchten und 500ms nicht:
(...)
> das ist auch der fall, bloss leuchten sie halt noch ein bisschen, statt> ganz off zu sein!
Du hast nicht ganz verstanden, was ich damit bezwecke:
Das Programm soll (zu Testzwecken) alle LEDs für die Dauer von 0,5
Sekunden anschalten, danach wieder ausschalten und in einer
ENDLOSSCHLEIFE VERHARREN.
Warum?
Weil:
1.) Wenn die LEDs wie gewünscht für 0,5 Sekunden aufleuchten, bedeutet
das, dass die "delay(500);" wirklich 500ms verzögert.
2.) Wenn die LEDs danach weiterhin leicht vor sich hin flackern würde
dies auf ein HARDWAREPROBLEM deuten. Anderenfalls wäre der Fehler
dann doch im ursprünglichen PROGRAMMCODE zu suchen.
Gruß,
Magnetus
Peter Dannegger wrote:
> Versuchs mal mit Kathode an die Digits, dann klappts auch mitm Maxim.
Julia Kristeva wrote:
> Mit den Kathoden an Digits und den Anoden an SEG leuchtet nun gar nichts> mehr :( . Mein Programm vom Atmega8 schickt alle 500ms 0x00 und 0xff,> also "verpolung" softwareseitig kanns nicht sein.
Peter hat definitiv Recht. Der Sinn des Lebens eines MAX7219 besteht
darin, (7Segment-) Displays mit gemeinsamer KATHODE anzusteuern.
Mist... Freundin ruft... muss wech... ;)
@magnetus
> Du hast nicht ganz verstanden, was ich damit bezwecke:> Das Programm soll (zu Testzwecken) alle LEDs für die Dauer von 0,5> Sekunden anschalten, danach wieder ausschalten und in einer> ENDLOSSCHLEIFE VERHARREN.
ah sorry, fehlleitung in meinem hirn. habs verstanden und werd es morgen
gleich ausprobieren!
> Peter hat definitiv Recht. Der Sinn des Lebens eines MAX7219 besteht> darin, (7Segment-) Displays mit gemeinsamer KATHODE anzusteuern.
aber, sehe nicht wirklich einen Unterschied (bis auf optisch) zwischen
einem 7-segment Display und einem LED-Grid, welches genauso gemeinsame
Kathode besitzt. siehe mein schaltplan ;)
> Mist... Freundin ruft... muss wech... ;)
lass sie nicht warten ;)
danke trotzdem && melde mich bei erfolgen
Julia
> Was passiert, wenn du dein void loop() wie folgt gestaltest?
1
voidloop()
2
{
3
//printString("blank\n");
4
max7219_all(0xff);
5
delay(500);
6
max7219_all(0x00);
7
while(1);
8
}
die leds leuchten fuer 500ms auf. danach gehen sie einen zustand ueber
sie leicht aufleuchten in unregelmaessigen abstaenden? irgendwie siehts
wie ein massedefekt aus? oder doch ein fehler in der schaltung?
Loesung/Fehler gefunden!
hoppla zunaechst 10k widerstand nicht auf ISET sondern auf Vc. und
magnetus hat natuerlich recht:
die gemeinsame kathoden auf DIG0-DIG8.
danke fuer eure hilfe!