Ich habe ein Problem mit einem Faktor, den ich mit einem Registerinhalt multiplizieren muß. Das Ganze läuft in Bascom und die Variablen sind vom Typ Byte. Problem: Ich lese (mit einem Atmega8) einen AD-Wandlerkanal ein, den ich auf 8 Bit Auflösung eingestellt habe. Dann habe ich im Register ADCH einen Wert von 0-180 dezimal stehen. (dieser Wertebereich ist durch die externe Quelle bedingt und geht leider nicht bis 255 hoch, sonst wäre alles einfach) Um jetzt mit Timer1 eine PWM mit der Auflösung bis 255 machen zu können, müßte ich den Wert in ADCH mit dem Faktor 1,4 multiplizieren. Das geht aber nicht, weil der Wert ADCH*1,4 wieder nur ADCH-Inhalt ergibt, da der Faktor auf 1 gerundet wird. Wie kann man das lösen? MfG Erwin
Warum multiplizierst Du nicht mit 14, addierst dann 5 dazu für die Rundung und dividierst zum Schluss mit 10?? - Achtung das Zwischenergebnis wird größer als 255!
Hallo, Für einen 8-Bit µC: 32768 / 180 = 182 TEMP = ADCH * 182 -> ergibt 16Bit-Wert ERGEBNIS = TEMP / 128 (0 * 182) / 128 = 0 (180 * 182) / 128 = 255 (eigentlich 255,9) mit 181 als Faktor 254,5 Wäen in Assembler so 4-5 Befehle, keine Ahnung, was BasCon draus macht. ;) Gruß aus Berlin Michael
Danke für Eure Antworten. Das half mir weiter. Ich habe die Methode von Michael benutzt. Da mußte ich Temp als Sinle auslegen, damit damit es reinpasste. Jetzt kann ich weitermachen, wie ich wollte. Prima. Erwin
Hallo, freut mich. Solche Methoden haben den Vorteil, daß man in Ganzzahl-Bereich mit überschaubaren Werten bleibt. Ein guter Compiler kann so ohne große Float-Bibliotheken zu benutzen, einen brauchbaren Code draus machen. Am Ende muß schließlich immer ein Maschinencode für eine 8-Bit-CPU mit begrenztem Befehlssatz rauskommen. :) Gruß aus Berlin Michael
Falls mal jemand in die Verlegenheit kommt, siehe Anhang. Danke nochmal Erwin
Hä?? Was, wieso, warum? ;-) Lernresistenz?! Ich mußte es so machen, da es bei der ursprünglichen Variante von Michael nicht funktioniert. Dort würde dann ein Single-Inhalt in ein Byte kopiert werden und das quittiert der Compiler mit "Source Variable does not match Target Variable". Probiert es selbst, dann seht ihr, was ich meine. Nicht alles, was auf dem Papier funktioniert, klappt auch in der Praxis so. Erwin
@Erwin Ich habe mal Dein Programm so geändert, wie es weiter oben beschrieben wird. Das geht schon so. Aber Du hattest Recht, es brachte Fehler beim Kompilieren, wenn man ADCH direkt mit 182 multiplizieren will. Deshalb habe ich noch die Variable Adc_Inhalt dazugenommen. Laß Dich nicht verdrießen :-) FF (Fiel Fergnügen) ;-) Paul
Es will dich niemand verdrießen. Wir hatten uns nur alle gefreut, das es nn mit Ganzzahlarithmetik funktioniert und Du verstanden zu haben schientest, dass ja solche eher wuchtigen Rechenaufgaben auch in einfache Opreationen zerlegt werden können. denn Zitat von Dir > Ich habe die Methode von Michael benutzt. Da mußte ich Temp als Sinle auslegen, damit damit es reinpasste. darauf Zitat von Micha: > Am Ende muß schließlich immer ein Maschinencode für eine 8-Bit-CPU mit begrenztem Befehlssatz rauskommen. :) Dann wieder Du > Ergebnis = Erwin * 1.4 Da war ich dann einfach nur baff! Daher äussert sich mein "Entsetzen" in einem kurzen Zitat >Lernresistenz Hast Du dir mal angesehen, was da "hinten" raus kommt? Sicher (noch) nicht. Darauf (könnte ich mir vorstellen) ziehlt dieses Zitat ab: > Typisch BASCOM Programmierer... Ich habe nun kein BASCOM installiert, aber Single deutet für mich auf Float mit einfacher Genauigkeit. B* unterstützt doch auch andere - ganzzahlige - Formate, wie zB. LONG, oder nicht? Einfach Single nehmen und x 1.4. Das hätte ich Dir auch vorschlagen können ;-)) Sieh Dir mal die Ausgabe an, nimm statt Single Long und vergleiche mal die Ausgaben bezugnehmend auf die Größe. Du wirst erstaunt sein. Ich gehe jetzt mal davon aus, das Dich die Größe und die Ausführungsgeschwindigkeit deines EIGENEN Programms interessiert. Wie gesagt - war nicht böse gemeint. Ich war nur etwas "verdutzt" AxelR. Ich denke, Du solltest mal im Roboternetz unter BASCOm nachsehen, ist ganz gut erklärt, denke ich. http://www.roboternetz.de/wissen/index.php/Bascom http://www.roboternetz.de/wissen/index.php/Bascom#Siehe_auch http://www.roboternetz.de/wissen/index.php/Bascom_Inside http://www.roboternetz.de/wissen/index.php/Assembler_Einf%C3%BChrung_f%C3%BCr_Bascom-User
@Axel Du hast ja Recht. So, ich habe jetzt das Programm von Paul ausprobiert und auch verstanden. Andere (größere) "Nüsse" habe ich schon knacken können, aber das hat mich noch ein paar graue Haare mehr gekostet. :-) Danke für Deine Links. Das ist dort gut zu verstehen und vor allen Dingen in deutscher Sprache. Erwin
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.