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.
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
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
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
}
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.