Hallo Ich habe ein kleines Board gemacht, wo ich den ATMEGA328P-AU (https://lcsc.com/product-detail/ATMEL-AVR_Microchip-Tech-ATMEGA328P-AU_C14877.html) und einen 16MHz Resonator (https://lcsc.com/product-detail/SMD-Crystal-Resonators_Yangxing-Tech-X322516MLB4SI_C13738.html) draufgelötet habe. Zusätzlich den Pullup Widerstand 10K beim Reset-Pin. Und eine Leuchtdiode über einen Vorwiderstand an PD7. Im Blink-Example habe ich die beiden delays auf delay(50) geändert. Programmiert habe ich über ein anderes Arduino. Danach starte ich und die LED blinkt etwa im Halbsekunden-Takt. Etwa so wie bei einem richtigen Arduino mit delay(500). Was läuft hier falsch? Ich denke ich brauche keine Kondensatoren, die sind im Resonator drin, oder? Vielen Dank für eure Tipps. Gruss Marco
:
Bearbeitet durch User
Fuse CKDIV8 (device clock by 8, wohl gemeint, dass Takt um 8 fach langsamer ist.) ist bei dir wohl gesetzt... einfach rausnehmen, dann stimmt es.
:
Bearbeitet durch User
tönt gut, ich weiss grad noch nicht wo und wie. Kann ich das über die Arduino IDE machen?
Dein zweiter Link zeigt auf einen Quarz. Vielleicht schwingt der auch ohne Kondensatoren, vielleichter aber auch nicht. 2 x 22...33 pF sind empfehlenswert. Wenn du sonst nicht viel programmiert hast (Fuses?), sorgt da der interne RC-Oszillator (ca. 8 MHz) bei CKDIV8 für etwa 1 MHz.
habe den falschen Link gepostet, ist nun korrigiert.
Marco W. schrieb: > tönt gut, ich weiss grad noch nicht wo und wie. So wie du dich gibst hast du auch sicherlich keine Ablock-Kondensatoren in deiner Schaltung verwendet. Also ganz schnell mal nachholen, sonst kommen später so komische Fragen warum was nicht funktioniert.
Aktuell noch nicht wirklich. Ich weiss noch nicht genau welche ich brauche. Da gibts ja verschiedene Meinungen...
Marco W. schrieb: > Aktuell noch nicht wirklich. Ich weiss noch nicht genau welche ich > brauche. Da gibts ja verschiedene Meinungen... Das ist wie bei Fahrradschlössern. Kein Schloss - kein Fahrrad.
Marco W. schrieb: > Aktuell noch nicht wirklich. Ich weiss noch nicht genau welche ich > brauche. Da gibts ja verschiedene Meinungen... Einfach mal Datenblatt lesen, da gibt es keine verschiedenen Meinungen. Und mal lesen was dir geschrieben wurde, dann hast du deinen Fehler.
Stefan ⛄ F. schrieb: > Das ist wie bei Fahrradschlössern. Kein Schloss - kein Fahrrad. Aaahhh das tut gut, hoffentlich geht das irgendwo rein ins Hirn.
Na dann wird das wohl nix. Ikebana, oder Macramé sind aber auch schöne Hobbies!
Jacko schrieb: > Ikebana, oder Macramé sind aber auch schöne Hobbies! Stricken oder Gärtnern wurde in diesem Zusammenhang auch oft genannt. Aber es besteht ja noch Hoffnung dass es nicht so weit kommen muss.
Marco W. schrieb: > Was läuft hier falsch? Im Datenblatt steht: "The device is shipped with internal RC oscillator at 8.0MHz and with the fuse CKDIV8 programmed, resulting in 1.0MHz system clock." Deine Frage lässt sich besser beantworten, wenn du verrätst, was du an diesen Werkseinstellungen geändert hast? Falls du gar nichts geändert hast, wird dein µC immer noch mit 1MHz laufen und dein 16MHz Resonator ist ihm schnuppe.
Wolfgang schrieb: > > Im Datenblatt steht: "The device is shipped with internal RC oscillator > at 8.0MHz and with the fuse CKDIV8 programmed, resulting in 1.0MHz > system clock." > > Deine Frage lässt sich besser beantworten, wenn du verrätst, was du an > diesen Werkseinstellungen geändert hast? > Falls du gar nichts geändert hast, wird dein µC immer noch mit 1MHz > laufen und dein 16MHz Resonator ist ihm schnuppe. Genau so siehts aus. Geändert habe ich nämlich nichts. Ich muss nun also versuchen diese Einstellungen zu ändern.
Jedem Arduino User, würde ich in einer solchen Situation raten "Bootloader brennen" zu drücken. Bei dir traue ich mich das nicht.
M. K. schrieb: > Fuse CKDIV8 (device clock by 8, wohl gemeint, dass Takt um 8 fach > langsamer ist.) ist bei dir wohl gesetzt... einfach rausnehmen, dann > stimmt es. In programm am Anfang #include <avr/power.h> schreiben. Dann irgendwo bei Init noch: clock_prescale_set(clock_div_1); So kann man Fuse in Ruhe lassen und trotzdem korrekt F_CPU haben.
:
Bearbeitet durch User
Marco W. schrieb: > Genau so siehts aus. Geändert habe ich nämlich nichts. Ich muss nun also > versuchen diese Einstellungen zu ändern. Genau dass wurde dir schon mehrfach mitgeteilt. Hier und anderswo! Glaubst du das nun endlich mal. Warum machst du das nicht ?
Maxim B. schrieb: > In programm #include <avr/power.h> schreiben. > Dann irgendwo bei Init noch: > clock_prescale_set(clock_div_1); > > So kann man Fuse in Ruhe lassen und trotzdem korrekt F_CPU haben. Und die interne 8MHz verdoppeln? Von daher: Quarze und Resonatoren werden sowieso überbewertet.
Arduino Fanboy D. schrieb: > Und die interne 8MHz verdoppeln? Nein. Aber Fuse für F_CPU / 8 darf bleiben, trotzdem wird auf F_CPU gearbeitet. Manchmal ist es von Vorteil, Fuse in Ruhe zu lassen. Das funktioniert auf C. Vielleicht wird das mit Arduino-IDE aber nicht arbeiten, keine Ahnung. Ich schreibe auf C.
:
Bearbeitet durch User
Brain 2.0 schrieb: > Genau dass wurde dir schon mehrfach mitgeteilt. > Hier und anderswo! Ich zweifle so langsam an meinen eigenen Aussagen. Hellseher schrieb: > Aber es besteht ja noch Hoffnung dass es nicht so > weit kommen muss
Maxim B. schrieb: > Nein. Aber Fuse für F_CPU / 8 darf bleiben, trotzdem wird auf F_CPU > gearbeitet. Manchmal ist es von Vorteil, Fuse in Ruhe zu lassen. Und dann macht es doppelt Sinn dort einen Quarz/Resonator zu platzieren. Maxim B. schrieb: > Das funktioniert auf C. Vielleicht wird das mit Arduino-IDE aber nicht > arbeiten, keine Ahnung. Ich schreibe auf C. Ja, ist klar... F_CPU wird in der Arduino Welt übrigens in der boards.txt definiert....
Arduino Fanboy D. schrieb: > F_CPU wird in der Arduino Welt übrigens in der boards.txt definiert.... dann braucht er die ja nur auf 1 MHz umschreiben und dann passt es wieder mit intern 8MHz /8 das wäre dann aber 16x langsamer ist ja ungefähr um Faktor 10.
:
Bearbeitet durch User
Maxim B. schrieb: > Vielleicht wird das mit Arduino-IDE aber nicht > arbeiten, keine Ahnung. Ich schreibe auf C. Was meinst du wohl, was die Arduino IDE für einen Compiler verwendet ;-) Irgendetwas mit gcc ...
Arduino Fanboy D. schrieb: > F_CPU wird in der Arduino Welt übrigens in der boards.txt definiert.... Da bin ich nicht mehr so ganz sicher, wenn ich Pro Mini 5V 16MHz und 3,3V 8MHz angucke:
1 | pro.menu.cpu.16MHzatmega328.bootloader.low_fuses=0xFF |
2 | pro.menu.cpu.16MHzatmega328.bootloader.high_fuses=0xDA |
3 | pro.menu.cpu.16MHzatmega328.bootloader.extended_fuses=0x05 |
4 | pro.menu.cpu.16MHzatmega328.bootloader.file=atmega/ATmegaBOOT_168_atmega328.hex |
5 | pro.menu.cpu.16MHzatmega328.build.mcu=atmega328p |
6 | pro.menu.cpu.16MHzatmega328.build.f_cpu=16000000L |
1 | pro.menu.cpu.8MHzatmega328.bootloader.low_fuses=0xFF |
2 | pro.menu.cpu.8MHzatmega328.bootloader.high_fuses=0xDA |
3 | pro.menu.cpu.8MHzatmega328.bootloader.extended_fuses=0x05 |
4 | pro.menu.cpu.8MHzatmega328.bootloader.file=atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex |
5 | pro.menu.cpu.8MHzatmega328.build.mcu=atmega328p |
6 | pro.menu.cpu.8MHzatmega328.build.f_cpu=8000000L |
Da stehen die gleichen Fuses drin, aber unterschiedliche Bootloader. Ich hätte auch gedacht: Arduino Fanboy D. schrieb: > Jedem Arduino User, würde ich in einer solchen Situation raten > "Bootloader brennen" zu drücken. dann sitzen die Fuses und er kann ja trotzdem per ISP programmieren und damit den Bootloader wieder wegschießen. Scheint nicht wirklich so zu sein?
Manfred schrieb: > Arduino Fanboy D. schrieb: >> F_CPU wird in der Arduino Welt übrigens in der boards.txt definiert.... > > Da bin ich nicht mehr so ganz sicher, wenn ich Pro Mini 5V 16MHz und > 3,3V 8MHz angucke: Der Beweis: pro.menu.cpu.16MHzatmega328.build.f_cpu=16000000L pro.menu.cpu.8MHzatmega328.build.f_cpu=8000000L Manfred schrieb: > Da stehen die gleichen Fuses drin, Weil sie für 8 und 16MHz identisch sind. Der Unterschied findet sich im Schliff der Kristalle/Keramiken. Manfred schrieb: > aber unterschiedliche Bootloader. Ja! Einer für 16Mhz kompiliert und der andere für 8MHz. Ist nicht logisch, für dich? Schlussendlich: Ich sehe da nichts, was einen verwundern müsste. ------- Manfred schrieb: > dann sitzen die Fuses und er kann ja trotzdem per ISP programmieren und > damit den Bootloader wieder wegschießen. Scheint nicht wirklich so zu > sein? Das ist suboptimal. Da man so den hinteren Speicher nicht nutzen kann/darf. Wenn man ohne Bootloader arbeiten möchte, sollte man die Fuses anpassen, bzw einen neuees Board definieren.
Wolfgang schrieb: > Was meinst du wohl, was die Arduino IDE für einen Compiler verwendet Etwas Verrücktes, was statt while(1) "loop" haben will. :) Compiler hat selbst mit "clock_prescale_set(clock_div_1);" nichts zu tun. Das sollte vorher irgendwo definiert werden.
:
Bearbeitet durch User
Maxim B. schrieb: > Etwas Verrücktes, was statt while(1) "loop" haben will. Will es doch gar nicht.... Lass setup() und loop() weg, und verwende Stattdessen main(), und du bist wie zuhause. Maxim B. schrieb: > Compiler hat selbst mit "clock_prescale_set(clock_div_1);" nichts zu > tun. Das sollte vorher irgendwo definiert werden. Ist es auch! Es ist Teil der AVR-Gcc Tool Chain. Und steht darum, ohne Einschränkungen, dem Arduino Jünger zur Verfügung. Wahlweise in C oder C++. Asm auch, sieht dann aber etwas anders aus.
Wenn Arduino-IDE auch zusammen mit JTAG-Debugger arbeiten könnte und auch Simulator für Debug hätte, dann würde die IDE wirklich brauchbar...
Maxim B. schrieb: > Wenn Arduino-IDE auch zusammen mit JTAG-Debugger arbeiten könnte Die nächste Generation kann Debuggen. > Arduino Pro IDE Dauert noch etwas, ist aber in der Mache.
Arduino Fanboy D. schrieb: > F_CPU wird in der Arduino Welt übrigens in der boards.txt definiert.... Manfred schrieb: > Da bin ich nicht mehr so ganz sicher, wenn ich Pro Mini 5V 16MHz und > 3,3V 8MHz angucke: > pro.menu.cpu.16MHzatmega328.bootloader.low_fuses=0xFF > pro.menu.cpu.16MHzatmega328.bootloader.high_fuses=0xDA > pro.menu.cpu.16MHzatmega328.bootloader.extended_fuses=0x05 > pro.menu.cpu.16MHzatmega328.bootloader.file=atmega/ATmegaBOOT_168_atmega 328.hex > pro.menu.cpu.16MHzatmega328.build.mcu=atmega328p > pro.menu.cpu.16MHzatmega328.build.f_cpu=16000000L > pro.menu.cpu.8MHzatmega328.bootloader.low_fuses=0xFF > pro.menu.cpu.8MHzatmega328.bootloader.high_fuses=0xDA > pro.menu.cpu.8MHzatmega328.bootloader.extended_fuses=0x05 > pro.menu.cpu.8MHzatmega328.bootloader.file=atmega/ATmegaBOOT_168_atmega3 28_pro_8MHz.hex > pro.menu.cpu.8MHzatmega328.build.mcu=atmega328p > pro.menu.cpu.8MHzatmega328.build.f_cpu=8000000L > > Da stehen die gleichen Fuses drin, aber unterschiedliche Bootloader. das macht doch nichts und ist kein Widerspruch was in den Fuses steht(das muss ein C&P Fehler sein) Jedenfalls konnte ich immer miniPRO mit 8MHz oder 16MHz flashen, der Bootloader muss natürlich passend auf den miniPRO drauf sein, der wird bei upload über Rx & Tx doch nie angefasst! also intersessieren den die Angaben in der board.txt doch nicht. Was anderes wäre es wer mit der Arduino IDE den Bootloader selber flashen will, da wirds dann wichtig! Ich nahm immer AVR Studio 4.18 für den Bootloader flashen und USBISP Mk2
:
Bearbeitet durch User
Joachim B. schrieb: > (das muss ein C&P Fehler sein) ? Wie kommst du darauf ? Joachim B. schrieb: > Was anderes wäre es wer mit der Arduino IDE den Bootloader selber > flashen will, da wirds dann wichtig! Und das funktioniert. Denn die Einträge sind völlig angemessen.
Maxim B. schrieb: > Etwas Verrücktes, was statt while(1) "loop" haben will. :) Quatsch. Die while(1)-Schleife gibt es genaue so und darin wird eben loop() aufgerufen. Guck einfach mal in die Quelltexte. Und bevor es ab in die while(1)-Schleife geht, wird dort zu deiner Beruhigung eine Funktion namens Setup() aufgerufen ;-)
Joachim B. schrieb: > das macht doch nichts und ist kein Widerspruch was in den Fuses > steht(das muss ein C&P Fehler sein) Arduino Fanboy D. schrieb: > ? Wie kommst du darauf ? ein Irrtum meinerseits klar WENN der Bootloader "geflasht" ist stehen ja für beide 8MHz & 16MHz die Fuses auf externen clock und somit gleich! Nur der Quarz bestimmt den Takt und da muss der "geflashte" Bootloader das auch wissen was F_CPU war sonst kann er die UART nicht richtig beim Start initialisieren. Wenn kein Bootloader auf dem Chip ist nimmt er eh weder was an der UART an noch passt der interne Takt zu den Fuses. Warum läuft der bei ihm 10x langsamer? Der Chips war auf einen Arduino! Also F_CPU 16MHz und Bootloader aktiv! Fuses müssten also passen div8 nicht aktiv, Clk Quarz extern. Externer Clock ist also aktiv, Quarz hat er angeschlossen sonst würde nichts laufen!
:
Bearbeitet durch User
Joachim B. schrieb: > Der Chips war auf einen Arduino! > Also F_CPU 16MHz und Bootloader aktiv! Du siehst Geister.
Joachim B. schrieb: > Der Chips war auf einen Arduino! > Also F_CPU 16MHz und Bootloader aktiv! F_CPU ist eine Compilervariable. Was hat die mit der Historie des Chips zu tun?
Arduino Fanboy D. schrieb: > Du siehst Geister. wo bitte? mir schwant ich habe einen Thread verwechselt wo der TO den Chip von einem Uno genommen hatte mit DIL ATmega328p Kann passieren, wer ist hier fehlerfrei? aber das gilt trotzdem, nach nochmaligem Lesen des ganzen Threads! Wolfgang schrieb: > F_CPU ist eine Compilervariable. > Was hat die mit der Historie des Chips zu tun? Ich weiss beide AVR Studio und die Arduino IDE nutzen GCC und somit muss F_CPU gesetzt werden, sonst kommt Unsinn raus! Marco W. schrieb: > Im Blink-Example habe ich die beiden delays auf delay(50) geändert. > Programmiert habe ich über ein anderes Arduino. Und die Arduino IDE holt sich doch F_CPU aus der boards.txt, schon bei der Wahl welcher programmiert wird, dort habe ich nie irgendwo F_CPU gesetzt nur Board Nano oder miniPRO gewählt mit 8MHz oder 16MHz. Ergo muss für den gcc F_CPU von der Arduino IDE gesetzt werden! Nun nochmal die Frage, wieso soll der rund 10x langsamer laufen wenn er die Fuses nicht angefasst hat? Marco W. schrieb: > Genau so siehts aus. Geändert habe ich nämlich nichts. Wenn der Auslieferzustand vom ATMEGA328P-AU ist wie immer gilt zuerst Interner Clock 8 MHz div8 gesetzt macht 1 MHz zum externen 16MHz Quarz oder Resonator egal weil ungenutzt Marco W. schrieb: > einen 16MHz Resonator gibt nicht ca. 10x langsamer sondern genau 16x langsamer, nämlich 16/1 (MHz kürzt sich raus) OK 16x langsamer kann man mit sehr viel Toleranz als 10x langsamer sehen :-)
Joachim B. schrieb: > OK 16x langsamer kann man mit sehr viel Toleranz als 10x langsamer sehen Das mit 10x langsamer war ja nur geschätzt, nicht einmal mit der Stopuhr gemessen.
Joachim B. schrieb: > Wolfgang schrieb: >> F_CPU ist eine Compilervariable. >> Was hat die mit der Historie des Chips zu tun? > > Ich weiss beide AVR Studio und die Arduino IDE nutzen GCC und somit muss > F_CPU gesetzt werden, sonst kommt Unsinn raus! Eben, aber der Controller merkt davon nichts. Das ist eine reine Information an den Compiler.
Wolfgang schrieb: > Das ist eine reine Information an den Compiler. Eigentlich ist es eine Information an ein paar wenige Funktionen in der C-Bibliothek. Dem Compiler ist die Taktfrequenz völlig egal.
Stefan ⛄ F. schrieb: > Dem Compiler ist die Taktfrequenz völlig egal. das stimmt und wer was anderes braucht der "defined" mal F_CPU um zum Passenden wenns klemmt im Timing. Dem Compiler juckt es nicht, das Ergebnis in realer Hardware ist dann anders, entweder passend oder ganz falsch. wobei ich auch schon mal Schwierigkeiten hatte mit #ifdef F_CPU #undef F_CPU #define F_CPU nunanders // Zahl nach Wunsch #endif // #ifdef F_CPU Ich weiss nicht wie der preprozessor das bedient vor allem in mehreren Modulen, denn hinterher gibt es ja wieder als #define F_CPU (F_CPU * 9/10) klappt aber
:
Bearbeitet durch User
Beitrag #6450533 wurde von einem Moderator gelöscht.
Joachim B. schrieb: > Stefan ⛄ F. schrieb: >> Dem Compiler ist die Taktfrequenz völlig egal. > > das stimmt und wer was anderes braucht der "defined" mal F_CPU um zum > Passenden wenns klemmt im Timing. > Dem Compiler juckt es nicht, das Ergebnis in realer Hardware ist dann > anders, entweder passend oder ganz falsch. > > wobei ich auch schon mal Schwierigkeiten hatte mit > > #ifdef F_CPU > #undef F_CPU > #define F_CPU nunanders // Zahl nach Wunsch > #endif // #ifdef F_CPU > > Ich weiss nicht wie der preprozessor das bedient vor allem in mehreren > Modulen, denn hinterher gibt es ja wieder als #define F_CPU > > (F_CPU * 9/10) klappt aber Eine ganz doofe Idee! Ja, ich weiß, du gehst damit dauernd hausieren. Aber eine doofe Idee, ist eine doofe Idee, und bleibt auch eine. Die stete Wiederholung machts nicht besser, sondern zeugt eher von blockierter Einsichtsfähigkeit.
Arduino Fanboy D. schrieb: > Ja, ich weiß, du gehst damit dauernd hausieren. > Aber eine doofe Idee, ist eine doofe Idee, und bleibt auch eine. als es damals keine bessere Lösung gab funktionierte es halt. Lieber ein "doofe" Lösung als keine. Es gibt Menschen die wissen sich nicht zu helfen und es gibt welche die beim "Versagen" von sogenannten Fachleuten trotzdem Lösungen finden! Du pöbelst ja lieber, warst aber nicht hilfreich als das Problem auftrat und nun später spielst du den Wissenden! Ja hinterher ist man immer schlauer, ich, der Erfinder und andere, das nutzte aber nichts als das Problem auftrat und niemand, nicht mal der TO einer LIB helfen konnte, also half ich mir selbst, egal wie doof du das findest! Hinterher lästern ist leicht! Arduino Fanboy D. schrieb: > blockierter Einsichtsfähigkeit. deine, kann ich dir bestätigen! Bist du so klein das du andere erniedrigen musst um dich zu erheben?
:
Bearbeitet durch User
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.