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.
Ä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.
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.