Hallo,
ich hab ein Problem mit meinem MAX7219-Baustein und komme nicht weiter.
Über meinem Atmega8535 mit einem Quarzoszillator von 4,096 MHz steuere
ich einen MAX7219-Baustein und dieser soll drei 7-Segment-Anzeigen
betreiben. Die Anzeige soll im Sekunden-Takt von 0 bis 100 in 10er
Schritten anzeigen. Es wird zwar etwas angezeigt, aber es sind eher
irgendwelche Hieroglyphen und die Helligkeit der einzelnen Segmente ist
auch unterschiedlich. Das C-Programm sollte eigentlich funktionsfähig
sein, da ich es hier aus dem Forum bezogen habe. Die Hardware sollte
auch passen.
Schaltung und Board sind im Anhang.
Weiß einer einen Rat?
Quellcode:
1
#define F_CPU 4096000L
2
#define max7219_PORT PORTB
3
#define max7219_DDR DDRB
4
#define max7219_CLK PB7
5
#define max7219_LOAD PB6
6
#define max7219_DIN PB5
7
8
#include<avr/io.h>
9
#include<util/delay.h>
10
#include<stdint.h>
11
#include<string.h>
12
#include<stdlib.h>
13
14
voidlong_delay(uint8_tms)
15
{
16
for(;ms>0;ms--)_delay_ms(10);
17
}
18
19
voidmax7219_clock_out(unsignedcharData)
20
{
21
chari;
22
for(i=0;i<8;i++){
23
max7219_PORT&=~(1<<max7219_CLK);//Clock auf Low
24
if(Data&(1<<7)){
25
max7219_PORT|=(1<<max7219_DIN);
26
}else{
27
max7219_PORT&=~(1<<max7219_DIN);
28
}
29
Data<<=1;
30
max7219_PORT|=(1<<max7219_CLK);//Clock auf High, Daten werden übernommen
************************************************************************
>Es wird zwar etwas angezeigt, aber es sind eher>irgendwelche Hieroglyphen und die Helligkeit der einzelnen Segmente ist>auch unterschiedlich. Das C-Programm sollte eigentlich funktionsfähig>sein, da ich es hier aus dem Forum bezogen habe.
************************************************************************
Hieroglyphen deuten auf fehlerhafte Kommunikation.
In _init() nach _intensity() ein displaytest(on) ein delay() und ein
displaytest(off) einfügen.
bei funktionierender Kommunikation wird _init() mit _displaytest(on)
alle Display-Segmente während delay() leuchten lassen.
Max7219 schrieb:> In _init() nach _intensity() ein displaytest(on) ein delay() und ein> displaytest(off) einfügen.
Hab ich jetzt gemacht, aber die LEDs der Segmente sind stattdessen bei
max7219_displaytest_on() ausgegangen. Ich habe mal dooferheitshalber die
DIN in max7219_clock_out () mal vertauscht, da leuchteten die LEDs aber
dauerhaft, also kann es an der DIN schon mal nicht liegen.
Wenn displaytest nicht richtig funktioniert läuft der max7219 nicht
richtig.
Zum Verständnis und als Beispiel:
http://ee.cleversoul.com/max7219-source.html
********************************************
Anpassen an AVR :
***************
#include <stdint.h>
#include <avr/io.h>
#include <util/delay.h>
google schrieb:> Die Leitungsführung auf dem Board erscheint suboptimal. Spendiere> den> Logik-Eingängen (DIN, CLK, LOAD) des MAX7219 mal Pullup-Widerstände.
Operation gelungen, Patient tot. :) Von VCC (Pin 19) bin ich mit 3
Pull-Up-Widerständen a 10k auf DIN (Pin 1), LOAD (Pin 12) und CLK (Pin
13) gegangen. Kein Erfolg, gleiches Fehlerbild.
google schrieb:> Die Leitungsführung auf dem Board erscheint suboptimal.
Dem schließe ich mich an.
Allerdings fehlt mir ein ordentliches GND-Layout. Die GND-Leitungen sind
so mickrig, dass beim Schalten der LEDs Spannungsabfälle am GND
auftreten, die für ein ordentliche Kommunikation zu groß sein können.
Als ersten Test kannst Du mal den GND vom MAX mit dem GND vom µC mit
einem "ordentlichen" Draht verbinden.
Ob das dann für die anderen Funktionen auch reichen wird, sei aber noch
dahingestellt. Wenn nicht, dann wirst Du ein neues Layout oder ein
zusätzliches GND-Netzwerk aus Draht brauchen.
Gruß Dietrich
Dietrich L. schrieb:> Als ersten Test kannst Du mal den GND vom MAX mit dem GND vom µC mit> einem "ordentlichen" Draht verbinden.
Einen Draht habe ich nun vom MAX7219 (Pin 9) zum GND des uC's gezogen
und der Fehler ist immer noch da. Aber das müsste nicht das Problem
sein, ich hab bei der Layout-Erstellung noch einen GND Polygon über die
ganze Platine gezogen.
Bei mir ist die MISO des uC's sowohl für die ISP-Programmierung als auch
für den MAX7219-Baustein als I/O-Pin (LOAD) zuständig. Könnte vielleicht
bei der Programmierung dadurch der MAX7219-Baustein beeinflusst worden
sein?
Die Software sieht funktionsfähig aus.
Die Hardware? Naja. Insbesondere der Kram rechts unten im Schaltplan
ergibt überhaupt keinen Sinn: nen Poti am D-Eingang eines FF?!? Der
negierte Q an CLK der gleichzeitig auch noch vom 4093 getrieben wird
(die treiben nun gegeneinander). Das 2. FF flippt irgendwo rum (alle
Eingänge unbeschaltet). Ein Optokoppler der gleiche Potentiale koppelt.
Und was soll die Block überhaupt erreichen? Drei ICs um einen Takt an
INT0/PD2 zu erzeugen?!? Sind dir die Timer im Proz ausgegangen?
Btw, es wäre hilfreich, irgendwo auch mal Vcc zu spezifizieren - ich
gehe von 5V aus, oder? Wenn nicht, weisst du, warum der 7219 nicht
will.
@asdfasd
Du brauchst dir keine Sorgen um den unteren Schaltungsteil machen, das
gehört nicht zu meiner oben definierten Frage und die Konzeption des
Layouts ist logisch, da ich es vorher in anderen Gehversuche erfolgreich
die Funktion testen konnte. Es handelt sich da nur um einen kapazitiven
Taster mein junger Padawan. ;P
[der rechte untere Schaltungsblock]
> die Konzeption des Layouts ist logisch, da ich es vorher in anderen> Gehversuche erfolgreich die Funktion testen konnte. Es handelt sich> da nur um einen kapazitiven Taster
Über das Layout hab ich nichts gesagt, nur über die Schaltung an sich.
Und ich bleibe dabei, sie ist Murks.
[nicht alle Vcc/GND-Pins angeschlossen]
> Das ist doch egal mit dem uC, wenn da nur einmal VCC und GND> angeschlossen sind. Die werden doch intern eh miteinander verbunden.
Sagt wer? Üblicherweise werden mehrere Vcc/GND-Pins eingesetzt, weil
die interne Verdrahtung eben nicht ausreicht oder überhaupt vorhanden
ist.
> mein junger Padawan
Das sagt der Richtige :-)
Ich hab das Problem immer noch nicht gelöst und hab noch ein
Fehlerprotokoll angelegt.
Fehlerprotokoll:
- Pull-up Widerstände DIN, CLK und LOAD
- Draht Masse uC <-> Masse MAX7219
- MAX7219 ausgewechselt
- Segmente sind neu
- Kurzschlussprüfung der einzelnen Segmente
- die 2 Kondensatoren hab ich noch raus genommen
- I_Set Widerstand über Poti verändert
- Messung von DIN, CLK und LOAD auf High- und Low-Pegel:
| Low | High |
-----------------------
DIN | 0V | 4,995V |
-----------------------
CLK | 0V | 4,995V |
-----------------------
LOAD | 0V | 4,995V |
Mir ist noch was aufgefallen, anscheinend wird das letzte Register- und
Datenbit verschluckt. Im Programm sieht aber alles gut aus. Wie ist
sowas nur möglich?
C-Datei mit funktionierender static void Send( uint16_t data ) ergänzt.
init() abgeändert.
Auf Steckbrett gemäss typical application cirquit getestet.
Displaytest funktioniert und es zählt was.