die zweite lösung wars:
hunderter: 9 zehner: 0 einer: 6
danke
die zweite lösung wars:
hunderter: 9 zehner: 0 einer: 6
danke
gruß inka
sehr gut. und so ähnlich müsste es auch mit dem display klappen, indem du den offset addierst und dann ausgibst.
AARGH:
mir fällt grad was auf. das sollte durchaus so funktionieren wie vorher (PrintInt(hunderter) ABER du hast die funktion INNERHALB der main-funktion deklariert. dieser absatz
MUSS ÜBER DER MAIN-FUNKTION STEHEN und nicht mittendrin :PCode:unsigned int hunderter(unsigned int zahl){ return zahl/100; }
ich habe es jetzt so abgeändert:
die auskomentierte zeile mit batterie hat er angemeckert, weil keine konstante, kommt später dran. Die warnung wg. der geänderten zeile PrintInt(hunderter);Code:#include "asuro.h" #include "lcd.h" #include "i2c.h" int zahl=246; //int zahl=Batterie(); int hunderter( int zahl){ return zahl/100; } int zehner( int zahl){ return (zahl - (100 * hunderter(zahl)))/10; } int einer( int zahl){ return zahl - (100*hunderter(zahl)) - (10*zehner(zahl)); } int main(void) { Init(); SerWrite("\r\n hunderter: ",14); PrintInt(hunderter); SerWrite(" zehner: ",9); PrintInt(zehner(zahl)); SerWrite(" einer: ",8); PrintInt(einer(zahl)); return 0; }
kommt aberr wieder:
../lcd_ausgabe.c:30: warning: passing arg 1 of `PrintInt' makes integer from pointer without a cast
gruß inka
hallo,
mit diesem code
habe ich bereits die größe des hexfiles erreicht die in den atmega8 nicht mehr reinpasst, bzw. eine fehlermeldung beim flashen ausgegeben wird...Code:#include "asuro.h" #include "lcd.h" #include "i2c.h" int zahl; unsigned int batt_1, batt_2, batt_3; float spannung; /************hunderter**********/ int hunderter( int zahl){ return zahl/100; } /*************zehner************/ int zehner( int zahl){ return (zahl - (100 * hunderter(zahl)))/10; } /*************einer*************/ int einer( int zahl){ return zahl - (100*hunderter(zahl)) - (10*zehner(zahl)); } /************************batterieabfrage*************************************/ void batt_abfrage(void) { (batt_1)=Batterie(); (batt_2)=Batterie(); (batt_3)=Batterie(); if ((batt_1)<((batt_2)-(batt_2)/100)) (batt_1)=Batterie(); if ((batt_2)<((batt_3)-(batt_3)/100)) (batt_2)=Batterie(); if ((batt_3)<((batt_1)-(batt_1)/100)) (batt_3)=Batterie(); spannung=(batt_3 + batt_2 + batt_1)/535.1; } int main(void) { Init(); zahl=Batterie(); batt_abfrage(); SerWrite("\r\n hunderter: ",14); PrintInt(hunderter(zahl)); SerWrite(" zehner: ",9); PrintInt(zehner(zahl)); SerWrite(" einer: ",8); PrintInt(einer(zahl)); SerWrite(" spg: ",6); PrintFloat(spannung,1,5); return 0; }
Kann das sein, oder ist da irgendwo ein fehler? Ich habe mit staunen festgestellt, dass das Printfloat mit dem einbinden von printf.c eine vergrößerung der hexdatei von 18,235k auf 22,237k bewirkt. Eine printzeile! Da muss ich wohl um mein ziel zu erreichen noch was tun...
gruß inka
tja.. floats sind halt echt tückisch. da gehen einige kilobyes flöten... deshalb behilft man sich soweit es geht mit ints oder am besten sogar chars.
du teilst auch durch 535.1, was ja auch ein float ist. evtl solltest du durch 535 teilen, und versuchen alles auf integer zu bringen. das würde den code deutlich verkleinern.
warum setzt du batt_1 ,2 ,3 in klammern? geht auch ihne denke ich, könnte sein dass der compiler hier ein paar unnötige bytes produziert.
was evtl ein problem sein könnte, ist dass die unsigned int bis zu 5 stellen haben können. deshalb wird die zahl der hunderter nicht korrekt berechnet, da alle stellen über der dritten mit in die hnderterstelle eingefügt werden.
du brauchst also, wenn du größere zahlen als 999 bearbeitest, noch eine funktion für tausender, und wenn du größere zahlen als 9999 bearbeitest, auch eine für 10tausender.
schönen guten morgen...
ein anderes thema, hängt aber auch mit der ausgabe am lcd zusammen. Folgender code:
lässt sich problemlos compilieren, am lcd tut sich aber nix...Code:#include "asuro.h" #include "lcd.h" int main(void) { Init(); //Initialisiert ASURO InitLCD(); PrintAlignLCD (LEFT, 1, "Ich bin"); PrintAlignLCD (RIGHT, 2, "asuro"); // for(;;); return 0; }
was habe ich übersehen?
gruß inka
das mit den klammern habe ich geändert, aber beim teilen durch 535 werden alle nachkommastellen durch nullen ersetztZitat von damaltor
gruß inka
hmm das ist wahr. aber wenn du die zhal vorher mit 100multiplizierst, und dann bei der ausgabe darauf achtest das komma an die richtige stelle zu setzen, hast du trotzdem zwei nackommastellen... =)
10 / 8 = 0.125 -> kommazahlen
10 * 100 / 8 = 125 -> keine kommazahlen
ok,
das habe ich glaube ich verstanden, werde ich ausprobieren...
der beitrag weiter oben - was habe ich bei der initialisierung des lcd vergessen? Zumindest in der lcd.c habe ich weiter nichts gefunden? Ist es eigentlich so, dass mit der lcd.c aus der 2.7.1 lib jetzt alle programme aus dem band II nicht funktionieren?
gruß inka
Lesezeichen