ich habe festgestellt, daß man fehlende Anweisungen in Macros ergänzen kann wie im Beispiel ADDI. Jedoch kann man unlogische Anweisungen nicht in den Macros verändern wie im Beispiel SBR. Der Assembler sieht dann wohl erst dann in den Macros nach, wenn er die Anweisung nicht findet. Schöner wäre es, wenn die Macros eine höhere Priorität hätten und zuerst dort nachgesehen würde. Unlogisch ist es, wenn die Parameter beim Setzen eines Bits im Register anders sind als beim Setzen eines Bits im I/O Register. Beim Setzen eines Bits im Register mit SBR muß das 1<< immer geschrieben werden, da gibt es keine Wahlmöglichkeit. Sowas sollte es in Assembler nicht geben. .MACRO ADDI ; Addieren Sofort subi @0,-@1 .ENDMACRO .MACRO sbr sbr @0,1<<@1 .ENDMACRO Bei der Anweisung CLS gibt der ATMEGA32 keine Fehlermeldung aus, obwohl diese Anweisung nicht in der Hilfe Datei enthalten ist. Kann jemand diese Mängel in Englisch übersetzen und an Atmel senden? mfg
> Bei der Anweisung CLS gibt der ATMEGA32 keine Fehlermeldung aus, obwohl > diese Anweisung nicht in der Hilfe Datei enthalten ist. In welcher Hilfe-Datei hast Du denn nachgesehen? Bei mir gibt es CLS sehr wohl...
> ...Setzen eines Bits im Register > anders sind als beim Setzen eines Bits im I/O Register... sbr cbr und sbi cbi sind zwei völlig unterschiedliche Befehlspaare, die völlig unterschiedlich funktionieren. sbi / cbi kann immer nur ein einzelnes Bit in einem I/O-Register verwursten. Da wird dementsprechend die Nummer des Bits angegeben. sbr / cbr hingegen kann auf alle Bits in einem Rechenregister gleichzeitig zugreifen! Dafür muss allerdings eine Maske angegeben werden. sbr ist nur eine andere Schreibweise von ori und cbi eine andere Schreibweise von andi mit dem Komplement der Maske. Schau Dir einfach mal den Opcode der Befehle an, und Du wirst sehen, dass die tatsächlich identisch sind. Das ist kein Mangel am Assembler, sondern eher ein Mangel an Verständnis Deinerseits...;-) ATMEL hätte sbr / cbr auch aus dem Befehlssatz herauslassen können, da es eben eigentlich keine eigenständigen Befehle sind. In dem Falle müsstest Du anstelle von "sbr Rd, k" immer "ori Rd, k" schreiben und bei "cbi Rd, k" wäre das "andi Rd, ~k". Das cbi nimmt Dir sogar noch das Invertieren der Maske mit ab. Sei doch froh, dass ATMEL Dir die Arbeit leichter macht...
meine Hilfe Datei ist wohl schon etwas älter. Stammt aus der nicht funktionsfähigen Installation von Studio 4.11 . Und nur um einzelne Dateien upzudaten, ist eine Installation nicht gerade angebracht. Wenn ich mal davon absehe, daß ich mit einem Modem 70MB runterladen soll, nur um den Assembler und die Hilfe Datei zu aktualisieren. Kannst Du mir den neuen Assembler und die Hilfe Datei zusenden? ( quehl ett gmx punkt de ) Mit dem SBR hast Du mich falsch verstanden. Es geht nicht um die Anweisung selber, die ist schon nützlich, sondern um die unterschiedl. Handhabung zwischen Registern und I/O Registern. Wenn man dann noch bedenkt, daß I/O Anweisungen auch durch Registerbefehle angesprochen werden können, dann kann ich die unterschiedl. Handhabung nicht verstehen. Zwischen SBR und SBI. Warum soll ich nicht mit SBR ein einzelnes Bit setzen dürfen, wenn das mit SBI auch geht. mfg
Wolfram Quehl wrote: > Mit dem SBR hast Du mich falsch verstanden. Es geht nicht um die > Anweisung selber, die ist schon nützlich, sondern um die unterschiedl. > Handhabung zwischen Registern und I/O Registern. Wenn man dann noch > bedenkt, daß I/O Anweisungen auch durch Registerbefehle angesprochen > werden können, dann kann ich die unterschiedl. Handhabung nicht > verstehen. Zwischen SBR und SBI. > > Warum soll ich nicht mit SBR ein einzelnes Bit setzen dürfen, wenn das > mit SBI auch geht. Ich denke nicht, dass ich Dich da falsch verstanden habe. Selbstverständlich kannst Du mit sbr ein einzelnes Bit in einem Register setzen. Da der Befehl sbr aber auch alle Bits eines Registers gleichzeitig setzen kann, ist die Syntax eine andere. sbi/cbi sind "echte" Assembler-Befehle, die im Befehlssatz des Controllers existieren. Das tun sbr und cbr nicht. Im Grunde genommen sind das nur eine Art im Assembler "fest eingebaute Makros" und keine eigenständigen Befehle. Sie sind nur dazu da, um ein Programm lesbarer zu machen. Es gibt im Befehlssatz nunmal keinen dem sbi/cbi entsprechenden Befehl zum Setzen eines einzelnen Bits in einem Rechenregister. Und da kannst Du Dich noch so sehr bei ATMEL beschweren, die werden daran sicher nichts ändern. Wenn Du versuchst, mit einem Makro einen existierenden Befehl zu redefinieren, dann ist es verständlich, wenn der Assembler das nicht mit sich machen lassen will. Du musst auch verstehen, dass man den AVR-Befehlssatz so entwickelt hat, dass bis auf wenige Ausnahmen alle Befehle 16 Bit lang sind. Und da ist nunmal nicht viel Spielraum für Adressen. Deshalb können z.B. alle Befehle, die mit immediate-Werten arbeiten (also auch sbr und cbr), nur mit den oberen 16 Rechenregistern arbeiten, weil neben dem 8-Bit-immediate-Wert noch die Adresse des Registers im Befehl untergebracht werden muss. Und dann bleibt für den eigentlichen Befehl nicht mehr viel Platz.
Man muss auch immer sehen, dass Assembleranweisungen selten dahin optimiert sind, möglichst ideal den Programmierer zu erfreuen. Es ist immer ein Kompromiss, wie man es technisch einfach hinbekommt und wie die Kosten des Chips möglichst gering werden. Aus Programmierersicht könnte man vieles viel besser machen, wie viele haben z.B. schon über die Architektur und die wenigen Befehle des PIC's geflucht. Dafür waren die aber auch über viele Jahre unschlagbar günstig. Und irgendwann lernt man die Gehirn-Akrobatik, mit den Merkwürdigkeiten klar zu kommen. Das man beim AVR manchmal ein Bit anspricht und manchmal eine Maske übergibt, finde ich auch etwas unschön und da bin ich auch öfters schonmal drüber gestolpert.
Winfried wrote: > Man muss auch immer sehen, dass Assembleranweisungen selten dahin > optimiert sind, möglichst ideal den Programmierer zu erfreuen. Es ist > immer ein Kompromiss, wie man es technisch einfach hinbekommt und wie > die Kosten des Chips möglichst gering werden. Naja, der AVR ist nunmal ein RISC. Und RISC bedeutet eben im Gegensatz zu CISC (Complex Instruction Set Computer) Reduced Instruction Set Computer. Und ein wichtiger Gesichtspunkt der "Philosophie" einer RISC-Architektur ist es, einen Befehlssatz zu haben, dessen Anweisungen möglichst gleich lang (bzw. eher gleich kurz) sind und die im Großen und Ganzen in einem Taktzyklus abgearbeitet werden können. Durch die vorgegebene Kürze der Befehle ergibt sich auch eine Einschränkung der Anzahl der Befehle. Man hat eben einige sehr grundlegende Funktionen zur Verfügung, aus denen man durch Kombination komplexere Operationen zusammenbauen kann. ATMEL hat bei der Entwicklung des Assemblers bereits einige Mnemonics ähnlich wie sbr/cbr eingebaut, die die Programme lesbarer machen sollen, ohne dass der Programmierer erst zig Makros schreiben muss. Ungefähr ein Drittel des AVR-Befehlssatzes sind solche "Pseudo-Befehle", die lediglich andere Schreibweisen für bestimmte Befehle darstellen. So gibt es z.B. auf "Maschinenebene" nur zwei Branch-Befehle (nämlich brbc und brbs). Alle anderen 18 brXX-Befehle sind von diesen beiden abgeleitet, indem einer der Operanden bereits vorgegeben ist und nur noch das Sprungziel angegeben werden muss. Warum ATMEL allerdings ein addi "vergessen" hat, weiß ich auch nicht... > Aus Programmierersicht > könnte man vieles viel besser machen, wie viele haben z.B. schon über > die Architektur und die wenigen Befehle des PIC's geflucht. Dafür waren > die aber auch über viele Jahre unschlagbar günstig. Und irgendwann lernt > man die Gehirn-Akrobatik, mit den Merkwürdigkeiten klar zu kommen. Und für die PICs gilt afaik ähnliches. Ich habe mit ST6 meine ersten µC-Schritte gemacht. Wenn ich mich recht entsinne, gibts da nicht mal 40 Mnemonics (AVR-Assembler hat mehr als dreimal so viele, hauptsächlich durch die "Pseudo-Instruktionen"). > Das man beim AVR manchmal ein Bit anspricht und manchmal eine Maske > übergibt, finde ich auch etwas unschön und da bin ich auch öfters > schonmal drüber gestolpert. Es ist richtig, dass das eine Stolperfalle sein kann. Aber man kann eben nicht alles haben...;-)
@Läubi: Wolfram hat das addi-Makro oben ja schon angegeben. Ich finde allerdings die Übersetzung von "immediate" funny...
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.