Forum: Mikrocontroller und Digitale Elektronik AVR Assembler - Wert einer Konstanten ausgeben


von Unlucky2012 (Gast)


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!

von Karl H. (kbuchegg)


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.

von Thomas E. (thomase)


Lesenswert?

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.

von Unlucky2012 (Gast)


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.

von Karl H. (kbuchegg)


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?

von Unlucky2012 (Gast)


Lesenswert?

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.

von Steffen H. (avrsteffen)


Lesenswert?

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

von Unlucky2012 (Gast)


Lesenswert?

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.

von Harald M. (mare_crisium)


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

von spess53 (Gast)


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

von spess53 (Gast)


Lesenswert?

Hi

Korrektur. Im AVR Assembler2 erzeugt folgendes:

[avrasm]
    #define abcd 5
    #message _abcd = abcd
[avrasm]

die Ausgabe:

  _abcd = 5

MfG Spess

von Unlucky2012 (Gast)


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 :(.

von spess53 (Gast)


Lesenswert?

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

von Bond (Gast)


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!

von Unlucky2012 (Gast)


Lesenswert?

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 ;).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.