Ich versuche grade in C ein LED zum blinken zu bringen ohne dabei die arduino ide und die Header files zu nutzen. Das ganze hat bisher auch ganz gut geklappt, jedoch führt der arduino den code nach dem flashen auf das board nur ganz kurz aus, nämlich blinkt das Lämpchen ganz kurz und ein paar orangene lichter auf dem board leuchten kurz auf. Das ganze funktioniert aber wenn ich das gleiche mit der arduino ide probiere. Deshalb liegt es vermutlich entweder am code oder am compile und flash prozess. Kennt sich damit irgendwer aus und könnte mir hier weiterhelfen ?
Das hier ist der code (da das Lämpchen kurz aufblinkt vermute ich, dass die header files nicht das problem sind ) :
Der Fehler scheint hier tatsächlich beim wdt zu liegen. Ich habe jetzt versucht wdt_disable() direkt am anfang auszuführen was jedoch nichts geändert hat. Mit avrdude -c arduino -p atmega328p -P /dev/tty.usbmodem1011 -b 115200 -U hfuse:r:-:h soll man anscheinend feststellen können, ob der watchdog troztdem aktiviert wird ? Bei mir wird hier 0x0 zurückgegeben, muss der Wert dann hier geändert werden ?
wenn ich versuche die fuses settings zu ändern erhalte ich den Error: Reading 1 byte for lfuse from input file 0x62
Writing 1 byte (0x62) to lfuse *** failed
Error: unable to write lfuse (rc = -1)
Wieso taucht der Error überhaupt auf, da man ja die Einstellungen der Fuses eigentlich beliebig ändern sollen könnte ?
Aber wie lässt es sich dann erklären, dass das ganze mit der arduino ide funktioniert ? Die ide kann die fuse einstellung ja eigentlich auch nicht ohne weiteres ändern wenn ich das richtig verstanden hab
Ok ich hab es jetzt nach langem Rumprobieren geschafft, das LED zum leuchten zu bringen. Das Problem scheint die set_delay Funktion zu sein, da das Led zwar leuchtet, aber nicht ausgeht. Deshalb ist meine Frage, wie man so ein delay richtig macht. Mein Ansatz war bisher:
void set_delay(uint32_t amount_of_time) {
int i = 0;
while (i < amount_of_time) {
i+= 1;
};
Würde das funktionieren und wie hoch müssten dann die werte sein dass man das delay erkennen kann, ich hab es schon mit 1.000.000.000 in einem c file versucht, das wirkte so als ob man das eigentlich bemerken müsste, jedoch hat das eben nicht funktioniert
warum aktivierst du dir nicht die Warnungen?
Dann meldet dir der Compiler
C:\Daten\myrepository\Arduino\Forum no SVN\sketch_mar30a\sketch_mar30a.ino: In function 'void set_delay(uint32_t)':
C:\Daten\myrepository\Arduino\Forum no SVN\sketch_mar30a\sketch_mar30a.ino:5:12: warning: comparison of integer expressions of different signedness: 'int' and 'uint32_t' {aka 'unsigned int'} [-Wsign-compare]
5 | while (i < amount_of_time) {
| ~~^~~~~~~~~~~~~~~~
Wenn du dir ein Delay nachbauen willst, warum machst du das dann nicht so wie es der Arduino Core macht?
Darauf zu vertrauen, dass der Compiler Code erzeugt, der eine bestimmte Anzahl Maschinenzyklen pro Schleife braucht, ist jedenfalls Unsinn. Irgendeinen Hardware-Timer wirst du schon brauchen. (Dafür sind die im Controller da)
Selbst die die mitgelieferte AVR Libc hat Delay Funktionen im Bauch, welche man nutzen kann.
Ohne die AVR Libc gehts sowieso kaum.
Übrigens, in den Regeln steht, dass ein TO testbaren Code liefern soll.
Für @voilauhrie08 scheinen diese Regeln nicht zu gelten.
Was dazu führt, dass wir jetzt bei Posting 16 sind, ohne die Chance zu haben die ganzen Dinge zu sehen
Im Nebel stochern scheint irgendwie befriedigender zu sein, als Wissen anzulagern.
Unter solchen Bedingungen habe ich weder die Lust, noch die Möglichkeit vernünftig zu helfen.
Die Möglichkeit, dass der HAL Code so genial ist, dass man ihn unbedingt geheim halten muss, ist mittlerweile widerlegt.
Das tut mir sehr leid, viele Dinge waren mir nicht bewusst, da dies auch meine erste Erfahrung mit dem Arduino und embedded systems ist. Das mit den Header Files war auf jeden Fall mein Fehler, ich hätte kein Problem damit gehabt diese zu teilen jedoch dachte ich einfach dass diese nicht das Problem wären. Trotzdem vielen dank für die vielen Tipps !