Hallo liebe Gemeinde!
Vorab, ich bin kein Profi in diesem Gebiet, hatte nur einige Stunden
µController in der Schule. Deswegen seit bitte nicht zu hart.
Jetzt zu meinem Problem, ich wollte eine Witterungsbedingte
Temperatursteuerung simulieren. Jetzt "hängt" der sich nur schon bei der
Rechnung für die Solltemperatur auf, die Formel funktioniert
einwandfrei, bis ich die Division durch 10 einfüge, danach springt der
mir in die disassembly Tabelle! Dies bezog sich jetzt auf die Rechnung
mit der Variable "sollwert". Bei der Variable "b" funktioniert eine
Division bzw rechnet er hier auch mit 1.2 warum eigentlich? Da er aber,
sobald ich Variablen ins spiel bringe, nicht mehr mit 1.2 rechnet
sondern abrundet auf 1, muss ich eben mal 12 multiplizieren und dann
später durch 10 dividieren. Die Rechnung soll mit Integervariablen
erfolgen kein float!
Ich benutze AVR Studio 6.0, und einen Atmega8A
Quelltext:
int main(void)
{
int heizkurve = 12;
int sollwert = 0;
int aussentemp = 100;
int konstante = 500;
while(1)
{
int b = ((500-600)*1.2)+500;
sollwert = (((konstante-aussentemp)*heizkurve)+konstante)/10;
}
}
Seijsschmeer schrieb:>> Bei der Variable "b" funktioniert eine> Division bzw rechnet er hier auch mit 1.2 warum eigentlich? Da er aber,> sobald ich Variablen ins spiel bringe, nicht mehr mit 1.2 rechnet> sondern abrundet auf 1, muss ich eben mal 12 multiplizieren und dann> später durch 10 dividieren.
Hallo,
Im Fall mit den 1.2 rechnest Du mit einer konstanten, packst Du diese
aber in eine Integer-Variable, die nur Ganzzahlen kann, dann wird der
Wert gerundet.
Du kannst also, wie Du es schon versucht hast, deinen Wert mal 12 nehmen
und dann durch 10 teilen.
Seijsschmeer schrieb:> int b = ((500-600)*1.2)+500;
In diesem Fall rechnet der Mikrocontroller überhaupt nicht. Es wird nur
die Variable b mit dem Wert 380 initialisiert. Mehr nicht.
Die Rechenarbeit übernimmt der Compiler während der Übersetzungszeit.
Wahrscheinlich rechnet aber auch der Compiler nichts, denn die Variable
b wird nirgends verwendet und daher "wegoptimiert".
Danke schonmal für die antworten. Wobei mein eigentliches problem bei
der zweiten rechnung liegt, die mit der variablen "sollwert". Sobald ich
durchsteppe, hängt sich das programm an dieser stelle auf. Und es hat
irgendwas mit der division durch 10 zu tun. Ich weiß nur nicht was.
Sobald ich die division herausnehme, funktioniert die rechnung. Mfg
Leider funktioniert das so auch nicht. Sobald ich eine Variable
dividieren möchte funktionierts nicht, also avr studio springt in die
disassembly tabelle und das Prog hängt sich auf. Habe jetzt einfach mal
folgende Zeile hineingeschrieben.
int test = konstante (hat der wert von 500) /10;
funktioniert auch nicht. Wenn ich die 10 selbst als Int Variable
deklariere und dieser den Wert 10 zuweise geht es auch nicht, also z.B.
int div = 10;
int konstante =500;
int test=konstante/div;
Ich verzweifel noch, bei sowas simplen eigentlich oder eher doch
nicht...
MfG
also im disassembly sehe ich wie 500 und 10 in den registern landen.
ich sehe aber nirgends die ausführung der division.
schreib mal bitte unter die division
PORTA=test>>8;
PORTB=test & 0xff;
das zwingt den kompiler das ergebnis an den ports auszugeben und die
division wird entweder ausgeführt oder durch den compiler vorberechnet.
@ holger, funktioniert leider auch nicht, hatte es damit aber auch schon
probiert gehabt, ich vergaß zu erwähnen das die Optmierung ausgeschaltet
ist, sorry.
@ich, nicht du, leider auch kein Erfolg mit deiner Variante. In der
disassembly Liste steht doch was über die Division, 23:.....oder nicht?
Kann es sein das Generell Divisionen einen großen Akt darstellen, habe
ja vorher schonmal nach Lösungen gegoogelt, da wird dann
Registerschieberei erwähnt, oder es wurden eigene Algorithmen
geschrieben usw...z.B. hier
http://www-user.tu-chemnitz.de/~heha/Mikrocontroller/Division.htm
Versteh da leider nur Bahnhof.
Man definiert doch keine Variablen in einer Schleife oO
Zudem gewöhnte dir int ab und bedenke, das du der 10 den entsprechenden
Variablentyp anhängen solltest...
Da ist ja momentan ein reines Testprogram, ich definiere keine Variablen
in einer Schleife, wenn ich sie vorher deklariere passiert das selbe.
sunfloweer_seed schrieb:> Zudem gewöhnte dir int ab und bedenke, das du der 10 den entsprechenden> Variablentyp anhängen solltest...
wie soll ich das verstehen? Falls du meinst das ich eine Integervariable
erstellen sollte und der den Wert 10 zuweisen sollte, funktioniert auch
nicht. Und was meinst du mit Integer abgewöhnen? Ich möchte aber damit
rechnen...
Die volatile-Variablen sollten auf globaler Ebene sein. Innerhalb der
Funktion machts nicht viel Sinn, da dort von außerhalb keine
Zugriffsmöglichkeit besteht.
Probiers mal so:
Wilhelm F. schrieb:> Seijsschmeer:>> Probier es mit Bounenschlupp, das geht bestimmt besser. ;-)
Wasn das??
@ Hans funtkioniert auch nicht, alles schon probiert...
@sunflower Hab sämtliche Datentypen durch, die Konstanten auch gecastet
usw. leider kein Erfolg. Sobald ich aber durch "digitale" Zahlen
dividiere also durch 2,4,8,16 usw funktioniert es Problemlos...habs auch
schon mit hex Schreibweise probiert...auch nichts.