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
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
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.
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
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!
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.
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.
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
also die vorwiderstände für die led´s müssen raus, das macht der max intern...
die 0-Ohm Widerstände dienen wohl als Brückenersatz.....
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.
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
den 120nF Kondensator... Dein Programm stimmt nicht... Deine SPI wird nicht initialisiert... Nimm dir mal das Datenblatt vor....
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
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 }
Hallo, sag mal, du hast den 7219 doch an die SPI-Schnittstelle angeschlossen. Wieso nutzt du die denn nicht? Gruß Udo
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.