Hi alle zusammen, Nachdem ich nun die Sache mit dem SPI geklärt habe, habe ich mich gestern und heute mal hingesetzt und den Schaltplan zu meiner Uhr mit EAGLE erstellt. Man muss dazu sagen, dass ich vorher noch nie mit dem Programm gearbeitet habe, deswegen ist vermutlich nicht alles perfekt. Zu der eigentlichen Uhr und ihrer Funktionsweise habe ich in meinem Blog einen kleinen Beitrag: http://danielgilbert.de/2009/02/11/led-uhr-teil-i Die Schaltung zum Programmieren des µC steht schon und funktioniert auch. Man sieht auf dem Schaltplan nicht alle LEDs, weil das vom Platz her nicht auf A4 gepasst hat. Gibt es eine Möglichkeit, soetwas anzudeuten? Quasi sowas wie "..." in Texten? Die Uhr soll noch einen Fotowiderstand spendiert bekommen (reichelt A906012, hoffe, mit dem kann man arbeiten). Denn nachts muss die Anzeige natürlich gedimmt werden, was sich mit dem MAX7219 ja recht einfach lösen lässt. Die weiteren externen ICs sind der DS1620(Temperatur) und DS1337(RTC). In Eagle gab es die nicht, also habe ich sie selbst gebaut. Fällt euch an der Schaltung etwas auf, was unbedingt geändert werden müsste oder die Funktion stören könnte? Und wie sieht es mit dem Aufbau des Plans aus? Ist der Übersichtlich genug? Besten Dank fürs Gucken, Daniel
Ich denke mal C4 und C5 werden zu einer interessanten Funktionsstoerung fuehren. :-) Auch R2-R3 ist nicht gerade ein geniale Loesungsanstatz da er die maximal moegliche Uebertragungsgeschwindigkeit verlangsamt. Es sollte ein Widerstand and Load, ich vermute das ist CS, reichen. Ausserdem hoffe ich auch du bist dir ueber den Sinn von C1 im klaren. Und von Pullups an I2C hast du auch noch nichts gehoert. Olaf p.s: Faedel erstmal lieber. Das macht dir fuer den Anfang die Reparaturen einfacher. .-)
Olaf wrote: > Ich denke mal C4 und C5 werden zu einer interessanten Funktionsstoerung > fuehren. :-) Hmm... Die müssten an GND, oder? > Auch R2-R3 ist nicht gerade ein geniale Loesungsanstatz da er die > maximal moegliche Uebertragungsgeschwindigkeit verlangsamt. Es sollte > ein Widerstand and Load, ich vermute das ist CS, reichen. http://www.atmel.com/dyn/resources/prod_documents/DOC0943.PDF Auf Seite 3 ist m.M.n eine ähnliche Beschaltung angegeben. > Ausserdem hoffe ich auch du bist dir ueber den Sinn von C1 im klaren. Der soll Spannungsschwankungen glätten, richtig? > Und von Pullups an I2C hast du auch noch nichts gehoert. Nee.
So, Habe den Plan mal aktualisiert. Habe R2 und R3 noch nicht geändert, aber den Rest. Ist es jetzt besser?
Daniel Gilbert wrote: > So, > > Habe den Plan mal aktualisiert. Habe R2 und R3 noch nicht geändert, aber > den Rest. Ist es jetzt besser? nicht wirklich..Abblockkondensatoren gehören zwischen Vcc und GND am IC, nicht zwischen GND und IC...
Hi Justus, Danke. Das heißt also, so wäre es richtig und die Kondensatoren könnten ihren Zweck erfüllen, oder?
Daniel Gilbert wrote: > Hi Justus, > > Danke. Das heißt also, so wäre es richtig und die Kondensatoren könnten > ihren Zweck erfüllen, oder? C3 und C4 auf jeden Fall..Im Layout müssen die dann aber auch so dicht an "ihren" ICs sein wie möglich..
Ok, danke. :) Fällt dir (oder wem anders) sonst noch irgendwas auf, was vielleicht nicht ganz so elegant ist oder Fehler verursachen könnte? //Edit: Hab C1 jetzt auch mal an die Pins vom µC geschoben, damit man auf Anhieb erkennt, was er macht.
Ich kenne den Uhrenbaustein nicht. Braucht der Quarz wirklich keine externen Kondensatoren nach Masse? -> Datenblatt. Für die Funktion nicht wichtig, aber eine Konvention, die zur besseren Lesbarkeit des Schaltplans führt: GND-Symbole nach unten zeigen lassen, Betriebsspannungssymbole nach oben (Norden).
Du musst damit rechnen, daß die LEDs während des Programmierens lustige Muster anzeigen. Ist aber nicht schlimm.
ISET beim MAX7219 ist nicht beschaltet. Ich habe eine Frage: wie notwendig is der Kondensator (47nF) beim RESET-Pin? Zumindest bei Bausteinen mit DebugWire raet ATMEL davon ab, einen Kondensator zu verwenden. Kann dieser Kondensator einfach weggelassen werden oder muss man dann unter Umstaenden mit ungewollten Resets rechnen? Th
Hi ihr, Gerhard wrote: > Ich kenne den Uhrenbaustein nicht. Braucht der Quarz wirklich keine > externen Kondensatoren nach Masse? -> Datenblatt. Zumindest die Beispielschaltung im Datenblatt lässt keinen erkennen, nein.. Gerhard wrote: > Für die Funktion nicht wichtig, aber eine Konvention, die zur besseren > Lesbarkeit des Schaltplans führt: GND-Symbole nach unten zeigen lassen, > Betriebsspannungssymbole nach oben (Norden). Hab ich umgesetzt. Gerhard wrote: > Du musst damit rechnen, daß die LEDs während des Programmierens lustige > Muster anzeigen. Ist aber nicht schlimm. Warum? Ich dachte, dafür sind die Widerstände in der Leitung, um den MAX während des Programmieren zu trennen? verwirrt Thomas Pircher wrote: > ISET beim MAX7219 ist nicht beschaltet. Ja, ich bin mir noch nicht ganz sicher, wie ich das mit der Helligkeitsregelung und dem Fotowiderstand machen sollte. Hast du dazu vielleicht ne Idee? Zum Kondensator: Den habe ich eigentlich nur drin, weil der hier im Tutorial in der Schaltung auch dabei ist. http://www.mikrocontroller.net/articles/Bild:Avr-schaltplan-1.gif
Sodele, Hab jetzt nochmal den Schaltplan erweitert und den LDR eingebaut. Ich denke mal, der Widerstand R8 wird zu nem Poti, um den Schwellwert einstellen zu können. ADC werde ich nicht nutzen, denn ich muss eigentlich nur wissen, ob hell oder dunkel. Eine qualitative Messung ist mir nicht wichtig. Sonst müsste eigentlich doch alles passen, oder? Abgesehen von der Sache mit den Widerständen R2 und R3, die in meinen Augen noch nicht ganz geklärt ist. Hmmm... Gruß, Daniel
Die beiden 10k-Widerstände würde ich einfach weglassen. Du brauchst sie in diesem speziellen Fall nicht, weil du ja nur Eingänge des MAX7219 am SPI-Interface hast. Diese stören den Flash-Vorgang nicht. Der Programmer wird allerdings nicht nur den Atmel, sondern auch den MAX beschreiben. 10k sind eh zu viel, 1k wären als "Isolationswiderstand" angemessen. Man benutzt diese, wenn ein Ausgang am SPI-Port angeschlossen ist, der während des Programmiervorgangs für einen Kurzschluß sorgen könnte. Der Widerstand wäre groß genug, um den Strom zu begrenzen, aber klein genug, um die Kommunikation nicht zu stören, wenn der Programmer nicht angeschlossen ist.
Danke Gerhard, Jetzt fällt es mir wie Schuppen von den Augen. ;) Und wenn ich möchte, dass die LEDs während des Programmierens keinen Mucks tun, dann setze ich einfach Jumper ein, richtig? Dann kann ich ja Montag mit'm verdrahten anfangen **froi**
Hi, Ich hab jetzt den MAX7219 mit ATMega8 verdrahtet. Allerdings muss irgendwo ein Fehler stecken: Wenn ich den Programmer anschließe und den µC programmiere, dann leuchten alle LEDs und bleiben auch an, nachdem ich den ISP abgezogen habe. Unterbreche ich die Stromversorgung, und stelle sie dann wieder her, dann bleibt alles aus. Als würde der ISP beim MAX7219 den Testmode auslösen. **grübel** Testweise habe ich die Initialisierungssequenz in eine Schleife gepackt. Wenn ich den Strom wegnehme, und wieder anschließe, dann bleibt alles duster. Ziehe ich jetzt den Jumper zwischen DIN und MOSI, dann flackern die LEDs. Stecke ich ihn wieder auf, dann leuchten alle. Manchmal, aber eher selten, gehen sie dann auch alle aus. Kann jemand aus dem Verhalten ableiten, wo der Fehler stecken könnte? Eventuell hat einer von euch mit dem IC schonmal dieses Problem gehabt. Ich hab mal den QT hier für euch, geschrieben in Pascal, sollte recht einfach zu lesen sein, auch für jemanden, der sich mit Pascal gar nicht auskennt:
1 | program Led_Clock; |
2 | |
3 | {$NOSHADOW} |
4 | { $WG} {global Warnings off} |
5 | |
6 | Device = mega8, VCC=5; |
7 | { $BOOTRST $00C00} {Reset Jump to $00C00} |
8 | |
9 | Import SysTick, SPIdriver; |
10 | |
11 | From System Import ; |
12 | |
13 | |
14 | Define |
15 | ProcClock = 1000000; {Hertz} |
16 | SysTick = 10; {msec} |
17 | StackSize = $0032, iData; |
18 | FrameSize = $0032, iData; |
19 | SPIpresc = 1; |
20 | SPIOrder = MSB; |
21 | SPICPOL = 0; |
22 | SPICPHA = 1; |
23 | SPI_SS = false; |
24 | |
25 | Implementation |
26 | |
27 | {$IDATA} |
28 | |
29 | {--------------------------------------------------------------} |
30 | { Type Declarations } |
31 | |
32 | type |
33 | |
34 | |
35 | {--------------------------------------------------------------} |
36 | { Const Declarations } |
37 | |
38 | {--------------------------------------------------------------} |
39 | { Var Declarations } |
40 | {$IDATA} |
41 | var |
42 | Dout : Word; |
43 | LOAD[@PortC] : byte; |
44 | LOADDDR[@DDRC] : byte; |
45 | {--------------------------------------------------------------} |
46 | { functions } |
47 | procedure InitPorts; |
48 | begin |
49 | LOADDDR := %00000001; // PC0 als Ausgang deklarieren |
50 | LOAD.0 := 1; // LOAD high |
51 | end InitPorts; |
52 | |
53 | {--------------------------------------------------------------} |
54 | { Main Program } |
55 | {$IDATA} |
56 | |
57 | begin |
58 | InitPorts; |
59 | EnableInts; |
60 | loop |
61 | Dout:=$0900; // Decode Mode deaktivieren |
62 | LOAD.0 := 0; // LOAD LOW |
63 | SPIOut(@Dout,SizeOf(Dout)); |
64 | LOAD.0 := 1; // LOAD HIGH |
65 | Dout:=$0A0F; // Intensität auf Maximum |
66 | LOAD.0 := 0; // LOAD LOW |
67 | SPIOut(@Dout,SizeOf(Dout)); |
68 | LOAD.0 := 1; // LOAD HIGH |
69 | Dout:=$0B07; // Anzahl der Displays = 8 |
70 | LOAD.0 := 0; // LOAD LOW |
71 | SPIOut(@Dout,SizeOf(Dout)); |
72 | LOAD.0 := 1; // LOAD HIGH |
73 | Dout:=$0C01; // Display einschalten |
74 | LOAD.0 := 0; // LOAD LOW |
75 | SPIOut(@Dout,SizeOf(Dout)); |
76 | LOAD.0 := 1; // LOAD HIGH |
77 | Dout:=$0F00; // Display Test aus |
78 | LOAD.0 := 0; // LOAD LOW |
79 | SPIOut(@Dout,SizeOf(Dout)); |
80 | LOAD.0 := 1; // LOAD HIGH |
81 | endloop; |
82 | end Led_Clock. |
//P.s.: Eigentlich bin ich kein Freund davon, aber CP mit dem AVRco-Forum, da der QT in Pascal geschrieben wurde. Danke euch schonmal, Daniel
Es ist zum Weinen. Ich weiß nicht, ob es an einer verseuchten Grundspannung liegt oder sonstwas. Sehr mysteriös ist wie schon geschrieben, dass alle LEDs leuchten. Eigentlich dürfte das nicht passieren. DIN habe ich ja mit einem Jumper mit MOSI verbunden. Wenn ich den Jumper entferne und langsam an die Pins der Brücke führe, flackert das Panel wie blöde. Ich habe jetzt zwischen dem VCC-PIN und einem der beiden GND-PIN einen 100nF-Kerko und einen 10µF-ELKO, so steht es zumindest hier: http://www.arduino.cc/playground/Main/MAX72XXHardware Was ich oben noch vergessen habe, das waren die PINS SCK und MOSI als Ausgänge zu schalten. Müssen vielleicht irgendwo noch welche Blockkondensatoren hin? :cry: Mein aktueller Code:
1 | program Led_Clock; |
2 | |
3 | {$NOSHADOW} |
4 | { $WG} {global Warnings off} |
5 | |
6 | Device = mega8, VCC=5; |
7 | { $BOOTRST $00C00} {Reset Jump to $00C00} |
8 | |
9 | Import SysTick, SPIdriver; |
10 | |
11 | From System Import ; |
12 | |
13 | |
14 | Define |
15 | ProcClock = 1000000; {Hertz} |
16 | SysTick = 10; {msec} |
17 | StackSize = $0032, iData; |
18 | FrameSize = $0032, iData; |
19 | SPIpresc = 1; |
20 | SPIOrder = MSB; |
21 | SPICPOL = 0; |
22 | SPICPHA = 1; |
23 | SPI_SS = false; |
24 | |
25 | Implementation |
26 | |
27 | {$IDATA} |
28 | |
29 | {--------------------------------------------------------------} |
30 | { Type Declarations } |
31 | |
32 | type |
33 | |
34 | |
35 | {--------------------------------------------------------------} |
36 | { Const Declarations } |
37 | |
38 | {--------------------------------------------------------------} |
39 | { Var Declarations } |
40 | {$IDATA} |
41 | var |
42 | Dout : Word; |
43 | LOAD[@PortC] : byte; |
44 | SPIDDR[@DDRB] : byte; |
45 | LOADDDR[@DDRC] : byte; |
46 | {--------------------------------------------------------------} |
47 | { functions } |
48 | procedure InitPorts; |
49 | begin |
50 | LOADDDR := %00000001; // PC0 als Ausgang deklarieren |
51 | SPIDDR.3 := 1; |
52 | SPIDDR.5 := 1; |
53 | LOAD.0 := 1; // LOAD high |
54 | end InitPorts; |
55 | |
56 | {--------------------------------------------------------------} |
57 | { Main Program } |
58 | {$IDATA} |
59 | |
60 | begin |
61 | InitPorts; |
62 | EnableInts; |
63 | loop |
64 | Dout:=$0900; // Decode Mode deaktivieren |
65 | LOAD.0 := 0; // LOAD LOW |
66 | SPIOutWord(Dout); |
67 | LOAD.0 := 1; // LOAD HIGH |
68 | Dout:=$0A01; // Intensität auf Maximum |
69 | LOAD.0 := 0; // LOAD LOW |
70 | SPIOutWord(Dout); |
71 | LOAD.0 := 1; // LOAD HIGH |
72 | Dout:=$0B07; // Anzahl der Displays = 8 |
73 | LOAD.0 := 0; // LOAD LOW |
74 | SPIOutWord(Dout); |
75 | LOAD.0 := 1; // LOAD HIGH |
76 | Dout:=$0C01; // Display einschalten |
77 | LOAD.0 := 0; // LOAD LOW |
78 | SPIOutWord(Dout); |
79 | LOAD.0 := 1; // LOAD HIGH |
80 | Dout:=$0109; // Display Test aus |
81 | LOAD.0 := 0; // LOAD LOW |
82 | SPIOutWord(Dout); |
83 | LOAD.0 := 1; // LOAD HIGH |
84 | endloop; |
85 | end Led_Clock. |
P.S.: Liegt das an mir, dass auf den letzten Beitrag keiner geantwortet hat? Wenn ja, bitte ich um Hinweise, was ich besser machen soll.
Warum verwendest Du nicht eine RS232 Schnittstelle, um Debug-Ausgaben sichtbar zu machen ? Ich finde so etwas sehr praktisch, besonders wenn man kein Oszi besitzt ...
Hallo Pete, Dann müsste ich mir auf dem Board erst eine Schnittstelle implementieren und bis ich die Teile habe... reichelt ist zwar gleich um die Ecke, aber... Letzendlich wird das wohl die letzte Möglichkeit sein. Vielleicht hat ja noch wer einen Geistesblitz... Danke dir aber für deinen Vorschlag. ;)
Nun, Es hat sich heraugestellt, dass es doch an meinem Code liegen muss, denn ein Basic Code aus den weiten des Webs läuft. Sollte ich den Code portiert haben, dann stelle ich ihn der Vollständigkeit halber hier reinstellen... ;) Gruß, Daniel
Hier ist der funktionierende Wühltext:
1 | program LED_BCD_Uhr; |
2 | |
3 | {$NOSHADOW} |
4 | { $WG} {global Warnings off} |
5 | |
6 | Device = mega8, VCC=5; |
7 | { $BOOTRST $00C00} {Reset Jump to $00C00} |
8 | |
9 | Import SysTick, RTclock; |
10 | |
11 | From System Import ; |
12 | |
13 | |
14 | Define |
15 | ProcClock = 1000000; {Hertz} |
16 | SysTick = 10; {msec} |
17 | StackSize = $0032, iData; |
18 | FrameSize = $0032, iData; |
19 | RTClock = iData, DateTime; {Time, DateTime} |
20 | RTCsource = SysTick; |
21 | |
22 | Implementation |
23 | |
24 | {$IDATA} |
25 | |
26 | {--------------------------------------------------------------} |
27 | { Type Declarations } |
28 | |
29 | type |
30 | |
31 | |
32 | {--------------------------------------------------------------} |
33 | { Const Declarations } |
34 | |
35 | {--------------------------------------------------------------} |
36 | { Var Declarations } |
37 | {$IDATA} |
38 | var |
39 | DOUT : Word; |
40 | SPIDDR[@DDRB] : byte; |
41 | i: byte; |
42 | |
43 | |
44 | {--------------------------------------------------------------} |
45 | { functions } |
46 | |
47 | procedure RTCtickSecond; // CallBack from RTCclock |
48 | begin |
49 | end; |
50 | |
51 | procedure RTCtickMinute; // CallBack from RTCclock |
52 | begin |
53 | end; |
54 | |
55 | procedure RTCtickHour; // CallBack from RTCclock |
56 | begin |
57 | end; |
58 | |
59 | procedure SendOutWord(DATA: Word); |
60 | var |
61 | n: byte; |
62 | temp: byte; |
63 | begin |
64 | for n := 7 downto 0 do |
65 | PORTB.5 := FALSE; |
66 | temp := Hi(DATA); |
67 | PORTB.3 := Bit(temp, n); |
68 | PORTB.5 := TRUE; |
69 | endfor; |
70 | |
71 | for n := 7 downto 0 do |
72 | PORTB.5 := FALSE; |
73 | temp := Lo(DATA); |
74 | PORTB.3 := Bit(temp, n); |
75 | PORTB.5 := TRUE; |
76 | endfor; |
77 | PORTB.2 := FALSE; |
78 | PORTB.2 := TRUE; |
79 | end; |
80 | |
81 | procedure WriteToMAX7219(DATA: Word); |
82 | begin |
83 | //Disable Ints |
84 | DisableInts; |
85 | |
86 | SendOutWord(DATA); |
87 | |
88 | EnableInts; |
89 | end; |
90 | |
91 | procedure InitiateMAX7219; |
92 | begin |
93 | SPIDDR := %0010 1100; //SPI SS, MOSI, SCK als Ausgang |
94 | |
95 | //Send to Shutdown |
96 | WriteToMAX7219($0C00); |
97 | |
98 | //Disable Decode Mode |
99 | WriteToMAX7219($0900); |
100 | |
101 | //Set Brightness LOW |
102 | WriteToMAX7219($0A09); |
103 | |
104 | //Set to 8 digits |
105 | WriteToMAX7219($0B07); |
106 | |
107 | //Deactivate Testmode |
108 | WriteToMAX7219($0F00); |
109 | |
110 | //Power it Up |
111 | WriteToMAX7219($0C01); |
112 | |
113 | end; |
114 | |
115 | |
116 | |
117 | {--------------------------------------------------------------} |
118 | { Main Program } |
119 | {$IDATA} |
120 | |
121 | begin |
122 | |
123 | EnableInts; |
124 | |
125 | for i := 0 to 3 do |
126 | InitiateMAX7219; |
127 | endfor; |
128 | |
129 | WriteToMAX7219($0101); |
130 | WriteToMAX7219($0203); |
131 | WriteToMAX7219($0307); |
132 | WriteToMAX7219($040F); |
133 | WriteToMAX7219($0509); |
134 | WriteToMAX7219($060B); |
135 | WriteToMAX7219($0707); |
136 | WriteToMAX7219($0800); |
137 | |
138 | loop |
139 | |
140 | nop; |
141 | |
142 | endloop; |
143 | |
144 | end LED_BCD_Uhr. |
Gruß, Daniel
Das von Dir geschilderte Problem kenne ich vom MAX7221. Ich nahm immer an, dass er in den Testmode geht, da alle LED leuchteten. Habe also immer versucht den Mode abzuschalten, aber brachte nix. Als ich dann einfach einmal Daten gesendet habe wurden diese jedoch angezeigt. Scheint also normal zu sein. Gruss
Hi, Ja, dass es einige Stolpersteine bei diesem Baustein gibt habe ich auch schon gehört und eben auch erfahren. Aber wenn der einmal läuft, dann ist es doch ein sehr bequemes programmieren.
for i := 0 to 3 do endfor; loop endloop; Bitte nenne das nicht Pascal ;-)
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.