Arduino hal selber erstellen

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 ) :

#define F_CPU 16000000UL
#include"ard_reg.h"
#include"gpio.h"
#include<stdbool.h>

#define LED_PIN PB5
#define LED_DIRECTION GPIO_OUTPUT
#define LED_PORT DDRB


int main(void) {
    
    set_pin_direction(LED_PIN, LED_DIRECTION, LED_PORT);
    
    
    while (1)
    {
        set_pin_state(LED_PIN, GPIO_HIGH, LED_PORT);
        set_delay(1);
        set_pin_state(LED_PIN, GPIO_LOW, LED_PORT);
        set_delay(1);
    };
    return 0;
}

Die commands sind:

avr-gcc -mmcu=atmega328p -Os -o main.elf main.c

avr-objcopy -O ihex -R .eeprom main.elf main.hex

avrdude -V -F -c arduino -p atmega328p -P /dev/tty.usbmodem1011

als message wird hier angezeigt, dass das flashen auf den arduino erfolgreich war und auch das main.c file compiled problemlos

Der Fehler wird wohl in den geheimen Dateien zu suchen sein, oder in den Fuses, WDT.

Was ist der Code hinter set_pin_direction?
Was ist der Code hinter set_pin_state?
Was ist der Code zu set_delay?

Was braucht man noch alles um dein Program zu compilieren?

Von welcher Zeit sprechen wir denn? 1mS?
Da siehst Du kein Blinken.

Grüße Uwe

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 ?

Nur per ISP oder HVPP

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

Richtig!
Nur per ISP oder HVPP

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

Natürlich funktioniert sowas nicht.
Die Optimierung bemerkt den Unsinn, die Wirkungslosigkeit und schmeißt es in die Tonne, Radikal.

Und danke für die Bestätigung.

PS:
Ein signed Überlauf ist verboten und endet im "undefined Behavior"

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?

... oder guckst dir Arduino-unabhängiges an:

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.

Auch das ist damit 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 !

Das sehe ich mehr als deutlich!
Bitte vergleiche deine Worte mit den von dir gelieferten Dateien.
Deine Taten sprechen für sich.

Mehrere Fragen/Hinweise danach hast du bewusst und absichtlich ignoriert.
Selbst jetzt gerade wieder.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.