Hallo, ich habe ein total simples Programm das nicht so macht wie ich mir das vorstelle: void setup() { Serial.begin(115200); } void loop () { int Poti = 0; long verzoegerung; int Potiwert; Potiwert = analogRead(Poti); verzoegerung = Potiwert*1000; Serial.print("Poti: "); Serial.println(Potiwert); Serial.print("Verzoegerung: "); Serial.println(verzoegerung); delay (verzoegerung); } Ich benutze: Arduino Mega 2560 V3 und Arduino IDE 1.0.5-r2 Das Problem ist dass die Variable "verzoegerung" die ich als long-Typ deklariert habe keinen Wert über 32768 annehmen möchte! Also wenn ich das Poti einstelle dass "Potiwert" = 32 ist dann habe ich als "verzoegerung" = 32000 auf dem Serial-Monitor stehen und delay macht dann auch 32 Sekunden. Wenn ich aber "Potiwert" = 33 einstelle dann ist "verzoegerung" = -32536 und bei "Potiwert" = 34 ist "verzoegerung" = -31536 ! Es wirkt so als wäre "verzoegerung" immer noch eine int-Variable. Ich hatte diesen Programmteil eigentlich in einer selber geschriebenen Library verwendet und dachte es liegt an einer fehlerhaften Deklaration aber als ich den Programmteil nochmal separat als neuer Sketch probiert habe fiel ich aus allen Wolken - das Problem ist immer noch vorhanden! Das ist bestimmt nur ein Leichtsinnsfehler von mir aber ich mache jetzt schon einen kompletten Tag daran rum und komme einfach nicht auf die Lösung!
Vorab, ich kenne Arduino nicht, aber C++. Hast du schon mal versucht, Potiwert auf long zu casten? Also: (long)Potiwert*1000;
Potiwert ist ein int und 1000 ist auch ein int. Wenn man die beiden multipliziert, kommt erstmal ein int heraus, der natürlich überläuft. Danach erst wird das Ergebnis in Verzoegerung gespeichert.
> int Potiwert; > verzoegerung = Potiwert*1000; Potiwert ist ein Integer. 1000 ist auch ein Integer (gilt für alle Zahlen, die nicht zu groß sind). Integer * Integer ergibt einen Integer, weil ein Algorithmus verwendet wird, der nur Integer kann. Du musst einen der beiden Operanden als Long Integer kennzeichnen. Am Einfachsten so: verzoegerung = Potiwert * 1000L;
:-) nee das glaube ich ja nicht - das hat geholfen! Danke!! Das probiere ich jetzt gleich noch in meiner Library aus.
Also in der Bibliothek funktioniert es jetzt auch! Ich hatte ja allesmögliche probiert aber auf die Idee mal andere oder alle Variablen auf long zu setzen kam ich nicht. Danke euch drei für die schnelle und kompetente Hilfe!
Es hätte auch genügt, die 1000 als „long“ zu schreiben: „1000L“. Eine von beiden Seiten der Multiplikation muss halt mindestens long sein, damit das Ergebnis es auch ist.
> Es hätte auch genügt, die 1000 als „long“ zu schreiben: „1000L“. Das hatte ich bereits vor zwei Wochen geschrieben (Beitrag "Re: Arduino - long Variable nimmt nur Höchstwert einer int an!"). Doppelt gemoppelt hält besser?
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.