Forum: Mikrocontroller und Digitale Elektronik (Eagle-) Anfänger bräuchte Hilfe bei Schaltplan


von Daniel G. (daniel-g)


Angehängte Dateien:

Lesenswert?

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

von Olaf (Gast)


Lesenswert?

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

von Daniel G. (daniel-g)


Lesenswert?

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.

von Daniel G. (daniel-g)


Angehängte Dateien:

Lesenswert?

So,

Habe den Plan mal aktualisiert. Habe R2 und R3 noch nicht geändert, aber 
den Rest. Ist es jetzt besser?

von Justus S. (jussa)


Lesenswert?

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

von Daniel G. (daniel-g)


Angehängte Dateien:

Lesenswert?

Hi Justus,

Danke. Das heißt also, so wäre es richtig und die Kondensatoren könnten 
ihren Zweck erfüllen, oder?

von Justus S. (jussa)


Lesenswert?

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

von Daniel G. (daniel-g)


Angehängte Dateien:

Lesenswert?

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.

von Gerhard (Gast)


Lesenswert?

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

von Gerhard (Gast)


Lesenswert?

Du musst damit rechnen, daß die LEDs während des Programmierens lustige 
Muster anzeigen. Ist aber nicht schlimm.

von Thomas P. (tpircher) Benutzerseite


Lesenswert?

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

von Daniel G. (daniel-g)


Lesenswert?

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

von Daniel G. (daniel-g)


Lesenswert?

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

von Daniel G. (daniel-g)


Angehängte Dateien:

Lesenswert?

Argh... Anhang vergessen... :(

von Gerhard (Gast)


Lesenswert?

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.

von Daniel G. (daniel-g)


Lesenswert?

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**

von Daniel G. (daniel-g)


Lesenswert?

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

von Daniel G. (daniel-g)


Lesenswert?

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.

von Pete K. (pete77)


Lesenswert?

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

von Daniel G. (daniel-g)


Lesenswert?

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. ;)

von Daniel G. (daniel-g)


Lesenswert?

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

von Daniel G. (daniel-g)


Lesenswert?

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

von Guest (Gast)


Lesenswert?

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

von Daniel G. (daniel-g)


Lesenswert?

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.

von Gast (Gast)


Lesenswert?

for i := 0 to 3 do
endfor;

loop
endloop;

Bitte nenne das nicht Pascal ;-)

von Daniel G. (daniel-g)


Lesenswert?

Immer noch schöner als Basic und C. ;)

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
Noch kein Account? Hier anmelden.