Forum: Mikrocontroller und Digitale Elektronik AVR-Studio und .EQU!


von Andi (Gast)


Lesenswert?

Hi!

Ich popel seit Anfang an mit dem AVR-Studio rum und bin wieder mal auf
ihn reingefallen.
Habe die Version 4.10 und folgendes Problem:

.cseg
.equ C=(20-B)/2
.equ D=A*64+C
......
Code:
 ldi r17,C
.....
 cpi r17,D
 brlo ...
.....

.dseg
.equ A=2
.equ B=16
Array: .byte A*B

Das Problem dabei ist, das der ASM für die Variablen C und D einfach
nur nullen einfügt und mich ohne einer Fehlermeldung im Regen stehen
läßt.
Natürlich kommt dann erst mal wieder laaange Fehlersuche und Haare
raufen.

Mußte das dann so ändern, damit alles stimmt:

.equ A=2
.equ B=16

.cseg
.equ C=(20-B)/2
.equ D=A*64+C
......
Code:
 ldi r17,A
.....
 cpi r17,D
 brlo ...
.....

.dseg
Array: .byte A*B

Also die Variablen C und D welche im Code benutzt werden vor diesen
Code stellen.
Da ich aber gerne wie im ersten Beispiel alles der Zugehörigkeit wegen
beinander habe, gibt es ne Möglichkeit das Assemblieren zu verbessern
mittels ändern der Einstellungen im AVR-Studio?
Denke da an so was wie "2-pass" oder irgend so was.

Gruß
Andi

von Andi (Gast)


Lesenswert?

Ups...
...Meinte natürlich, die Variablen A und B nach vorne stellen.

von Ingo Henze (Gast)


Lesenswert?

Nimm mal anstelle von
.equ C = ...
.equ D = ...
besser
.set C = ...
.set D = ...

EQU ist eine Konstantendefinition, SET eher eine Variablenzuweisung,
die sich auch im 2. Pass noch ändern kann.

Im übrigen kommt bei mir zwar keine Fehlermeldung, aber zumindest eine
Warnung.

Gruß
Ingo

von Peter D. (peda)


Lesenswert?

Ein Assembler kann keine Variablen verwalten.

Variablen werden nur in Hochsprachen automatisch angelegt und
verwaltet.

Mit .EQU definierst Du Konstanten, die zur Assemblezeit ausgerechnet
und dann durch den ermittelten Wert ersetzt werden.
Diese werden auch genau in der Reihenfolge des Quelltextes
abgearbeitet.

Eine Ausnahme bilden Ausdrücke mit Labels weiter hinten, nur die werden
im 2. Durchlauf berechnet.

Blöd ist natürlich, wenn der Assembler einen noch nicht bekannten
Ausdruck stillschweigend durch 0 ersetzt, statt einen Fehler zu
melden.


Peter

von Ingo Henze (Gast)


Lesenswert?

So stillschweigend tut er es ja auch nicht, er gib eine Warnung aus:
"warning : Undefined variable referenced"
Wer natürlich Warnungen generell nicht ernst nimmt, ist selber Schuld
:-)

Andererseits verhalten sich mit .SET definierte Labels eben doch so
ähnlich wie Variablen. Der Wert kann zu jeder Zeit, anders als bei
.EQU, geändert werden.

Gruß
Ingo

von Andi (Gast)


Lesenswert?

@Ingo:
Gelesen, getan!
Klappt prima.
Habe gerade in der Onlinehilfe nachgelesen und da steht in der
Übersicht

EQU - Set a symbol equal to an expression
und
SET - Set a symbol to an expression.

Scheint fast identisch zu sein wo bei in der Hilfe ganz unten über SET
das gleiche steht wie über EQU. Vielleicht Tippfehler.
Auf jeden Fall beachtet SET die Symnolics die erst noch kommen im
gegensatz zu EQU.
Sollte vielleicht nur noch SET benutzen.

Das mit den Warnings ist halt so ne Sache.
Da die Warnungen normalerweise nur die .db-Felder mit ungrader Anzahl
Bytes betreffen achte ich nicht so drauf und schau mir nur die roten
Meldungen an. :-)
Sollte ich wohl ändern.

Gruß
Andi

von Benhasi (Gast)


Lesenswert?

Hallo,

entschuldigt, dass ich den Thread ausgrabe, aber...
um ein Programm für die Zukunft uns spätere Anwendungen portierbar zu 
machen habe ich im Assembler-Code desöfteren Werte folgendermaßen 
definiert


.equ XTAL=4000000

...

ldi r17=(XTAL/100000)
...


was passiert, wenn später ungerade Xtal-Werte eingetragen werden bspw 
(XTal=4 166 666)? Rundet das AVR Studio!? Auf/ab? Was ist die 
Konvention?

Viele Grüße
Ben

von spess53 (Gast)


Lesenswert?

Hi

.equ kennt nur ganzzahlige Werte.

MfG Spess

von Benhasi (Gast)


Lesenswert?

d.h. es AVR Studio gibt einen Fehler aus oder rundet??

Gruss
Ben

von Johannes M. (johnny-m)


Lesenswert?

Benhasi wrote:
> ldi r17=(XTAL/100000)
Das geht gar nicht. Schau Dir mal die Syntax der Assembler-Befehle an. 
Oder war es nur ein Tippfehler?

> d.h. es AVR Studio gibt einen Fehler aus oder rundet??
Gerundet wird gar nichts. Wie auch in C wird eine Berechnung in ganzen 
Zahlen durchgeführt und der Nachkommaanteil einfach abgeschnitten.

von Gast (Gast)


Lesenswert?

Hallo,

ja, war ein Tippfehler!
Danke für die Antwort, es funktioniert also, produziert nur eine kleine 
aber akzeptable Ungenauigkeit!
Aber kleine Spitzfindigkeit: den Nachkommateil zu vernachlässigen, nennt 
man das nicht Abrunden? ;-)

Viele Grüße
Ben

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.