Forum: Mikrocontroller und Digitale Elektronik AtMega328 teilweise instabil


von quirlmalve (Gast)


Angehängte Dateien:

Lesenswert?

Guten Tag,

ich habe einen für mich schwer zu findenen Bug in einer Platine. 
Schaltplan siehe Anhang. Ich habe bereits mehrere davon aufgebaut und 
bei ca der Hälfte kommt es regelmäßig zu Abstürzen oder der Atmega wird 
plötzlich extrem langsam (statt 16Mhz eher so 10 Hz oder so).

Unten ist ein Testcode angehängt, der diesen Absturz auslöst. Der 
eigentliche Code ist deutlich größer.

Ich weiß nur nicht, ob es an dem Schaltplanlayout liegt oder am Code 
oder vielleicht daran, dass der Atmel beim Löten (Heißluftofen mit Rampe 
bis 220°) kaputt geht.

Vielleicht hat jemand eine Idee, woran es liegen könnte.

Hier noch der Testcode (Arduino-IDE):
1
#include <EEPROM.h>
2
3
4
void eeprom_write_int(int p_address, int p_value);
5
unsigned int eeprom_read_int(int p_address);
6
void every_100_Millis();
7
void every_second();
8
9
short int led_step = 0;
10
int e_address = 1;
11
int e_value = 0;
12
int e_value_leds = 0;
13
unsigned long time_in_millis;
14
unsigned long last_time_in_millis;
15
unsigned long time_in_sec;
16
unsigned long last_time_in_sec;
17
18
int leds[] = {3, 2, 4, 5, 8, 9};
19
20
void setup() {
21
  pinMode(leds[0], OUTPUT);
22
  pinMode(leds[1], OUTPUT);
23
  pinMode(leds[2], OUTPUT);
24
  pinMode(leds[3], OUTPUT);
25
  pinMode(leds[4], OUTPUT);
26
  pinMode(leds[5], OUTPUT);
27
28
  Serial.begin(38400);
29
  e_value = eeprom_read_int(e_address);
30
  e_value_leds = eeprom_read_int(e_address + 2);
31
  Serial.print(F("Eeprom: "));
32
  Serial.print(e_value);
33
  Serial.print(F(";"));
34
  Serial.println(e_value_leds);
35
  e_value = e_value + 1;
36
  if (e_value > 254){
37
    e_value = 0;
38
  }
39
  e_value_leds = e_value_leds + 1;
40
  if (e_value_leds > 5){
41
    e_value_leds = 0;
42
  }
43
  eeprom_write_int(e_address, e_value);
44
  eeprom_write_int(e_address + 2, e_value_leds);
45
  
46
}
47
48
void loop() {
49
  time_in_millis = millis();
50
  time_in_sec = round(time_in_millis / 1000);
51
52
  if (last_time_in_sec != time_in_sec)
53
  {
54
    last_time_in_sec = time_in_sec;
55
    if (time_in_sec % 1 == 0) {
56
      every_second();
57
    }
58
  }
59
60
  if (time_in_millis - last_time_in_millis > 100 )
61
  {
62
    last_time_in_millis = time_in_millis;
63
    every_100_Millis();
64
  }
65
  delay(5);
66
}
67
68
69
void every_100_Millis() 
70
{
71
  led_step += 1;
72
  if (led_step == 2) {
73
    led_step = 0;
74
  }
75
  digitalWrite(leds[e_value_leds], led_step);
76
  Serial.println(millis());
77
}
78
79
void every_second()
80
{
81
}
82
83
84
85
//This function will write a 2 byte integer to the eeprom at the specified address and address + 1
86
void eeprom_write_int(int p_address, int p_value)
87
{
88
  byte lowByte = ((p_value >> 0) & 0xFF);
89
  byte highByte = ((p_value >> 8) & 0xFF);
90
91
  EEPROM.write(p_address, lowByte);
92
  EEPROM.write(p_address + 1, highByte);
93
}
94
95
//This function will read a 2 byte integer from the eeprom at the specified address and address + 1
96
unsigned int eeprom_read_int(int p_address)
97
{
98
  byte lowByte = EEPROM.read(p_address);
99
  byte highByte = EEPROM.read(p_address + 1);
100
101
  return ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00);
102
}

von Markus M. (adrock)


Lesenswert?

Hat der ATmega garkeine 100nF Stützkondensatoren spendiert bekommen oder 
sind die nur nicht eingezeichnet da die auf dem Arduino-Board(?) mit 
drauf sind?

von m.n. (Gast)


Lesenswert?

Meinst Du wegen des Doppelquarzes?

Ich vermute, daß die Kommentare im Programm den Ablauf verlangsamen. Der 
µC muß jedesmal nachdenken, was denn nun zu tun ist.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

quirlmalve schrieb:
> delay(5);
Ein Delay, das zyklisch mehrere Millisekunden oder gar Sekunden verbrät, 
ist ein Programmfehler.

> oder der Atmega wird plötzlich extrem langsam (statt 16Mhz eher so 10 Hz
> oder so).
Gefühlt oder gemessen? Falls das Zweitere: wo gemessen?

> ob es an dem Schaltplanlayout liegt
Das Layout kennen wir noch gar nicht. Aber der Schaltplan schaut schon 
mal naja, gewöhnungsbedürftig oder unüblich aus.

Und zumindest ich finde in diesem Suchbild keine Abblockkondensatoren. 
Ohne die geht das niemals zuverlässig...

von Einer K. (Gast)


Lesenswert?

quirlmalve schrieb:
> der Atmega wird
> plötzlich extrem langsam (statt 16Mhz eher so 10 Hz oder so).
Der kann sich nicht zwischen den 2 Quarzen im Schaltplan entscheiden.
;-)

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

quirlmalve schrieb:

 Nur mal so nebenbei gefragt:
1
 if (time_in_sec % 1 == 0) {
2
       every_second();
3
     }

 Wozu soll das gut sein ?

: Bearbeitet durch User
von quirlmalve (Gast)


Angehängte Dateien:

Lesenswert?

@Markus M.: Meinst du die 2 Kondensatoren, die direkt neben den Quartz 
kommen ? Wenn, dann wären die schon eingezeichnet.

@Autor: m.n. (Gast): Der Doppelquartz hat mit der bestückung zu tun. Die 
Platine wird natürlich nur mit einem Quartz bestückt. Einer der beiden 
ist sehr klein und schwer zu löten, deshalb gibts jetzt alternativ auch 
einen größeren.
Ich habe es mir ausnahmsweise mal erlaubt, in diesem Stück Minitestcode 
mit Kommentaren zu geizen....

@ Lothar Miller:  delay(xy) wird überarbeitet :)
Die Verlangsamung ist nur gefühlt, allerdings ist ein Symptom, dass der 
Watchdog (den ich im Testcode anscheinend gar nicht drin hab) bei diesen 
Abstürzen oder Verlangsamungen nicht ausgelöst wird oder zumindest erst 
nach Stunden statt nach Sekunden, was mich vermuten lässt, dass die 
Mühle eben irgendwie langsamer wird.

Bzgl. der Abblockkondensatoren: Das übersteigt mein E-Technikwissen. Was 
muss ich da lesen oder wissen und wo sollen die hin?

Bzgl. des Schaltplans, der kann schon unüblich sein, weil ich kein 
gelernter Etechniker bin. Ich hoffe, damit ist das Design des Plans 
gemeint und nicht die Verschaltungen.

Das (etwas unübersichtliche) Platinenlayout habe ich auch beigefügt. 
Darin sieht man auch "Doppelschalter" zu den Doppelquarzen, was wie 
gesagt etwas mit der Bestückung zu tun hat.

von quirlmalve (Gast)


Lesenswert?

@Marc Vesely: sorgt dafür, dass die Methode every_second() so ca. einmal 
die Sekunde ausgeführt wird.

von uwe (Gast)


Lesenswert?

Also erst mal Vref wird an einen 100nF angeschlossen der andere Pin des 
100nF geht zu GND.
Direkt ZWISCHEN jedem VCC und GND Pärchen kommt ein 100nF mit maximal 
3mm leitebahnlänge(besser kürzer).
http://www.lothar-miller.de/s9y/categories/14-Entkopplung

von Maxx (Gast)


Lesenswert?

quirlmalve schrieb:
> @Marc Vesely: sorgt dafür, dass die Methode every_second() so ca.
> einmal
> die Sekunde ausgeführt wird.

Mit Sicherheit nicht.

% ist der ganzzählige Rest der Teilung.
Da für jede Mögliche Zahl x in unsigned long gilt x = floor(x) * 1 + 0 
ist das Ergebnis immer 0 und damit dein if immer wahr
=>

Dein if ist wirkungslos.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

quirlmalve schrieb:
> @Marc Vesely: sorgt dafür, dass die Methode every_second() so ca. einmal
> die Sekunde ausgeführt wird.

 Aha.
 Und wann wird deine Abfrage etwas anderes als Null ergeben ?

von Plauz (Gast)


Lesenswert?

In welchen Fällen ist denn x % 1 ungleich 0?

von Plauz (Gast)


Lesenswert?

ninja'd

von quirlmalve (Gast)


Lesenswert?

interessanter Denkfehler, danke, das if kann man tatsächlich weglassen. 
Es gibt allerdings im Originalcode auch Methoden, die alle 2 oder 10 
Sekunden aufgerufen werden und da erscheint mir das dann schon sinnvoll.

Das ist aber bestimmt nicht das Problem, welches den Atmel zum Absturz 
bringt.

von Joachim B. (jar)


Lesenswert?

Aref nie an VCC das wählt man per Setting, allenfalls wer eine externe 
Vref einspeisen will der legt sie dort an.

Die fehlenden Abblockkondesatoren wurden ja schon bemäkelt, ich würde 
220-470nF wählen, wenn am Reset noch eine längere Strippe hängt würde 
ich dort 10-100nF spendieren und eine Diode parallel zum pullup.

von Jean (Gast)


Lesenswert?

> ... ich würde 220-470nF wählen ...

> ... 10-100nF spendieren ...

> ...  Diode parallel zum pullup ...

Kannst du das begründen?

von Joachim B. (jar)


Lesenswert?

Jean schrieb:
>> ... ich würde 220-470nF wählen ...
>
>> ... 10-100nF spendieren ...
>
>> ...  Diode parallel zum pullup ...
>
> Kannst du das begründen?

Die ehemals 100nF Abblockkondensatoren stammten aus einer Zeit als die 
ICs nicht so leistungsfähig waren und sehr viele verbaut wurden, die 
kapazitive Last sollte nicht zu groß werden, heute weniger ICs die 
stärker sind können auch mehr Buffer vertragen, es schadet nicht und ich 
muss nicht auf den 1/10 Ct. achten lieber auf Funktionssicherheit.

Kondensator am Reset, wenn lange Strippen dran sind ISP o.ä. kann das al 
Antenne wirken und Resets auslösen

Diode damit dieser Kondensator schneller nach VCC entladen wird wenn die 
VCC wegfällt.

Ich bin mit meiner Meinung ja nicht alleine, entweder schreiben alle von 
mir ab oder es hat sich bewährt.

: Bearbeitet durch User
von Maxx (Gast)


Lesenswert?

quirlmalve schrieb:
> Es gibt allerdings im Originalcode auch Methoden, die alle 2 oder 10
> Sekunden aufgerufen werden und da erscheint mir das dann schon sinnvoll.

Ist es aber nicht.
Das  %10 ist für eine ganze Sekunde lang wahr. d.h. wenn dein delay(5) 
dominant die Schleifenzeit bestimmt wird auch eine solche Abfrage ~200 
mal hintereinander ausgeführt.

Gibt es eine Funktion die neben der delay noch Zeit vertrödelt (>1s) 
dann kann es sein, dass die Funktion nie aufgerufen wird, da vllt. nie 
genaue Vielfache von 10 vorkommen.

---

Da du offensichtlich also nur einen Ausschnitt gezeigt hast und hier 
schon so einige Fallstricke stecken (viele viele viel Mehrfachaufrufe): 
Wieviele Ausgaben machst du per Serial.println und co? Irgendwann läuft 
auch der beste Buffer über (insbesondere, wenn die Ausgaben 
hunderte/Tausende Male die Sekunde passieren). Dann muss auf die 
Serielle Schnittstelle gewartet werden.

Mindestens 8 Zeichen (64 bit+start+stop) pro 5ms nach 100 Sekunden 
Laufzeit sehe ich. Das sind hier also schon 34% deiner maximal möglichen 
Übertragungsrate. Dazu kommen dann noch das was statt jede Sekunde alle 
5 ms aufgerufen und gesendet und die Dinge, die statt einmal alle x 
Sekunden alle 1 Sekunde lang alle 5ms gesendet wird.

von chris (Gast)


Lesenswert?

Maxx schrieb:
> Das  %10 ist für eine ganze Sekunde lang wahr.

Dafür hat er ja drum herum noch ganz korrekt die if-Abfrage:
1
if (last_time_in_sec != time_in_sec)


Was das hier allerdings bringen soll, weiß wohl auch niemand so genau:
1
time_in_sec = round(time_in_millis / 1000);


time_in_millis / 1000

ist eine int-Division und somit immer ganzzahlig. Da gibts also 
überhaupt nichts, was man runden könnte.

von quirlmalve (Gast)


Lesenswert?

Maxx schrieb:
> Da du offensichtlich also nur einen Ausschnitt gezeigt hast und hier
> schon so einige Fallstricke stecken (viele viele viel Mehrfachaufrufe):
> Wieviele Ausgaben machst du per Serial.println und co?

Im originalen Code sind das eigentlich weniger Ausgaben über seriell. 
Ich hatte schon die Vermutung, dass das Ganze etwas mit dem Serialbuffer 
zu tun haben könnte. Wenn du aber sagst, dass ich mit meinem Testcode 
bei 34% Auslastung der Schnittstelle bin, ist das doch ok, oder? Wie 
gesagt, im Originalcode wird deutlich weniger übertragen, eher so 20-30 
normale Wörter pro Sekunde.

Maxx schrieb:
> Gibt es eine Funktion die neben der delay noch Zeit vertrödelt (>1s)

Nein, definitiv nicht und da gab es auch noch nie ein Problem aber danke 
für den Hinweis. Der Testcode stürzt ja auch schon ab.

Danke für die vielen Hinweise auf die Abblockkondensatoren. Kann das 
alleine schon diese Abstürze verursachen? Im nächsten Layout sind die 
auf jeden Fall drin.

Das komische ist aber, dass eben ca. die Hälfte der hergestellten 
Platinen problemlos laufen und die andere Hälfte irgendwann immer zu so 
einem Absturz kommt. Und es ist auch nicht so, dass eine Platine mal 
geht und dann irgendwann mal wieder nicht.

Joachim B. schrieb:
> wenn am Reset noch eine längere Strippe hängt würde
> ich dort 10-100nF spendieren und eine Diode parallel zum pullup.

Da hängt in der Regel eine ca 30cm Leitung dran, die quer durch einen 
Schaltschrank geht. Da gab es auf jeden Fall auch schon komische Effekte 
mit angeschlossener RS232-Leitung an einen Rechner. Der zusätzliche 
Kondensator, soll der von DTR direkt am Stecker zu Gnd? Die Diode baue 
ich ein.

Der Atmel hängt sich aber auch mit Testcode auf, wenn gar nix an der 
seriellen Schnittstelle dranhängt.

von quirlmalve (Gast)


Lesenswert?

Joachim B. schrieb:
> Aref nie an VCC das wählt man per Setting

verstehe ich nicht ganz. Heißt das, ich kann das dem Atmel sagen, dass 
er das intern verschalten soll?

von Jean (Gast)


Lesenswert?

> Ich bin mit meiner Meinung ja nicht alleine, entweder schreiben alle von
> mir ab oder es hat sich bewährt.

Warum sollte von dir jemand abschreiben? Es gibt doch die Empfehlungen 
der Hersteller der ICs. An die halte ich mich (z. B. AVR042: AVR 
Hardware Design Considerations). Es hat mich nur interessiert, wie du 
deine Vorschläge begründest.

von Thomas E. (thomase)


Lesenswert?

Joachim B. schrieb:
> Die ehemals 100nF Abblockkondensatoren stammten aus einer Zeit als die
> ICs nicht so leistungsfähig waren und sehr viele verbaut wurden, die
> kapazitive Last sollte nicht zu groß werden, heute weniger ICs die
> stärker sind können auch mehr Buffer vertragen, es schadet nicht und ich
> muss nicht auf den 1/10 Ct. achten lieber auf Funktionssicherheit.

Welch ein Unsinn. Du hast keinen blassen Schimmer, wozu die Dinger da 
sind.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> Diode damit dieser Kondensator schneller nach VCC entladen wird wenn die
> VCC wegfällt.
Das ist unnötig seit es einen Brownout-Reset gibt...

von Joachim B. (jar)


Lesenswert?

Thomas E. schrieb:
> Welch ein Unsinn. Du hast keinen blassen Schimmer,

ach was!

Nur DU alleine hast den Durchblick? was für ein Ego, viel Spass im 
Leben!

von Joachim B. (jar)


Lesenswert?

Lothar M. schrieb:
> Das ist unnötig seit es einen Brownout-Reset gibt...

Mag ja sein, aber schaden tut sie auch nicht, man kann auch aus einer 
Diode ein Drama machen, es ist nicht dein Diodengeld was ich verbaue.

Wer sie weglassen mag darf doch, es wurde gefragt und habe geantwortet 
warum ich sie einbaue, ist einfach ein liebgewonnener Automatismus.

Gut Neuem sollte man sich nicht verschliessen, vielleicht lasse ich sie 
irgendwann weg, ich kann ja hinzulernen, anderen fällt es schwerer sogar 
nützliches zu befolgen wie Abblockkondensatoren überhaupt vorzusehen ;)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

quirlmalve schrieb:
> Heißt das, ich kann das dem Atmel sagen, dass er das intern verschalten
> soll?
Das steht im Datenblatt. Und das ist überhaupt die allererste 
Anlaufstelle, wenn es darum geht, wie welcher Pin zu verschalten ist. 
Für Aref steht da, dass dort entweder eine externe Referenzspannung 
angelegt werden kann oder aber bei Verwendung einer internen Referenz 
(also auch Vcc) dort lediglich ein Kondensator angeschlossen werden 
soll:
1
24.5.2   ADC Voltage Reference
2
If the user has a fixed voltage source connected to the AREF pin, the user
3
may not use the other reference voltage options in the application, as
4
they will be shorted to the external voltage. If no external voltage is
5
applied to the AREF pin, the user may switch between AVCC and 1.1V as
6
reference selection.
Quelle: 
http://www.atmel.com/images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf
Bedeutet also: man darf durchaus eine fixe Spannung dort anschließen, 
aber man darf dann nicht eine andere inerne Quelle als Referenz 
auswählen, weil es sonst einen Kurzschluss gibt. Das kann man sich auch 
leicht klarmachen, wenn man den Schaltplan des AD-Wandlers ansieht.

Joachim B. schrieb:
> Ich bin mit meiner Meinung ja nicht alleine, entweder schreiben alle von
> mir ab oder es hat sich bewährt.
Dazu passt das Ammenmärchen mit den zu verwerfenden ersten Messungen:
1
The first ADC conversion result after switching reference voltage source 
2
may be inaccurate, and the user is advised to discard this result.
Nur beim Umschalten der Referenz und sofortigem Start einer neuen 
Messung kann diese erste Messung ungenau sein. Wenn man umschaltet und 
danach eine Weile wartet, ist auch die erste Messung genau. Auch das 
wird von vielen falsch verstanden und jeder schreibt vom Anderen ab.

Joachim B. schrieb:
> Die ehemals 100nF Abblockkondensatoren stammten aus einer Zeit als die
> ICs nicht so leistungsfähig waren und sehr viele verbaut wurden, die
> kapazitive Last sollte nicht zu groß werden, heute weniger ICs die
> stärker sind können auch mehr Buffer vertragen
Blockkondensatoren müssen danach ausgewählt werden, welche Störfrequenz 
vom IC ausgeht und "geblockt" werden muss. Da kann bei hochfrequenten 
ICs und/oder steilen (internen!) Schaltflanken durchaus ein 10nF 
Kondesator die bessere Wahl sein...

: Bearbeitet durch Moderator
von Dergute W. (derguteweka)


Lesenswert?

Moin,

Also ehrlich: Datenblaetter lesen, bevor man in Kleinserie geht und sich 
wundert, ist doch heutzutage sowas von Eighties. Heutzutage gibts doch 
youtube, wo jeder Depp jeden Quatsch filmen und hochladen kann. Wen 
interessieren denn da noch die Datenblaetter und AppNotes von 
Herstellern?

Auch voellig ueberschaetzt, uninteressant und keinesfalls lesens- und 
verstehenswert waere z.B. das Kapitel 2.4 in den High Speed Layout 
Guidelines von TI - deshalb sollte man keinesfalls nach scaa082 googlen, 
sondern weiterhin Block-Cs am besten garnicht verwenden oder hoechstens 
nach Kaffeesatzleserei-Kriterien.

Allergikerinfo: Dieser Beitrag kann Spuren von Nuessen, 
Huelsenfruechten, sowie Gluten und Ironie enthalten.

Gruss
WK

von Carl D. (jcw2)


Lesenswert?

In welcher Art Gerät wird dieses Wunderwerk verbaut?
Ich frage nur um vorgewarnt zu sein.

von Joachim B. (jar)


Lesenswert?

Lothar M. schrieb:
> Blockkondensatoren müssen danach ausgewählt werden, welche Störfrequenz
> vom IC ausgeht und "geblockt" werden muss. Da kann bei hochfrequenten
> ICs und/oder steilen (internen!) Schaltflanken durchaus ein 10nF
> Kondesator die bessere Wahl sein...

vielleicht verwenden wir die Begriffe unterschiedlich!

Denn nenne ich sie Stützkondensatoren, auch wenn ich alt bin, einiges 
ändert sich nicht!

Die Kondensatoren an VCC sollen Spannungseinbrüche durch Stromänderungen 
am IC abschwächen die durch die Impedanz der Zuleitungen auch der 
Leiterbahnen entstehen, wenn du nun beweist das KerKos mit 220-470nF das 
schlechter schaffen als 100nF dann würde ich darüber nachdenken!

Dein Satz passt eher zu Reihenkondensatoren als Hochpass wo kleinere 
Kondensatoren von 10nF Frequenzen schlechter passieren lassen als 220nF.

Auch ein 470nF KerKo Schiesst die "Störfrequenz vom IC ausgeht" nach GND 
kurz,man nimmt ja keine Rollkondensatoren die hohe induktive Anteile 
haben.

Ich denke mehr als die Wahl Blockkondensator über die man trefflich 
diskutieren kann wirkt doch das gesamte Layout!

Da ist Blockkondensator nur ein Nebenkriegsschauplatz.

Und die 100nF in TTL Gräbern waren vielerlei geschuldet, den Kosten, dem 
Leiterbahnwiderstand und der kapazitiven Last am Netzteil.

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> Lothar M. schrieb:
>> Blockkondensatoren
> vielleicht verwenden wir die Begriffe unterschiedlich!
> Denn nenne ich sie Stützkondensatoren
Das ist lediglich die Kehrseite der Medaille.
Ursache für "das Problem" sind interne synchrone Schaltvorgänge. Wenn 
dann die Flipflops umschalten, gibt es in die nächsten Eingänge 
Umladeströme, die von der Versorgung bereitgestellt (=gestützt) werden 
müssen. Und weil die nötigen Stromspitzen so steilflankig sind und ein 
großes Störspektrum haben, sollten sie herausgefilter (=abgeblockt) 
werden.
Und das Alles kann ein so ein kleiner Kondensator bewerkstelligen... ;-)

: Bearbeitet durch Moderator
von Thomas E. (thomase)


Lesenswert?

Joachim B. schrieb:
> ach was!
>
> Nur DU alleine hast den Durchblick? was für ein Ego, viel Spass im
> Leben!

Ja, habe ich. Aber nicht nur ich. Viele andere auch. Du hast diesen 
Durchblick definitiv nicht. Wie viele andere auch. Im Gegensatz zu dir 
nehmen die aber die Ratschläge von Experten an und stellen Bewährtes 
nicht in Frage.

Joachim B. schrieb:
> Da ist Blockkondensator nur ein Nebenkriegsschauplatz.

Bei einem verhältnismäßig lahmen AVR ist es das tatsächlich. Da reicht 
es zumeist aus, daß auf der Tüte, aus der der Kondensator stammt, 
Keramik draufsteht. Bei einer Gigahertzgranate wie einem PC gehört die 
Auswahl und Platzierung der Stützkondensatoren zu den ultimativen 
Herausforderungen für das Platinendesign.

Joachim B. schrieb:
> Und die 100nF in TTL Gräbern waren vielerlei geschuldet, den Kosten, dem
> Leiterbahnwiderstand und der kapazitiven Last am Netzteil.

In den berühmten TTL-Gräbern waren übrigens 1µF-Tantal-Kondensatoren 
Erste Wahl. Einer pro IC-Reihe(Empfehlung aus einem TI-Handbuch von 
1983).
Erst als die Taktraten höher wurden, kamen die Keramikkondensatoren 
direkt am IC dazu.

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Thomas E. schrieb:
> Erst als die Taktraten höher wurden, kamen die Keramikkondensatoren
> direkt am IC dazu.
Das hat aber prinzipiell nichts mit der höheren Taktrate zu tun, 
sondern damit, dass die ICs "schneller" also steilflankiger 
umschalteten.
Somit war die Ursache für die Blockkondensatoren direkt am IC die selbe 
wie für die höheren Taktraten: schneller umschaltende ICs.

Das hat letztlich aber mit der eigentlichen Taktfrequenz des Designs 
nichts zu tun. Ein schlecht geblocktes Design wird auch mit 1kHz wie mit 
10MHz Taktfrequenz sauber vor sich hinstören...

: Bearbeitet durch Moderator
von Thomas E. (thomase)


Lesenswert?

Lothar M. schrieb:
> Thomas E. schrieb:
>> Erst als die Taktraten höher wurden, kamen die Keramikkondensatoren
>> direkt am IC dazu.
> Das hat aber prinzipiell nichts mit der höheren Taktrate zu tun,
> sondern damit, dass die ICs "schneller" also steilflankiger
> umschalteten.

Daß die ICs schneller schalten, ist aber die Voraussetzung. Gut, es ist 
korrekter ausgedrückt.

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Thomas E. schrieb:
> Im Gegensatz zu dir
> nehmen die aber die Ratschläge von Experten an und stellen Bewährtes
> nicht in Frage.

ach was, als die Brooklyn Bridge gebaut wurde geschah das mit viel 
Angstzuschlag, keiner hatte den Materialbedarf für den heutigen Verkehr 
berechnet, die "modernen" Brücken wurden ingenieursmäßig berechnet und 
halten kaum 40 Jahre!

Thomas E. schrieb:
> Joachim B. schrieb:
>> Da ist Blockkondensator nur ein Nebenkriegsschauplatz.
>
> Bei einem verhältnismäßig lahmen AVR ist es das tatsächlich.

wie war das TOPIC vom Thread?
ATmega328 und nur von dem schreibe ich!

Ein 470nF Keramikstützkondensator an den VCC ist allemal besser als 
10-100nF oder keiner!

Typische LS TTL haben keine 40mA pro Ausgang treiben können, ein AVR 
schon ergo braucht man mehr Stütze.

Thomas E. schrieb:
> Bei einer Gigahertzgranate wie einem PC

Das ist OT

Übrigens auch Hersteller können irren, falsche Datenblätter sind mir 
schon untergekommen und wer sagt denn das diese 100nF Empfehlung für 
alle Layouts gilt, ich sage mal für 95% passt es, das Problem können die 
letzten 5% werden.

Ausserdem will jeder Hersteller nicht schlechter dastehen als die 
Mitbewerber, wenn PIC 100nF empfiehlt macht eine 220nF Empfehlung das 
Produkt 8-Bit AVR teuerer im Design also wird wohl auch eher 100F 
empfohlen.

Zuviel Herstellergläubigkeit kann aufs Glatteis führen.

Durchblick?
Thomas E. schrieb:
> Ja, habe ich.

diskutier das mit Lothar :)

Lothar M. schrieb:
> Thomas E. schrieb:
>> Erst als die Taktraten höher wurden, kamen die Keramikkondensatoren
>> direkt am IC dazu.
> Das hat aber prinzipiell nichts mit der höheren Taktrate zu tun,
> sondern damit, dass die ICs "schneller" also steilflankiger
> umschalteten.

Hier beim TO scheint es aber nur an den vergessenen Cs zu liegen und an 
der Software!

Ich hatte auch viele Debugausgaben am Serial.print der Buffer ist 
default mir zu klein, dann spinnt die Kiste!
Man kann den Buffer in der Arduino IDE aber erhöhen!
(dabei den SRAM Bedarf nicht aus den Augen verlieren!)

: Bearbeitet durch User
von Harald W. (wilhelms)


Lesenswert?

Dergute W. schrieb:

> Also ehrlich: Datenblaetter lesen, bevor man in Kleinserie geht und sich
> wundert, ist doch heutzutage sowas von Eighties. Heutzutage gibts doch
> youtube, wo jeder Depp jeden Quatsch filmen und hochladen kann. Wen
> interessieren denn da noch die Datenblaetter und AppNotes von
> Herstellern?

Ich nehme an, im Berufsschulunterricht von einschlägigen Berufen
werden auch nur noch solche Jutuubs gezeigt und die Berufsschul-
Lehrer sind mehr oder weniger entbehrlich? :-)

von Harald W. (wilhelms)


Lesenswert?

Carl D. schrieb:

> In welcher Art Gerät wird dieses Wunderwerk verbaut?
> Ich frage nur um vorgewarnt zu sein.

Vielleicht in selbstfahrenden Autos?

von Joachim B. (jar)


Lesenswert?

Dergute W. schrieb:
> Moin,
>
> Also ehrlich: Datenblaetter lesen, bevor man in Kleinserie geht und sich
> wundert,

Datenblätter können falsch sein, sind es manchmal auch und wer vom 
Hersteller vorgeschlagene Layouts abweicht ohne die Prüfungen zu 
wiederholen kann auch ganz fürchterlich auch als Profi auf die Nase 
fallen so geschehen bei einem Telefon in tausender Stückzahlen!

Wer sagt denn das zum Stützkondensator nicht auch die parasitären 
Kapazitäten vom Layout und vom Basismaterial gehört für eine 95% 
Funktion (von der Menge der verbauten µC Controller)?

von Carl D. (jcw2)


Lesenswert?

Harald W. schrieb:
> Carl D. schrieb:
>
>> In welcher Art Gerät wird dieses Wunderwerk verbaut?
>> Ich frage nur um vorgewarnt zu sein.
>
> Vielleicht in selbstfahrenden Autos?

Vermutlich wäre man verwundert, wenn man deren Software sehen würde. 
Aber die wissen, warum Open Source böse ist. Und wer obiges Testprogramm 
sieht, weiß es auch. Manche Geschäftsgeheimnisse sind einfach zu 
blamabel um sie preis zugeben.

von Carl D. (jcw2)


Lesenswert?

Joachim B. schrieb:
> Wer sagt denn das zum Stützkondensator nicht auch die parasitären
> Kapazitäten vom Layout und vom Basismaterial gehört für eine 95%
> Funktion (von der Menge der verbauten µC Controller)?

Das Layout läßt aber keine Masseflächen erkennen, die als "Stütz-C" 
dienen könnten. Ich sehen da nur jede Menge L's.

von Joachim B. (jar)


Lesenswert?

Carl D. schrieb:
> Das Layout läßt aber keine Masseflächen erkennen, die als "Stütz-C"
> dienen könnten.

stimmt, war von mir ja nur ein Beispiel, über DAS Layout kann man ja 
wirklich kein weiteres Wort verlieren, das sieht eher aus wie meine 
Küche nach Backen und Kochen

von quirlmalve (Gast)


Lesenswert?

Carl D. schrieb:
> Und wer obiges Testprogramm
> sieht, weiß es auch.

Hast du da konkrete Kritikpunkte ?

von Jobst M. (jobstens-de)


Lesenswert?

Dergute W. schrieb:
> Also ehrlich: Datenblaetter lesen, bevor man in Kleinserie geht und sich
> wundert, ist doch heutzutage sowas von Eighties.

Da gibt's 'ne App für!


Joachim B. schrieb:
> Typische LS TTL haben keine 40mA pro Ausgang treiben können, ein AVR
> schon ergo braucht man mehr Stütze.

Dafür sind die Kondensatoren aber gar nicht ...



Gruß


Jobst

von Joachim B. (jar)


Lesenswert?

Jobst M. schrieb:
> Dafür sind die Kondensatoren aber gar nicht ...

[Loriot]
ach was
[/Loriot]

von Thomas E. (thomase)


Lesenswert?

Joachim B. schrieb:
> Typische LS TTL haben keine 40mA pro Ausgang treiben können, ein AVR
> schon ergo braucht man mehr Stütze.

Thomas E. schrieb:
> Du hast keinen blassen Schimmer, wozu die Dinger da
> sind.

Joachim B. schrieb:
> Backen und Kochen

Du solltest dich darauf beschränken.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Joachim B. schrieb:
> Typische LS TTL haben keine 40mA pro Ausgang treiben können, ein AVR
> schon ergo braucht man mehr Stütze.

 Ohne auf die Richtigkeit deiner Aussage einzugehen:
 Wenn man es schon mit Lateinisch versucht, sollte auch die
 Interpunktion stimmen.

: Bearbeitet durch User
von Myka (Gast)


Lesenswert?

Hallo quirlmalve,

ohne die wertvolle Beiträge der Granden des Forums unterbrechen zu 
wollen, habe ich den Eindruck gewonnen, diese fokussieren nicht 
ausschließlich auf Dein ursprüngliches Anliegen.

Ich möchte Dir zunächst meine Hochachtung dafür aussprechen, das Du mit 
Fritzing etwas funktionierendes hast schaffen können.
Ich habe Fritzing auch versucht, nach 2 Tagen ob der vielen Bugs 
und/oder unintuitiven Bedienung aufgegeben.

Falls Du noch mal eine Leiterplatte entwerfen möchtest: Wähle ein 
anderes Tool. Mein Favorit ist Target 30001!, Eagle tut es ebenso seit 
Jahren für tausende Projekte, KiCad fast ebenso wie Circuit Maker.

Ein gutes Layout ist auch irgendwie schön, was Fritzig erzeugt hat, ist 
.... nicht schön.
Wenngleich vermutlich nicht verantwortlich für die von Dir geschilderten 
Probleme.

Ich habe einige geringe Amateur(in)Erfahrung mit Arduino.
Was ich ändern würde:
1) Abblockondensatoren.
Sieh' Dir das Referezdesing an, z.B. hier:
https://www.arduino.cc/en/uploads/Main/Arduino_Uno_Rev3-schematic.pdf
Wo ein Pluspol ist, ist ein 100 nF Kondensator nach Masse.

2) Bau Ausdrücke wie
if (time_in_sec % 1 == 0)
um in
if (time_in_sec - last_time_in_sec >  1) ;
Den Konstrukt hast Du ohnehin schon eingesetzt bei ...milis > 100

Die Gründe, warum, sind schon genannt.

3) Serial.begin(38400); -> Serial.begin(115200);
Innerhalb meiner Erfahrung hat eine niedrige Serial-Geschwindigkeit noch 
nie genutzt. Egal was nicht ging - es ging nicht, weder mit 115200 noch 
mit 9600.
Deine IDE-Speed solltest Du natürlich auch anpassen

4) Hinter jeder verdächtige Anweisung ein Serial.print. An Hand der 
letzen weist Du, wo die Kiste stehen blieb.
Besonders verdächtig sind Pointer, welche man ausrechnet, wie p_address 
in EEPROM.write(p_address, lowByte);
oder Aufrufe von Interface Routine, bei den z.B das Handshaking oder die 
Interrupts nicht stimmen oder nicht erkannt werden.
Aber auch sonst lohnt es sich, die berechneten Variablen auszugeben und 
nachzusehen, ob diese so etwa das sind, was man sich beim 
Programmentwurf dachte.
Innerhalb meiner Erfahrung, und ich versicher Dir, ich war nicht sparsam 
mit den Serial.prints :-), sind keine Probleme mit dem Serial - Puffer
aufgetreten, wie oben befürchtet.

5) Bist Du sicher, das der Speicher ausreicht - SRAM, EEPROM ?

Myka

von quirlmalve (Gast)


Lesenswert?

Hallo Myka,

ich glaube, jetzt hast du die "Granden des Forums" doch zum Schweigen 
gebracht. Vielleicht war dein Beitrag einfach zu nett, so dass es ihnen 
die Sprache verschlagen hat. Vielen Dank für die freundlichen Worte und 
die vielen Tipps. Ich habe schon angefangen, mich in KiCAD 
einzuarbeiten, das Fritzing nervt mich schon lange mit seinen ganzen 
Bugs und anderen Problemen.

Ich werde jetzt das PCB-Layout nochmal komplett neu machen und natürlich 
alle nötigen Kondensatoren einbauen.

Auch an alle anderen vielen Dank, ich mach mich mal an die Arbeit und 
werde die ganzen Hinweise einarbeiten. Man lernt nie aus, danke fürs 
Unterrichten und viel Spaß mit dem Comic;)

http://dilbert.com/strip/2015-04-02

von Frickelfritze (Gast)


Lesenswert?

quirlmalve schrieb:
> Ich werde jetzt das PCB-Layout nochmal komplett neu machen und natürlich
> alle nötigen Kondensatoren einbauen.

.... und wenn du es wirklich gut machen willst dann lass dir
vor dem Layouten vom Forum hier den Schaltplan diskutieren
und beim Layouten hier auch laufend das Layout. Denn mit
deinen geringen Erfahrungen wirst du noch etwas Unterstützung
brauchen. Die Einsicht dazu hast du ja wenigstens schon ....

von quirlmalve (Gast)


Lesenswert?

Danke, werd ich. Die Einsicht hatte ich übrigens schon immer und werd 
sie auch hoffentlich immer haben.

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.