Forum: Mikrocontroller und Digitale Elektronik LED Matrix Max7219 Ansterung funktioniert nicht


von haleluja (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich habe eine LED-Matrix Schaltung gebastelt und versuche die mit einem 
Attiny 2313 und dem Max7219 anzusteuern.
Leider funktioniert das ganze irgendwie nicht. Im Anhang ist die c datei 
zu finden. dort soll eine spalte leuchten, leider leuchtet aber gar 
nichts. ich hab auch schon den display test mode probiert. das gleiche 
ergebnis.
das flashen scheint aber zu funktionieren. Ich mach das ganze mit dem 
usbprog

avrdude -c avrispv2 -P usb -p t2313 -u -U lfuse:w:0xff:m -U 
hfuse:w:0xdf:m -U flash:w:max7219.hex

Hat jemand ne Idee woran das liegen könnte?
Danke

von Gast (Gast)


Lesenswert?

die Suche ist dein Freund

z.B. hier:

Beitrag "LED_Laufschrift mit Mega 32 und MAX 7219"

von haleluja (Gast)


Lesenswert?

Ich hab das bsp was sie dort hatten ausprobiert. leider weiß ich nicht 
was diese fehlermeldungen besagen, bzw. wo die in dem anderen thread 
hergenommen werden. die haben das ja für einen atmega übersetzt, kann 
das sein, dass das für einen tiny nicht geht?

meldungen beim kompilieren:

max7219.c:19: warning: function declaration isn’t a prototype
max7219.c:23: warning: function declaration isn’t a prototype
max7219.c: In function ‘SPI_MasterInit’:
max7219.c:33: error: ‘SPCR’ undeclared (first use in this function)
max7219.c:33: error: (Each undeclared identifier is reported only once
max7219.c:33: error: for each function it appears in.)
max7219.c:33: error: ‘MSTR’ undeclared (first use in this function)
max7219.c:33: error: ‘SPE’ undeclared (first use in this function)
max7219.c:33: error: ‘SPR1’ undeclared (first use in this function)
max7219.c:33: error: ‘SPR0’ undeclared (first use in this function)
max7219.c: In function ‘transmit’:
max7219.c:40: error: ‘SPDR’ undeclared (first use in this function)
max7219.c:41: error: ‘SPSR’ undeclared (first use in this function)
max7219.c:41: error: ‘SPIF’ undeclared (first use in this function)
max7219.c:144:2: warning: "/*" within comment
max7219.c:151:2: warning: "/*" within comment
make: *** [max7219.o] Fehler 1

von haleluja (Gast)


Angehängte Dateien:

Lesenswert?

ich könnte heulen, es will nicht funktionieren. ich hab schon zig 
varianten ausprobiert. selbst mit anpassung und laut programmierung laut 
datenblatt. es geht einfach nicht. keine variante funktioniert. ich 
hatte das display auch schonmal am leuchten, aber irgendwie war das wohl 
nur zufall. denn ich bekomms auch nicht mehr hin. die variante, die ich 
schon im ersten post habe, sollte eigentlich funktionieren (is nen besp 
von anderen) und ne selbst ne spi mit dem usi von dem attiny 
nachzubilden funktioniert auch nicht :( mist. das bild zeigt meine 
aktuelle schaltung.

von haleluja (Gast)


Lesenswert?

noch ne sache. ich hab f-cpu und delay.h eingebunden. ich hab versucht 
einfach mal ein pin zu toggeln, also
int main() {
 while(1) {
    PORTD &= ~(1<<PD5);

    _delay_ms(1000);
    PORTD |= (1<<PD5);

 }
}

aber das geht irgendwie nicht, pd5 bleibt auf 0. hat jemand ne idee, was 
das nu soll? vllt hängt das mit den problemen zusammen, die ich habe

von Hubert P. (vaterssohn)


Lesenswert?

Ohne mir das Problem im Detail angeschaut zu haben:
Ich hatte mal ein Problem mit dem MAX7221 (auf einem Steckbrett). Nach 
einigen Forumsbeiträgen und stundenlanger Fehlersuche hab ich zufällig 
entdeckt: mit 120nF Block-Kondensator funktionierts, mit 100n nicht!

von Gast (Gast)


Lesenswert?

Natürlich kannst du eine Programm von einem ATmega32 nicht direkt für 
deinen Tiny benutzen, da die Initialisierung anders ist. Also die 
Register heißen anders usw.

Aber in deinem Programm fehlt die Initialisierung des Tiny komplett.

von Gast (Gast)


Lesenswert?

der Stromlaufplan ist soweit in Ordnung. Die Kondensatoren für den 7219 
müssen so nah wie möglich an die Pins des 7219 ran.

von Peter D. (peda)


Lesenswert?

haleluja wrote:
> Leider funktioniert das ganze irgendwie nicht. Im Anhang ist die c datei
> zu finden. dort soll eine spalte leuchten, leider leuchtet aber gar
> nichts.

Woher soll der arme MAX7219 denn wissen, welches das erste und welches 
das 2. Byte ist?

Schau Dir mal das Taktdiagramm im Datenblatt an.
Immer erst nach 16 Bits die 0->1 Flanke zum Übernehmen, dann weiß der 
MAX Bescheid.


Peter

von Florian (Gast)


Lesenswert?

also die vorwiderstände für die led´s müssen raus, das macht der max 
intern...

von Gast (Gast)


Lesenswert?

die 0-Ohm Widerstände dienen wohl als Brückenersatz.....

von haleluja (Gast)


Lesenswert?

genau, dass sind alles brücken, also keine vorwiderstände

zudem hab ich schon das mit der LOAD Flanke schon drinne:
nur dass ich in dem oberen code das load 1 und 0 vertauscht habe - ich 
dachte bei fallender flanke übernimmt er
aber selbst mit dem folgenden bsp gehts nicht.

  PORTD &= ~(1<<2); // LOAD 0
  for (loop=0;loop<8;loop++) {
    mask=mask>>1;
    PORTB &= ~(1<<7); // CLK 0
    if (data_out & mask) PORTB |=  (1<<5); // Data 1
      else PORTB &= ~(1<<5); // DATA 0
    PORTB |= (1<<7); // CLK 1
  }
  PORTB &= ~(1<<7); // CLK 0
  PORTD |= (1<<2); // Load 1

den kondensator ist genau vor dem max platziert, genauso wie der elko, 
da muss ich wohl nochmal einen 120nF kaufen und den ausprobieren.

von Gast (Gast)


Lesenswert?

vergiss es, hat damit nichts zu tun....

von haleluja (Gast)


Lesenswert?

was soll ich vergessen?

von Michael U. (amiga)


Lesenswert?

Hallo,

mein C ist nicht sonderlich zu gebrauchen, bin ASM-Programmierer...

Aber: Du hast eine Schleife, die bis 8 zählt.
Der MAX will aber 16 Datenbits!
Das wurde oben schon irgendwo erwähnt.
Daten werden mit der steigenden Flanke übernommen und LOAD muß vor 
Beginn des Schiebens auf L und nach der letzen L/H-Taktflanke auf H 
gehen.
Verzögerungszeit müßte ich jetzt im Datenblatt kramen.

Ich habe mich nicht durch Deine Schleife durchgekramt. Bau das 
16Bit-Muster in einem INT zusammen , dann LOAD auf L, schiebe alle 16 
Bit raus (Bit15...Bit0) und nach dem letzten Bit wenn CLK auf H ist auch 
LOAD wieder auf H.

Das Diagramm im Datenblatt ist da doch recht eindeutig?

Gruß aus Berlin
Michael

von Gast (Gast)


Lesenswert?

den 120nF Kondensator...

Dein Programm stimmt nicht...
Deine SPI wird nicht initialisiert...
Nimm dir mal das Datenblatt vor....

von Peter D. (peda)


Lesenswert?

haleluja wrote:
> zudem hab ich schon das mit der LOAD Flanke schon drinne:

Lies Dir mal durch, was ich gesagt habe, es ist eine zuviel!!!

Nicht nach 8 Bits, sondern erst nach 16 Bits!


Peter

von haleluja (Gast)


Lesenswert?

moin,
habe jetzt die meisten probleme gelöst, zumindest zeigt er jetzt was an 
- und zwar alle leds gleichzeitig. das ist etwas eigenartig. ich schiebe 
testweise die data_out folge rein. (load signal ist in diesem minimalbsp 
nicht drinne) nun ist es so, dass wenn das erste bit mit 1 erreicht 
wird, auf PB5 korrekt auf 1 geschalten wird, jetzt aber alle anderen 
nachfolgenden stellen auch mit PB5=1 geschalten werden. ich weiß nicht 
woran das liegt, dass er immer wieder data_out & mask>>loop = true 
rausbekommt. die delays sind drinne, damit ich was am pin messen kann. 
sieht irgendjemand nen fehler?

  data_out=0b0001000000000001;
  int i;
  int mask;
  int loop;

  mask=0x8000;

  for (loop=0;loop<16;loop++) {
    for(i=0;i<100;i++){
       _delay_ms(10);
    }
    PORTB &= ~(1<<PB7); // CLK 0

    mask=0x8000;
    if (data_out & mask>>loop) {
      PORTB |= (1<<PB5); // Data 1
    } else {
      PORTB &= ~(1<<PB5); // DATA 0
    }

    for(i=0;i<100;i++){
      _delay_ms(10);
    }
    PORTB |= (1<<PB7); // CLK 1
  }

von Udo S. (udo)


Lesenswert?

Hallo,

sag mal, du hast den 7219 doch an die SPI-Schnittstelle angeschlossen.
Wieso nutzt du die denn nicht?

Gruß
Udo

von haleluja (Gast)


Lesenswert?

Moin, also fuktioniert soweit alles, kann alle möglichen 
selbstgeschriebenen zeichen ausgeben. ein paar probleme gibt immernoch, 
denn wenn ich zeichen nacheinander ausgeben will, bleibt das erste 
zeichen stehen ohne dass sich was ändert. ist etwas eigenartig. kann 
aber damit zusammenhängen, dass es zu einem sram speicherüberlauf kommt 
(wegen array operationen für anzuzeigende leds).

ich wollte nur noch der vollständigkeit halber nen status bericht geben. 
ich bin noch dran, auch diese probleme zu beheben.

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.