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.
Unlucky2012 schrieb:> den aktuellen Wert einer Konstanten ausgeben
???
Eine Konstante ist konstant, da ändert sich nichts. Wenn sich was ändern
soll, brauchst du eine Variable.
mfg.
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.
Unlucky2012 schrieb:> 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.
Jetzt versteh ich aber dein Problem nicht.
Wenn das so wie dotr beschrieben klappt, wo liegt dann das Problem?
Karl Heinz Buchegger schrieb:> Wenn das so wie dotr beschrieben klappt, wo liegt dann das Problem?
Dort wird nur der Gebrauch von ".if" & Co. beschrieben nicht aber, ob
bzw. wie man mittels ".error" den Wert einer Konstanten bzw. Variablen
ausgeben kann.
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
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
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
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 :(.
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
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!
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 ;).
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.