www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Register mit Faktor multiplizieren (Atmega8)


Autor: Erwin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Christian_RX7 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schreib beide Variablen als Single, dann gehts.

Autor: jopelabln (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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!

Autor: Michael U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Werbungverschmäher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man gut, dass es Assembler gibt...

MfG

Autor: Erwin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Erwin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...hier noch das fehlende "g" von Single ;-)

Erwin

Autor: Michael U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Erwin (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Falls mal jemand in die Verlegenheit kommt, siehe Anhang.

Danke nochmal

Erwin

Autor: Axel R. (axelr) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lernresistenz

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Typisch BASCOM Programmierer...

Autor: Erwin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Paul (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@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

Autor: Axel R. (axelr) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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/Assembl...

Autor: Erwin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.