AVR-Studio und .EQU!

Gast #123330
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
Gast #123332
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
#123333
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
Gast #123334
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
Gast #123335
@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
Gast #1123789
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
#1123897
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.
Gast #1124003
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

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.