Hallo zusammen,
ich arbeite jetzt schon ca einen Monat an meinem richtigen Elektronik-Projekt - nichts großes, nur gibt es viel zu lernen ;)
Nach der ersten Runde PCBs hatte ich festgestellt, dass ich noch einen MCU brauche. Den habe ich dann ergänzt und neue Boards bestellt. Ein board habe ich jetzt bestückt, aber der MCU will sich nicht programmieren lassen - avrdude erkennt ihn einfach nicht ("Error: initialization failed", oder mit -F: "Device signature = 00 00 00 (retrying)").
Ich habe mich ein bisschen umgeguckt und festgestellt, dass mir ein reset-pullup fehlt. Den habe ich zum Testen dann an den ICSP header drangelötet (funktioniert tatsächlich), aber es tut sich immer noch nichts. Auch ein 100nF Kondensator zwischen VCC und VSS hat nichts gebracht (den Widerstand habe ich mittlerweile auf dem Board ergänzt. Für den cap ist mir keine offensichtlich tolle Lösung eingefallen, also habe ich ihn von vor der Didode nach dahinter geschoben. Der Anhang repräsentiert noch das alte Board, so wie ich es gerade physisch bei mir liegt.).
Die ungenutzten Pins sind alle direkt mit VSS verbunden, weil das Datasheet gesagt hat, dass ein festes Level den Verbrauch des MCUs senken kann (Idealerweise will ich mich mit dem Verbrauch des MCU im Bereich von 0 bis ca. 10uA bewegen - weniger ist besser.). Mir wurde gesagt, dass ich auch die internen Widerstände benutzen kann, was dann die nächste PCB-Bestellung umsetzen wird.
Auch habe ich die AVR-Checkliste auf dieser Seite gefunden, die hat mir aber leider nicht weitergeholfen.
Sicherheitshalber habe ich mal alle SPI-Pins im Diodentest durchgemessen und ich bekomme da überall "normale" Werte, also der Chip scheint zumindest oberflächlich in Ordnung zu sein. Die wichtigen Pins sind alle tatsächlich verlötet und soweit ich erkennen kann nicht irgendwie miteinander verbunden. Den ICSP header habe ich direkt durchgemessen, und da auch nichts gefunden. Ich habe noch nicht probiert einen anderen MCU aufzulöten, weil ich nicht weiß, ob irgendwas auf dem Board den momentanen MCU gesprengt hat, und wenn ja, warum.
Ein Oszilloskop habe ich auch mal angeschlossen. Der Reset-Pin landet tatsächlich auf einem sauberen Logik-Niveau. Auf MOSI ist Kommunikation auch klar erkennbar (und ja, meinen usbtinyisp habe ich mit einem arduino uno getestet). Auf MISO ist nur schwache Noise (kurz vor dem LL zu LH Übergang des Reset-pins glaube ich ein bisschen Chip-Aktivität zu erkennen - kaum lauter als die Noise auf der Leitung.). Die Noise auf den Leitungen bewegt sich im Bereich von bis zu +-100mV zu bewegen. Zugegeben habe ich keine Ahnung, ob irgendwas in diesem Absatz von Relevanz ist, aber man lernt ja immer dazu.
Ich bin ehrlich verwirrt bei sechs Pins so gravierend schief gehen kann. Hat hier vielleicht jemand eine Idee, was ich übersehe?
Das Datasheet sagt, dass man ungenutzte Pins zu Gnd verbinden soll. Ich benutze nur die beiden i2c Interfaces, und wollte den ADC eh ausschalten.
So wie ich das verstanden habe ist der ADC nur für analoge Messungen Relevant. Im Datasheet steht, soweit ich erkennen kann, nicht, dass man besonders mit dem Pin umgehen soll
Das Datasheet sagt, dass man ungenutzte Pins zu Gnd verbinden soll.
Naja...
Aref ist keine normaler IO Pin.
Das Datenblatt sagt eher, dass man ihn mit 100nF gegen GND abstützen soll.
Und die anderen brauchen auch kein GND, da reicht der interne Pullup oder diese Pins auf OUTPUT zu stellen.
Falls man später den 328pb a la Arduino mit AVRDude programmieren möchte, bitte beachten, daß sich die gültigen RESET Schaltschwellen im Vergleich zum 328p unterscheiden. Wer dann versucht mit einem 3.3V USB Serial (CP2103 oder FT232RL) Kabel zu arbeiten wird oft Schiffbruch erleben, da die Spannung des Serial-RTS dann nicht mehr ausreicht, den RESET-Pin weit genug nach Masse hin zu schalten. Ohne Modifikation funktioniert es nur sporadisch.
Ein Vergleich der Datenblätter bestätigt diesen Sachverhalt.
Ich hatte das Problem vor einigen Jahren erstmalig mit 328PB Bords von Watterott. Eine "stopgap" Lösung des Problems war, den Reset Pin über einen 33K mit RTS zu überbrücken. (In parallel mit dem Reset Kondensator zwischen RTS und RESET). Diese Massnahme löste das Problem. Ich informierte übrigens Watterott von dem Problem und es ist seitdem auch dort dokumentiert.
Über ISP hatte ich übrigens allerdings mit dem 328PB niemals Probleme.
Also bei mir hat das nur so funktioniert: Programmer mit einem levelshifter auf 3,3V zum ATmega328 hin. Der muß 328 vorher mit seiner 3,3V-Versorgung laufen, dann den Programmer anstecken und mit der Arduino IDE programmieren. Die Fehlermeldung bedeutet ja, daß der uC nicht reagiert. Mein 328P-AU (TQFP-SMD) war auch anfangs nicht ordentlich verlötet, einige pins sahen nur so aus, als ob. Habe auch 8MHz ohne Oszillator verwendet.
Programmer mit einem
levelshifter auf 3,3V zum ATmega328 hin. Der muß 328 vorher mit seiner
3,3V-Versorgung laufen, dann den Programmer anstecken und mit der
Arduino IDE programmieren.
Also so wie ich das verstanden habe muss der Chip nicht erst mit eigener Stromversorgung laufen. Der Programmer bringt ja - sofern angeschlossen - selber eine 5V Versorgungsspannung mit. Der Arduino Uno, mit dem ich den Programmer getestet habe, musste auch nicht an eine zusätzliche Stromversorgung angeschlossen werden.
Bezüglich der 3.3v möchte ich auf die Antwort von gerhard_ verweisen: Der 328P kommt beim Programmieren mit 3.3v wohl deutlich besser klar als der 328PB.
Wenn du ein Oszilloskop hast, messe VCC und RESET in dem Moment, wo der Programmiervorfang startet. Zeige uns due Bilder vielleicht sehen wir da schon was. Wenn nicht, wären als nächstes die drei Signale der ISP Schnittstelle von Interesse.
... und sag mal welcher ISP Programmer Du einsetzt.
Wenn Du später mit Arduino usw. was machen willst, dann verwende
noch ein Resonator / Quarz und baue die Resetbeschaltung mit auf.
Wenn die Spannungversorgung über den ISP Programmer kommt,kannst Du
Dir den LDO usw. vorerst sparen.
Schau Dir mal die Standardschaltungen im Web an - daran kann man
sich grob orientieren.
Also so wie ich das verstanden habe muss der Chip nicht erst mit eigener
Stromversorgung laufen. Der Programmer bringt ja - sofern angeschlossen
selber eine 5V Versorgungsspannung mit. Der Arduino Uno, mit dem ich
den Programmer getestet habe, musste auch nicht an eine zusätzliche
Stromversorgung angeschlossen werden.
Das war eigentlich nicht so gedacht. Der VCC-Pin ist eigentlich nur dafür da, die Pegelwandler (GUTE Programmer haben welche) zu versorgen, damit die Logikpegel am Programmierstecker exakt zur Versorgungsspannung des Prozessors passen.
Viele Leute vergessen auch, dass alle digitalen ICs an ihren Eingängen nur Spannungen zwischen 0 und der Versorgungsspannung vertragen, sofern es nicht ganz ausdrücklich im Datenblatt anders beschrieben wird. Wenn also nur der Prozessor versorgt wird, nicht aber der Rest der Schaltung, können unter Umständen seltsame Dinge passieren.
Dann sehe ich im Schaltplan keine Abblockkondensatoren. JEDES VCC/GND-Paar (und AVCC/AGND) braucht einen eigenen - in der Regel 100nF - Kondensator (keramisch, X7R, möglichst kleine mechanische Bauform, weil sich dadurch die interne Induktivität reduziert) möglichst dicht an den Pins (da zählt jeder Millimeter).
Zu den ungenutzten IO-Pins: Ich würde die unbeschaltet lassen und beim Start auf Ausgang und 0 programmieren.
Und wenn Du WIRKLICH die Leistung reduzieren willst, dann reduzierst Du besser die Versorgungsspannung. Schau Dir die Graphen im Datenblatt im Abschnitt 34.1 an. Der Strom halbiert sich in etwa, die Leistung viertelt sich ganz grob. Gut, der 328PB is eine alte Kamelle. Moderne AVRs aus der nach-Atmel-Zeit laufen intern eh mit 1.8V, und nur der IO-Ring wird mit der externen Versorgungsspannung betrieben. Daher laufen die dann auch bei niedriger Versorgungsspannung mit vollem Takt. Du hast hier also keine wirklich gute Wahl getroffen.
Habe ich angehängt. Gelb ist reset, Hellblau ist MOSI und Lila ist MISO.
Das triggerniveau habe ich für das Bild auf das Reset-High(Low?) Niveau gesetzt, dass man da die 1.0V erkennt.
Die Diode am Regler würde ich entfernen(überbrücken) und die Schaltung
generell nicht über den Prog-Stecker versorgen.
Wieso das? Es hängt ja bei mir NUR der MCU dran. Absolut nichts anderes.
Der Uno lässt sich mit dem Programmer problemlos durch den ICSP header versorgen. Ich brauche keinerlei externe Stromversorgung, und der Uno hat deutlich mehr Teile an board als ich hier.
JEDES
VCC/GND-Paar (und AVCC/AGND) braucht einen eigenen - in der Regel 100nF
Kondensator
Wie soll ich das dann mit dem LDO-Kondensator machen? De sitzen ja dann parallel und dann habe ich 1.001uF statt 1nF...
Im MiniCore minimal setup hängt AVCC einfach an VCC und hat gar keinen eigenen Kondensator.
Wenn die Spannungversorgung über den ISP Programmer kommt,kannst Du
Dir den LDO usw. vorerst sparen.
Das Programmieren möchte ich machen, bevor ich die eigentliche Stromversorgung anschließe - aus Sicherheitsgründen. Der LDO muss also sein, und die Diode scheinbar auch.
Sorry, dass die Antwort so lange gebraucht hat. Hatte schwierigkeiten das alles halbwegs sauber mit dem Oszi zu verdrahten...
Forsche mal nach warum das RESET Signal nicht auf 0V geht. Reset wird direkt vom selben 74HCxx angetrieben, wie MOSI. MOSI hat einen 1,5k Widerstand in Reihe. Also müsste der RESET Pin mindestens ebenso weit runter kommen wie MOSI.
Die Differenz von 0,7V riecht verdächtig nach einer ESD Schutzdiode. Vielleicht hat dein Programmieradapter einen Kabelbruch auf der GND Leitung.
Forsche mal nach warum das RESET Signal nicht auf 0V geht. Reset wird
direkt vom selben 74HCxx angetrieben, wie MOSI. MOSI hat einen 1,5k
Widerstand in Reihe. Also müsste der RESET Pin mindestens ebenso weit
runter kommen wie MOSI.
Guter Einwand. Ich habe gerade mal in das Datasheet geguckt und tatsächlich scheint das Reset-Signal nicht weit genug runterzukommen. Wenn ich das richtig verstehe (Screenshot angehängt) muss das Signal bei High(Low?) zwischen -0.5 und 1V liegen. Da ist 1V ziemlich grenzwertig...
Wie muss ich das mit dem Kabelbruch verstehen? Warum würde ein Kabelbruch verhindern, dass das Signal auf 0V herunterkommt? Wenn das Board angeschlossen ist, kann ich GND definitiv vom Programmer zum Board durchmessen, und ich bin mir unsicher, was Du sonst damit meinst.
Das Programmieren möchte ich machen, bevor ich die eigentliche
Stromversorgung anschließe
deshalb ja nur der ISP Programmer für die Spannungsversorgung.
Wenn der Chip i.O ist und alles passt muss ein "Only Read" möglich sein
und Du kannst die ID und die Fuse Settings und den Speicher auslesen.
Mehr braucht es für eine grobe Überprüfung der ISP Verdrahtung nicht.
Das läuft dann auch mit einer DIL Version auf den Steckbrett, nur mit
angeschlossen ISP Programmer und ohne viel "Drumherum"
Zur Not erst einmal den ISP Takt etwas verringern um auf Nummer sicher zu gehen - durch den wilden Aufbau auf dem Steckbrett ist das manchmal nötig.
Bitte überpürfe auch Deine Fuse Einstellungen (internal Clock) - nicht dass da das eigentlich Problem ist.
Im Web gibt es gute Seiten mit Fuse Calculatoren.
deshalb ja nur der ISP Programmer für die Spannungsversorgung.
Wenn der Chip i.O ist und alles passt muss ein "Only Read" möglich sein
und Du kannst die ID und die Fuse Settings und den Speicher auslesen.
Oh ich hatte Dich bei meiner vorherigen Antwort etwas missverstanden. Ja, der LDO könnte weg, aber es ändert ja so gesehen jetzt auch nichts, dass er da ist.
Auslesen vom Chip ist momentan nicht möglich. Die Fuses konnte ich bisher nicht einstellen, weil ich nicht auf den Chip zugreifen konnte, sind also alle auf den defaults. Die Chips kommen wie schon gesagt direkt vom Hersteller und sind unbenutzt.
ihren Eingängen
nur Spannungen zwischen 0 und der Versorgungsspannung vertragen
Laut Datasheet hält der 328PB sogar 6V aus. Da sollten die 5V vom
Programmer eigentlich ideal sein...?
Das war der erste Fehler. Du hast in die Absolute Maximum Ratings geschaut. Das sind die Werte, bei der der Chip kurzzeitig gerade noch nicht stirbt. Damit designt man nicht. Du nimmst gefälligst die Recommended Ratings.
Das zweite sind die IO-Pins: Unter 33.2 steht ganz klar:
"Input High Voltage, except XTAL1 and RESET pins: max Vcc+0.5V"
Wenn VCC=0V ist, dann beschädigt jede Spannung über 0.5V an einem beliebigen IO-Pin den Chip. Gilt für so gut wie jeden digitalen Chip, wobei oft nur 0.3V extra erlaubt sind.
JEDES
VCC/GND-Paar (und AVCC/AGND) braucht einen eigenen - in der Regel 100nF
Kondensator
Wie soll ich das dann mit dem LDO-Kondensator machen? De sitzen ja dann
parallel und dann habe ich 1.001uF statt 1nF...
Genau so.
Zweiter Fehler. Du betrachtest Leiterbahnen als einfache Verbindung. Stimmt so nicht. Jedes mm an Leiterbahn hat einen Widerstand, eine Kapazität und eine Induktivität. Jede Leiterbahn zwischen zwei Bauteilen ist also auch ein Bauteil. Deswegen hast Du keine einfache Addition von Kapazitäten, und deswegen ist es auch nicht egal, wo die Kondensatoren sind.
Unter 33.2 steht ganz klar:
"Input High Voltage, except XTAL1 and RESET pins: max Vcc+0.5V"
Wenn VCC=0V ist, dann beschädigt jede Spannung über 0.5V an einem
beliebigen IO-Pin den Chip. Gilt für so gut wie jeden digitalen Chip,
wobei oft nur 0.3V extra erlaubt sind.
Ich sehe das Problem nicht. Soweit ich das erkennen kann habe ich nichts verpolt.
Hm ok alles klar, vielen Dank für die Erklärung. Dann werde ich versuchen, den auch noch unterzubringen.
Muss ich den ergänzen bevor hier irgendwas klappen kann oder sollte ich den ergänzen aber es wird für meine wenigen Tests auf dem alten Board auch noch so funktionieren?
Bei 1.8V wird der interne Crystal zu langsam. Ich brauche meine 8MHz. 4MHz Reichen für mein Projekt nicht mehr. Ich kann noch bis 2.7V runter gehen, aber mit der Diode hinter dem LDO bin ich eh nahe der 3V.
Bei 1.8V wird der interne Crystal zu langsam. Ich brauche meine 8MHz.
4MHz Reichen für mein Projekt nicht mehr. Ich kann noch bis 2.7V runter
gehen, aber mit der Diode hinter dem LDO bin ich eh nahe der 3V.
Du hast da keinen internen Crystal. Du hast einen relativ ungenauen RC-Oszillator.
Dann nimmst Du halt beispielsweise einen AVR128DB32. Der kann auch bei 1.8V noch seine vollen 24 MHz, weil es eben ein viel modernerer Chip in einem neueren Halbleiterprozess ist.
Wie muss ich das mit dem Kabelbruch verstehen? Warum würde ein
Kabelbruch verhindern, dass das Signal auf 0V herunterkommt?
Weil der Strom nicht zu seiner Quelle zurück fließen kann. Dann fließt er oft über eine Signal-Leitung und ESD Schutzdiode zurück. Wegen der Diode mit etwa 0,7V Verlust.
Es gibt keinen internen Kristall/Quarz. Du meinst den R/C Oszillator. Dem ist die Spannung egal. Wichtig ist, die Fuse für den Takt-Teiler passend zu setzen, damit die effektive Taktfrequenz des Chips nicht zu hoch ist.
Weil der Strom nicht zu seiner Quelle zurück fließen kann. Dann fließt
er oft über eine Signal-Leitung und ESD Schutzdiode zurück. Wegen der
Diode mit etwa 0,7V Verlust.
Achso, ich glaube ich verstehe. Auf dem Programmer sehe ich aber maximal 2 Dioden, es sei denn die Schutzdioden sind Teil des Atmel MCU. Neben dem MCU ist nur noch ein 74HC125 "quad buffer".
Du meinst den R/C Oszillator.
Dem ist die Spannung egal.
Ja, den meine ich, sorry. Im Datasheet steht eigentlich an diversen Stellen, dass die Frequenz mit sinkender Spannung immer weiter limitiert ist. Wieso gilt das nicht?
Edit: Ich habe mich wohl verlesen. Da steht, dass der MCU bis 1.8V die vollen 8MHz kann.
Dann nimmst Du halt beispielsweise einen AVR128DB32
Eigentlich möchte ich den Chip ja gar nicht austauschen, aber danke für
den Vorschlag. ;)
Wäre aber besser fürs Ergebnis.
Edit: Ich habe mich wohl verlesen. Da steht, dass der MCU bis 1.8V die
vollen 8MHz kann.
Nein, das stimmt bei diesen alten Teilen nicht. Siehe Abschnitt "33.4 Speed Grades".
Der interne Oszillator funktioniert bis herunter zu 1.8V gemäß Abschnitt 33.5.1. Das heißt aber nicht, dass der Prozessorkern das dann auch kann. Bei diesen alten Teilen sind die Transistoren bei geringer Spannung einfach zu langsam. Erst bei den modernen Microchip AVRs sind die Transistoren auch bei geringen Spannungen schnell genug bzw noch deutlich schneller. Deswegen solltest Du den wollen.
Ich habe gerade einmal testweise den 10k Reset-Widerstand durch einen 60k Widerstand ersetzt, und jetzt schafft es der Programmer auf einmal, den Reset-Pin auf 0V zu ziehen. Überraschend.
Hier mein Schaltplan explizit für den ATMEGA328PB als Referenz – getestet und auf jeden Fall funktionierend. Irgendetwas grundlegendes machst Du falsch – alle Massen müssen verbunden sein – dieser µC hat zwei GND-Anschlüsse (Pin 5 und 21), die Massen des Programmiergeräts, Netzteils etc. müssen damit auch verbunden sein. Auch die Spannungsversorgung muss sowohl an VCC als auch AVCC vorhanden sein. VREF wird weder mit VCC noch mit GND verbunden – der Pin wird mit einem 100nF-Kondensator gestützt, insbesondere dann, wenn vom ADC Gebrauch gemacht wird. Abblockkondensatoren sind nicht spaßhalber gedacht, sondern Pflichtprogramm bei quasi jeder soliden Schaltung, die zuverlässig arbeiten soll – µC-Schaltungen gehören zu dieser Kategorie. Dein ISP-Programmieranschluss scheint auf jeden Fall irgendwie verdreht zu sein – vielleicht hast Du beim Anschließen des Programmieradapters über Dupontkabel hier einfach auch MOSI mit MISO vertauscht, dann geht gar nichts mit Programmieren. Wenn man nicht mit einem vernünftigen Programmer, der eingebaute Stromlimiter hat, programmiert, sollte man die Leitungen (MOSI, MISO, SCK und RESET) am besten mit jeweils einem Schutzwiderstand, z.B. 220 Ohm, schützen, um im Falle eines Pegelkonflikts die Sicherheit zu haben, dass da nichts passiert; auch die Injektionsströme bei fehlender Spannungsversorgung auf einer Seite werden dadurch so weit reduziert, dass nichts passieren kann. Irgendwelche gemessenen Low-Pegel mit ca. 1V sind in der Regel ein Indiz dafür, dass irgendetwas nicht richtig verbunden ist oder bereits ein Pinkonflikt fabriziert wurde. Ergo => alle relevanten Verbindungen nochmal explizit mit einem Multimeter prüfen – hinschauen, glauben hilft in diesem Fall nicht.
Deine superdupa Optimierung, alle ungenutzen Pins auf GND zu schalten, birgt hohe risiken – insbesondere beim Prototypen bzw. Programmschreiben können die Portausgänge versehentlich als Ausgang mit High-Pegel geschaltet werden, was schlimmstenfalls zum Tod des µControllers führen kann. Wenn man zu solchen drastischen Maßnahmen greift, dann macht man das ganz am Ende der Entwicklungsphase, wenn das Schreiben der Software abgeschlossen wurde und das Risiko nicht mehr vorhanden ist.
Nimm zum Test einen neuen Atmega setze nur die Minimalbeschaltung ein
(max. 5V).
Lass auch die unbenutzten I/O Pins einfach frei - antworten sollte der
Chip über ISP.
Orientieren kannst Du Dich an der Schaltung von Gregor J.
Alles weitere wurde schon ausführlich erleutert.
Ich habe gerade einmal testweise den 10k Reset-Widerstand durch einen
60k Widerstand ersetzt, und jetzt schafft es der Programmer auf einmal,
den Reset-Pin auf 0V zu ziehen. Überraschend.
Komisch. Der 74HCxx Treiber kann eigentlich locker mehr als 20mA treiben.
Da du so ein tolles 4-Kanal Oszilloskop hast, mache nochmal so ein Bild mit VCC, SCL, MOSI und RESET.
Lass auch die unbenutzten I/O Pins einfach frei - antworten sollte der
Chip über ISP
Ich habe nun also wo möglich Teile an den IO-Pins abgelötet und einen neuen MCU aufgelötet. Schockierenderweise geht es jetzt. Ich habe wieder alle Teile zurückgelötet und es geht immernoch. Irgendwie ist also tatsächlich der MCU gestorben. Ich verstehe es nicht.
Vielleicht habe ich nicht gut genug auf ESD geachtet und so den Chip getötet? Vielleicht habe ich den Chip gekocht als ich beim Auflöten zu spät gecheckt habe, dass mein Ganzes Flussmittel weggedampft war. Vielleicht hätte ich den usbtinyisp erst an den ICSP header anschließen und dann per USB anstecken sollen, um so zu vermeiden, dass womöglich kurzzeitig IO-Pins als GND fungieren, wenn VCC etwas früher den Kontakt herstellt...
Danke an euch alle, die sich die Mühe gemacht haben, das Problem mit mir zu lösen. Ich habe heute viele tolle Tipps und Hilfe erhalten :)
Irgendwie ist also tatsächlich der MCU gestorben. Ich verstehe es nicht.
Eigentlich sind die Atmega ziemlich robust. Vielleicht kann man ihm mit einem externen 1MHz-Takt wieder auf die Beine helfen. Einen 12V-Programmierer hast du wohl nicht, oder?
Jetzt würde ich aus Neugier mal den Reset Pin kräftig auf VCC ziehen, z.B mit 1k Ohm. Das Bild müsste danach immer noch genau so aussehen. Wenn nicht, ist vermutlich der Reset Ausgang deines Programmieradapters defekt.