mikrocontroller.net

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


Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups...
...Meinte natürlich, die Variablen A und B nach vorne stellen.

Autor: Ingo Henze (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ingo Henze (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benhasi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

.equ kennt nur ganzzahlige Werte.

MfG Spess

Autor: Benhasi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
d.h. es AVR Studio gibt einen Fehler aus oder rundet??

Gruss
Ben

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.