Hallo,
ich würde gerne einen Atmega328p minimalistisch betreiben (ohne
Oszillator) und das ganze bei 3,3V. (Laut Specs sollte die Spannung bei
8 Mhz ausreichen). Programmieren möchte ich ihn gerne über die Arduino
IDE.
Ich habe mir daher von der offiziellen Arduino-Seite die Boards.txt und
den entsprechenden Bootloader (für den internen Oszillator) geholt und
entsprechen gebrannt.
https://www.arduino.cc/en/Tutorial/ArduinoToBreadboard
(unter "Minimal Circuit - Eliminating the External Clock")
Der generelle Betrieb ohne Oszillator funktioniert auch, nur leider
benötigt der µC mindestens ca. 3,6V. Darunter bleibt er stumm.
Meine Vermutung war, dass es am Brown Out Detector liegen könnte, jedoch
sollte dieser laut boards.txt Datei (s. "extended_fuses") eigentlich auf
0x05 (0b101) stehen, was laut Datasheet einem Grenzwert von deutlich
unter 3,3V entsprechen sollte.
Habe trotzdem testweise den Wert auf 0b111 (BOD deaktiviert) gesetzt.
Danach funktioniert der µC auch eingeschränkt bei 3,3V (jedoch kann ich
z.B. keinen neuen Bootloader bei dieser Versorungsspannung brennen).Nur
ist es mit diesen Settings nicht möglich Sketches per seriellem Port
aufspielen (Sync Fehler). Das Aufspielen von Sketches über einen ISP
(also über die SPI Schnittstelle) funktioniert jedoch einwandfrei.
Hat jemand eine Idee, warum der Betrieb bei 3,3V nicht funktioniert?
Oder alternativ warum bei deaktiviertem BOD keine Sketches aufgespielt
werden können?
Würde mich über jede Hilfe freuen.
P.S. Habe die Fuse Settings sowohl mit 0b111 als auch mit 0b11111111
versucht (um die oberen 5 Bits auf Default zu lassen). Kein Unterschied.
Peter schrieb:> Der generelle Betrieb ohne Oszillator funktioniert auch, nur leider> benötigt der µC mindestens ca. 3,6V. Darunter bleibt er stumm.
Bleibt er wirklich stumm? Mit dem Oszi überprüft? Der interne Oszilator
ist u.a. spannungsabhängig, möglicherweise driftet die Frequenz so weit,
dass der Baudratenfehler unzulässig zu hoch wird. Miss da mal mit dem
Oszi den Oszilator nach.
Bei 8MHz und Serial, sollte man eigentlich den Oscal Wert für 8MHz lesen
und ins OSCAL schreiben. Das mildert das Baudrate Problem meist.
Oder eine dynamische Anpassung vornehmen.
z.B. mit Hilfe des eingebauten Temperatursensors, oder der gegenläufigen
Kennlinie des WDT Oszillator.
Ansonsten mit kleinerer Baudrate arbeiten. (siehe Anhang)
Bei mir laufen einige ATMega328P auf 3,3V, auch mit Bootloader, aber
meist ohne.
im Anhang meine Hardwaredefinition
Der normale Bootloader ist für 16Mhz gedacht, hast du das bedacht?
Für serielle Kommunikation ist der interne R/C Oszillator auch bei
angepasstem Bootloader nur bedingt geeignet. meisten klappt es, aber
nicht immer.
Danke erstmal für das schnelle Feedback.
langhaarrocker schrieb:> Was verwendest Du für eine Spannungsversorgung? Wie steht's um> Blockkondensator?
Habe sowohl die 3,3 eines anderen Arduinos als auch Labornetzteil
verwendet. Zwischen Vcc und Gnd sind 470µF.
M. K. schrieb:> Bleibt er wirklich stumm?
Habe neben den seriellen prints auch IO Pins im Sketch getoggelt. Auch
da passierte nichts. Die sollte ja denke ich auch bei massivem Driften
funktionieren.
Stefan U. schrieb:> Der normale Bootloader ist für 16Mhz gedacht, hast du das bedacht?>> Für serielle Kommunikation ist der interne R/C Oszillator auch bei> angepasstem Bootloader nur bedingt geeignet. meisten klappt es, aber> nicht immer.
Es ist ja ein - soweit ich das verstanden habe - spezieller Bootloader,
der von Arduino für 8 Mhz vorgesehen gedacht ist. Oberhalb von 3,6-3,7V
läuft das Ding auf internem Crystal auch einwandfrei (auch bei
serieller Kommunikation).
Arduino F. schrieb:> Bei 8MHz und Serial, sollte man eigentlich den Oscal Wert für 8MHz> lesen> und ins OSCAL schreiben.> [...]> Ansonsten mit kleinerer Baudrate arbeiten. (siehe Anhang)
Ich habe meine boards.txt mit deinem "8MHz StdBootloader" verglichen.
Sehen ziemlich identisch aus insb. uploadspeed, fuses, Bootloader-Datei
etc.
Das mit der Kalibrierung des Oszillators habe ich noch nicht gemacht.
Ich denke aber, dass Ungenauigkeiten des Oszillators auch irgendwie
nicht die Effekte erklären...
Wieso läuft es z.B. überhaupt nur dann bei bei 3,3V wenn ich BOD
deaktiviere (obwohl die Grenzwerte auch so passen sollten)? Normal
müsste doch das herabtakten auf 8 Mhz schon reichen, um bei niedrigeren
Spannungen arbeiten zu können, oder gibts diesbezüglich noch andere
Settings?
Und wieso läuft es bis 3,6V normal und darunter geht schlagartig nichts
mehr. Die ganzen spannungsabhängigen Effekte auf den internen Oszillator
würden doch denke ich nicht so schlagartig bei einem Grenzwert
einsetzen, oder?
Peter schrieb:> Zwischen Vcc und Gnd sind 470µF.
zwischen Vcc und GND gehören 100nF in Keramik. Und zwar direkt an den
jeweiligen Versorgungspins des Controllers.
Ein Atmega läuft mit 10Mhz bei 2,7V. Dein Problem ist also nicht das
Verhältnis Spannung/Takt.
Aber bring erstmal deine Hardware in Ordnung.
Thomas E. schrieb:> Peter schrieb:> zwischen Vcc und GND gehören 100nF in Keramik. Und zwar direkt an den> jeweiligen Versorgungspins des Controllers.>> Ein Atmega läuft mit 10Mhz bei 2,7V. Dein Problem ist also nicht das> Verhältnis Spannung/Takt.>> Aber bring erstmal deine Hardware in Ordnung.
Der Tipp war gut...nicht wegen des Kondensators, sondern allgemein. Denn
dabei ist mir aufgefallen, dass der Pin für die Versorgungsspannung des
ADC nicht angeschlossen war (der muss auf Vcc). Shame on me :(
Habe es dann reproduziert und war definiv so, dass ohne diesen Pin der
Atmega328 unter 3,6V aussteigt.... mit angeschlossenem Pin funktioniert
er tadellos bis 2,8V runter.
Wollte ich nur mal posten, falls jemand zufällig das gleiche Problem
bekommen sollte.
Danke auf jeden Fall für die Antworten.
Peter schrieb:> Der Tipp war gut...nicht wegen des Kondensators, sondern allgemein. Denn> dabei ist mir aufgefallen, dass der Pin für die Versorgungsspannung des> ADC nicht angeschlossen war (der muss auf Vcc). Shame on me :(
Natürlich muss AVcc mit angeschlossen werden, das steht auch im
Datenblatt u.a. im Kapitel Pin Configurations ;)
M. K. schrieb:> Natürlich muss AVcc mit angeschlossen werden, das steht auch im> Datenblatt u.a. im Kapitel Pin Configurations ;)
Die Hartnäckigkeit vieler Minimalisten wird nicht auszurotten sein.
[sark]
Grundsätzlich sind auch Kondensatoren in Mikrocontroller-
Schaltungen nur lästiges, überflüssiges, unnützes Beiwerk,
erzeugt bzw definiert von Nichtpraktiker-Puristen.
[/sark]
Arduinoquäler schrieb:> Die Hartnäckigkeit vieler Minimalisten
wie wahr, seufs, einer malt es falsch und alle malen ab mit dem Spruch:
"bei dem funktioniert es ohne"
Don Quijote hatte weniger zu kämpfen.
Arduinoquäler schrieb:> Grundsätzlich sind auch Kondensatoren in Mikrocontroller-> Schaltungen nur lästiges, überflüssiges, unnützes Beiwerk,> erzeugt bzw definiert von Nichtpraktiker-Puristen.
Nein, das war andersherum:
Kondensatorhersteller haben dieses Märchen über die Notwendigkeit von
Kondensatoren verbreitet, um mehr Umsatz zu machen ;-))
M. K. schrieb:> Natürlich muss AVcc mit angeschlossen werden, das steht auch im> Datenblatt u.a. im Kapitel Pin Configurations ;)
Ich weiß :( Bei vorherigen Versuchen hatte ich es auch korrekt
angeschlossen... nur bei dem 3,3V/8Mhz Versuch total verplant. Hatte es
nur nochmal beschrieben, falls jemand am gleichen Fehler verzweifeln
sollte.
Zu eurer Kondenstator "Diskussion" ;) Mein 470µF war ja laut euren
Aussagen "etwas" (Faktor 4700) überdimensioniert und ich vermute die
Größenordnung sollte eher bei wirklichen Leistungsspitzen des µC
angewendet werden.... mich würde aber interessieren, was denn genau
durch einen zu großen C passieren kann?
Größere Gefahr nen Schwingkreis zu bauen? Langsameres Aufbauen der
Betriebsspannung? Oder wo liegt das Risiko? Oder ist es einfach "nur"
Verschwendung?
Vereinfacht ausgedrückt:
Zu große Kondensatoren "reagieren" nicht schnell genug.
Zu großer Widerstand (ESR)
Zu große Induktivität
An den AVR gehört ein 100nF Kerko. (47nF bis 220nF ist auch meist OK)
Dicht dran.
Möglichst dicht.
4700µF sind doch ElKos, meist Aluminium und gewickelt!
Nun haben Wickel ja die hier echt unangenehme Eigenschaft einer Spule
und damit Induktivität und diese mögen keine schnellen Lastwechsel und
reagieren mit Induktion, der Strom wird aufrecht erhalten bei heftigen
Spannungsänderungen wie man gerade vermeiden wollte an VCC.
Kurz Spulen halten Ströme konstant, Kondensatoren halten Spannungen
konstant.
Gewünscht ist doch an VCC die Spannung konstant zu halten wenn sich die
Ströme im µC ändern und jede Stromänderung soll keinen Spannungshub nach
draussen zu anderen Bauteilen die auch an VCC hängen geben.
Peter schrieb:> mich würde aber interessieren, was denn genau> durch einen zu großen C passieren kann?
Eine getaktete elektronische Schaltung schaltet bei jedem Takt. Das
klingt jetzt trivial, ist es aber nicht. Bei jedem dieser Schaltvorgänge
wird für ein paar Nanosekunden ein sehr hoher Strom gezogen. Dieser
Strom wird von den kleinen Kerkos bereitgestellt.
Die großen Kondensatoren sind, wie schon von Arduino Fanboy erwähnt,
einfach zu langsam und entwickeln auch, wie von Joachim beschrieben,
unangenehme Nebeneigenschaften. Und sie sind zu weit weg. Denn die
Leiterbahnen stellen ihrerseits wieder Widerstände und Induktivitäten
dar, sodaß die Versorgungsspannung für einen winzigen Moment
zusammenbricht. Daß das nicht funktionieren kann, ist sicherlich
einleuchtend.
Schließt man ein paar Schieberegister in Kaskade an den SPI eines µC und
taktet diesen einigermaßen hoch, bis zu 1/2 F_CPU beim AVR, kann man
sehr schön beobachten, wie die armen 595er ohne Stützkondensatoren
ausflippen und mit diesen kleinen Dingern genau das tun, was sie sollen.
Wenn du das mal selbst ausprobieren willst: Häng mal nen 470µF Elko an
nen Funktionsgenerator und miss' Spannung und Strom, während du die
Frequenz immer weiter hochdrehst.
Bei diversen MHz verhält der sich dann wie eine ideale Spule.