An dem Variablentypen kann es auch nicht liegen, da er Werte bis 4.294.967.295 annehmen kann.
Wo mache ich da den Denkfehler?
Genau hier!
Der Type der Variablen ist ok.
Aber nicht der Type der Integer Literale.
Merksatz:
Der Weg in die Hölle ist mit falschen Annahmen gepflastert.
Hier, die unterschwellige Annahme, der Type der Zielvariablen hätte einen Einfluss auf den Rechenvorgang.
Hat er nicht.
Bei einem ESP oder ARM würde es trotz falscher Annahme funktionieren.
Bei einem AVR führt die Annahme ins Versagen.
In der IDE alle Compilerwarnungen einschalten.
Datei > Voreinstellungen >
Ausführliche Ausgabe während > beide Haken rein
Compilerwarnungen > "ALLE"
Zeilennummern und Codefaltung sind auch hilfreich.
Dann komplieren und die Warnungen lesen.
Danach machste aus unsigned long mal nur long schaust dir die Ergebnisse an.
Danach machste aus long mal int schaust dir die Ergebnisse an und staunst.
Der Grund ist das der AVR intern in int rechnet wenn keine der beteiligten Variablen einen größeren Datentyp hat.
Deswegen muss man das machen wie combie korrigiert hat.