Forum: Mikrocontroller und Digitale Elektronik .SET Direktive in AVR Studio


von Gerhard G. (ibilzh)


Angehängte Dateien:

Lesenswert?

Hallo,

ich hab eine Frage zu .SET Direktive im AvrStudio 4.19. Ich will .SET
innerhalb des Programmes ändern. Lt. Help von Atmel sollte das ja gehen.
Wie im Beispiel sollen die Positionen Zeile und Spalte eines LCD im
Hauptprogramm geändert werden und in einer Routine der Include Datei
übernommen und ausgeführt werden.
Nach dem Build schreibt das LCD alles in eine Zeile. Es werden nur die
letzten Daten der .SET Definitionen im Programm genommen.
Im Debugger sieht man das auch.
Das man das gleich mit Registern machen kann (hab ich dann auch 
gemacht)ist mir klar. Um was es mir hier geht ist .SET als Variable zu 
benutzen,
weil man hier schön direkt rechnen könnte.
Beispiel:    ldi  r24, LOW((takt/(4 * 1000000))* Expression_aus.SET)
Frage:
Liegt der Fehler zwischen meinen Kopfhörern oder geht das mit .SET
wirklich nicht.
von Karl H. (kbuchegg)


Lesenswert?

Ähm
1
           .set lcd_zeile = 1      ; Cursorposition Zeile
2
           .set lcd_spalte = 1     ; Cursorposition Spalte
3
           rcall lcd_locate        ; DDRAM Adresse setzen
4
5
...
6
7
           .set lcd_zeile = 2      ; Cursorposition Zeile
8
           .set lcd_spalte = 5     ; Cursorposition Spalte
9
           rcall lcd_locate        ; DDRAM Adresse setzen

du erwartest jetzt aber nicht ernsthaft, dass die Assembler Direktiven 
zur Laufzeit des Programms, je nachdem welcher lcd_locate call gerade 
ausgeführt wird, neu berechnet werden?

die .set Direktiven wirken sich aus, wenn das Unterprogramm lcd_locate 
assembliert wird! Die wird aber nicht an der Aufrufstelle assembliert, 
sondern dann, wenn sie im Laufe des Source Codes drann kommt. Und sie 
wird auch nicht mehrmals assembliert, sondern nur einmal. Und die 
mittels .set gesetzten Werte, die dann 'aktiv' sind, das sind die, die 
bei der Assemblierung des Codes des Unterprogrammes benutzt werden.

Du musst dir klar machen, dass alle Assembler Direktiven, das sind alle 
'Anweisungen' die mit einem . beginnen, Anweisungen an den Assembler 
sind, wie er Code zu übersetzen hat bzw. diese Übersetzung steuern. Zur 
Laufzeit deines Programmes, auf dem µC, existieren die alle nicht mehr.
von spess53 (Gast)


Lesenswert?

Hi

>Liegt der Fehler zwischen meinen Kopfhörern oder geht das mit .SET
>wirklich nicht.

Geh mal von den Kopfhörern aus.

Dein Unterprogramm 'lcd_locate' liegt im Programm hinter der letzten 
Set-Direktive. Wenn der Assembler das Unterprogramm übersetzt hast du 
also die ersten beiden Sets schon überschrieben.

MfG Spess
von Gerhard G. (ibilzh)


Lesenswert?

Schnelle Antwort, danke

ich habe das tatsächlich so gesehen, dass man die Ausdrücke von .SET
im Programm "schwammiger" ändern kann.

Aus Help von AVR Studio:
-The SET directive assigns a value to a label. This label can then be 
used in later expressions. Unlike the .EQU directive, a label assigned 
to a value by the SET directive can be changed (redefined) later in the
program.

Hätte ja sein können, dass der Assembler mehr Speicher reserviert.

Wenn ich Eure Aussagen richtig interpretiere, dann ist .SET nicht für 
Schleifen geeignet, sondern nur im starren Programmablauf.
Also den Ausdruck verwenden (meinetwegen was rechnen) dann ändern
und wieder neu verwenden. Jedes .SET im Ablauf löscht den alten Wert.

Gibt es eine Quelle, wo man nachlesen kann, wie die Assembler Direktiven 
arbeiten. Die drei Sätze aus der Help sind alles was ich gefunden habe.

Gruß
Gerhard
von spess53 (Gast)


Lesenswert?

Hi

>ich habe das tatsächlich so gesehen, dass man die Ausdrücke von .SET
>im Programm "schwammiger" ändern kann.

So ist es doch auch. Nur gilt das für die Assemblierung und nicht für 
den Programmablauf.

>Hätte ja sein können, dass der Assembler mehr Speicher reserviert.

Und wie soll der Assembler entscheiden wann welcher Wert gültig ist?

>Wenn ich Eure Aussagen richtig interpretiere, dann ist .SET nicht für
>Schleifen geeignet, sondern nur im starren Programmablauf.

Du bringst hier wieder Programmablauf und Assemblierung durcheinander. 
Der Assembler kennt keine Schleifen. Für den ist das ein Text, der 
zeilenweise in Maschinencode übersetzt wird.

>Gibt es eine Quelle, wo man nachlesen kann, wie die Assembler Direktiven
>arbeiten. Die drei Sätze aus der Help sind alles was ich gefunden habe.

Keine Ahnung. Mir hat bisher die AVR-Studio-Hile gereicht.

MfG Spess
von Gerhard G. (ibilzh)


Lesenswert?

Hallo,

spess53 schrieb:
> Dein Unterprogramm 'lcd_locate' liegt im Programm hinter der letzten
> Set-Direktive. Wenn der Assembler das Unterprogramm übersetzt hast du
> also die ersten beiden Sets schon überschrieben.

'lcd_locate' steht vorher auch mal schon drin.
Dem Assembler dürfte es egal sein, wo ein Unterprogramm im Source steht. 
Er sollte es separat übersetzen und plazieren. Beim RCALL lcd_locate 
werden nur die Speicherstellen angegeben, wo das Unterprogramm sitzt. 
Nach RET aus dem Unterprogramm werden meine alten Sets überschrieben und 
sind weg. Mein Fehler, weil ich sie nicht ausgewertet hab.

spess53 schrieb:
> Du bringst hier wieder Programmablauf und Assemblierung durcheinander.
> Der Assembler kennt keine Schleifen. Für den ist das ein Text, der
> zeilenweise in Maschinencode übersetzt wird.

Das sollte natürlich Unterprogramm heissen und nicht Schleife.

Karl Heinz Buchegger schrieb:
> Du musst dir klar machen, dass alle Assembler Direktiven, das sind alle
> 'Anweisungen' die mit einem . beginnen, Anweisungen an den Assembler
> sind

Mein Fehler war die Sets im Source zu plazieren und nicht auszuwerten 
(z.B. speichern)

Der Knopf bei mir ist aufgegangen, nochmals Danke an euch zwei

Gerhard
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.