mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Immediates zur assemblierzeit berechnen (Genauigkeit?)


Autor: Mark Hämmerling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Salut,

mit dem Vorsatz, in Timer-relevanten Routinen (z.B. RC5-decoding) 
betreffende Immediates per Formel über die Konstante "XTAL" zu 
berechnen, bin ich auf Probleme gestoßen. Und zwar ist mir aufgefallen, 
daß teilweise unerwartete Werte aus den Berechnungen hervorgegangen 
sind, die evtl. mit der Rechengenauigkeit des Assemblers zu tun haben.

Mein Assembler ist tavrasm 1.17 (Unix), in den Docs hab ich zu dem Thema 
leider gar nichts gefunden.

Ein Beispiel:
  ldi temp, (XTAL / (UART_BPS * 16)) - 1
funktioniert. Aber es gab etliche andere Fälle, wo ähnliche Formeln 
versagt haben. Ich habe dann das entsprechende Ergebnis per Hand 
eingetragen und es klappte.
Sorry, daß ich jetzt kein Beispiel für das Gegenteil geben kann, aber in 
meinen Sources find ich gerade nichts mehr. Hab alles schon durch Werte 
ersetzt. ;( Aber meiner Erinnerung nach waren es sogar simple 
Divisionen.

Weiß jemand, mit welcher Genauigkeit der Assembler Immediates berechnet? 
Oder kann mir sonst jemand einen allgemeinen Tip geben? Ausführliche 
Klammersetzung hat auch nicht zum Erfolg geführt.

Ein Ziel dieser ganzen Sache ist es, im Source verstreute Werte durch 
einfaches Ändern einer Konstante "XTAL" anzupassen. Eben z.B. um das 
Adaptieren der RC5-Decoderroutine an verschiedene Frequenzen zu 
erleichtern.

Danke für Eure Hilfe!

Mark H. -- http://markh.de

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tavrasm rechnet intern nur mit Integern, wenn ein Teilausdruck also z.B. 
(4/3) ist wird er durch 1 ersetzt und verfälscht das ganze Ergebnis.

Andreas

Autor: Mark Hämmerling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Salut,

zuerst mal danke! Sowas hatte ich geahnt. Gibt's ne Dokumentation als 
Referenz zu diesem Thema, oder woher weißt Du's (wohl in den Sourcen 
geschnüffelt, was? :))?

Hmm, also erst schön alles multiplizieren und erst am Ende dividieren. 
Mehr fällt mir dazu nicht ein. Wenn ich nur nicht das dumme Gefühl 
hätte, das schon erfolglos probiert zu haben...

Nu ja, ich meld mich wieder, wenn ich unklare Beispiele parat habe.

Mark H. -- http://markh.de/avr/

Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!
Das hatte ich jetzt auch mal. Das Probl. es wird nicht gerundet sondern 
der Nachkommateil wird weggelassen.
also muss man selber runden.
In der Codesammlung habe ich es jetzt mal verwendet->"für An und 
Abschneider"
Gruss Uwe

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.