AVR Assembler - Wert einer Konstanten ausgeben

Gast #2612172
Hi,

ich arbeite mich gerade in den AVR Assembler ein und komme bisher 
eigentlich ganz gut zurecht. Jetzt würde ich aber gerne im Rahmen einer 
Fehlermeldung den aktuellen Wert einer Konstanten ausgeben (mittels 
.error).

Leider habe ich im "AVR Assembler User Guide" 
(http://www.atmel.com/Images/doc1022.pdf) nichts derartiges finden 
können. Dieser scheint aber sowieso nicht komplett zu sein, da man dort 
auch keine Hinweise auf ".if" und ähnliches findet.

Mal angenommen ich definiere eine Konstante namens "test" wie folgt:
1
.equ test = 123

Wie kann ich jetzt den Wert "123" ausgeben. Konkret möchte ich diesen 
Wert überprüfen und abhängig davon eine Fehlermeldung ausgeben - eben 
mit dem aktuellen Wert.

Vielen Dank im Voraus!
Unlucky2012 schrieb:

> Leider habe ich im "AVR Assembler User Guide"
> (http://www.atmel.com/Images/doc1022.pdf) nichts derartiges finden
> können. Dieser scheint aber sowieso nicht komplett zu sein, da man dort
> auch keine Hinweise auf ".if" und ähnliches findet.

mal anders rum gefragt:
Warum denkst du, dass es ein .if geben sollte?

Ich würde mal annehmen, dass es im Handbuch stehen würde, wenn der 
Assembler diese Direktive unterstützen würde.
Gast
Karl Heinz Buchegger schrieb:
> Warum denkst du, dass es ein .if geben sollte?
Weil es an anderer Stelle, z.B. hier 
(http://www.atmel.com/Images/doc2550.pdf) erwähnt wird und in der Praxis 
auch wunderbar klappt. Wobei ich avra einsetze.

Thomas Eckmann schrieb:
> Eine Konstante ist konstant, da ändert sich nichts. Wenn sich was ändern
> soll, brauchst du eine Variable.
Gut, da hast du recht. Ich benutzte ".set" also wohl so etwas wie eine 
Variable. Und den Wert berechne ich halt erst beim Assemblieren.

Konkret geht es um das Ausrechnen des "richtigen" Prescalers. Da ich 
zunächst nur einen Interrupt habe ist mir der Prescaler ziemlich bis 
komplett egal. Jetzt wollte ich einfach mal alle möglichen Prescaler 
durchgehen und für jeden den "Fehler" ausrechnen, welcher entsteht (da 
ja nur Ganzzahlen möglich sind). Anschließend wähle ich den Richtigen 
und benutzte den so ausgerechneten Wert als Konstante im weiteren 
Verlauf.
Hallo Unlucky

Ich glaube dass geht leider nicht. Sowas hatte ich auch mal vor gehabt. 
Doch du kannst nur eine feste Message (String) über .message oder .error 
bzw .warning ausgeben. Allerdings kannst das assemblieren auch bei 
überschreitung eines errechneten Wertes abbrechen.

Steffen
Gast
Steffen H. schrieb:
> Allerdings kannst das assemblieren auch bei
> überschreitung eines errechneten Wertes abbrechen.
Das mache ich doch mit .error bereits ;). Ich wollte halt meine 
Fehlermeldungen ein wenig aussagekräftiger machen. Aber was soll's.
Unlucky,

ich glaube, was Du suchst, ist das Äquivalent zur 
"if".."then".."else"-Anweisung, die man aus Hochsprachen kennt. In 
Assembler gibt es so etwas Schickes leider nicht. Stattdessen muss man 
eine Anweisung aus der "branch.."-Gruppe benutzen. Das geht so (beim 
ATmega): Wenn Du feststellen willst, ob der Betrag der Zahl in Register 
r16 grösser ist als der der Zahl in r17, dann schreibst Du

....
cp r16,r17 ; stellt die Flags im SREG so ein, als ob r16-r17 berechnet
           ; worden wäre - die Werte in r16 und r17 ändern sich dabei
           ; aber nicht
brcs SprungZiel ; Sprung zum Label "SprungZiel", wenn in SREG das
           ; Carry-Flag auf "Eins" gesetzt ist ("br"anch, if "c"arry
           ; "s"et). In diesem Fall war der Betrag der Zahl in r17
           ; grösser als der der Zahl in r16.

...        ; und hier (ohne Sprung) geht's weiter, wenn das Carry-Flag
           ; auf "Null" gesetzt ist. D.h. wenn der Betrag in r17 kleiner
           ; oder gleich dem der Zahl in r16 ist.

Von der Sorte "br.." gibt's einen ganzen Sack voll. Welche Du in welcher 
Situation am Besten benutzt, das kriegst Du durch Ausprobieren im 
Simulator des AVRStudio heraus ;-).

Die besten Erklärungen findest Du in der Hilfefunktion des AVR-Studio: 
Einfach den Cursor vor die fragliche Assember-Anweisung stellen und dann 
"F1" drücken. Dann siehst Du ein Fenster mit einer sehr ausführlichen 
Erklärung für alle Assembler-Anweisungen des ATmega.

Ciao,

mare_crisium
Gast
Hi

>Leider habe ich im "AVR Assembler User Guide"
>(http://www.atmel.com/Images/doc1022.pdf) nichts derartiges finden
>können. Dieser scheint aber sowieso nicht komplett zu sein, da man dort
>auch keine Hinweise auf ".if" und ähnliches findet.

Das Dokument ist von 1998 ! In der AVR-Studio-Hilfe unter

AVR Assembler->User's Guide->Directives findest du die Beschreibung zu 
.if.

Allerdings ist m.W. die Ausgabe einer Konstanten mit 
.error/.warning/.message nicht möglich. Ich habe das selbst schon 
versucht.

MfG Spess
Gast
Harald M. schrieb:
> ich glaube, was Du suchst, ist das Äquivalent zur
> "if".."then".."else"-Anweisung, die man aus Hochsprachen kennt.
Nein, zumindest nicht in dieser Form. Die Verzweiungsoperationen, welche 
du meinst werden zur Laufzeit ausgeführt. Ich beziehe mich hier aber auf 
die konditionale Assemblierung.

spess53 schrieb:
> Im AVR Assembler2
Scheint wohl so, dass der AVR Assembler2 mehr Funktionalität bietet. 
Konnte allerdings keine Linux-Version finden. Und auf Wine und solche 
Geschichten hab ich wenig Lust. avra funktioniert einfach großartig, nur 
leider ist es wohl ein Nachbau der ersten Version :(.
Gast
Hi

>Scheint wohl so, dass der AVR Assembler2 mehr Funktionalität bietet.

Ja.

>Konnte allerdings keine Linux-Version finden.

Man kann halt nicht alles haben.

MfG Spess
Gast
Unlucky2012,

genau das was Du suchst ist mit einem Beispiel in der Hilfe zum
AVR-Asssembler2, Preprozessor, aufgeführt. Geht aber nicht mit ".if"
sondern mit "#if". Ich heb es im AVR-Studio4.18 mit allen Serce-Packs
gerade nachgelesen. Funktioniert!
Gast
Bond schrieb:
> Ich heb es im AVR-Studio4.18 mit allen Serce-Packs
> gerade nachgelesen. Funktioniert!
Ich würde halt gerne auf Windows - vor allem aber auf das AVR Studio 
verzichten. Bisher hat das auch ganz gut geklappt. Insofern werde ich 
wohl bei avra bleiben ;).

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.