AVR Assembler - Wert einer Konstanten ausgeben

Gast #2612172
Lesenswert?

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!
#2612176
Lesenswert?

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 #2612183
Lesenswert?

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.
#2612187
Lesenswert?

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?
#2612237
Lesenswert?

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 #2612249
Lesenswert?

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 #2613069
Lesenswert?

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 #2613099
Lesenswert?

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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren