LED Matrix Max7219 Ansterung funktioniert nicht

Gast #1084173
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
Angehängte Dateien:
Gast #1084794
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
Gast #1084908
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.
Angehängte Dateien:
Gast #1084915
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
Gast #1084938
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.
#1085153
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
Gast #1085372
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.
#1085383
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
Gast #1086811
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
  }
Gast #1098979
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.

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