|
|
AVR Assembler Makros
[Bearbeiten] 16 Bit Konstante in Z-Pointer laden
Natürlich auch möglich mit X- und Y-Pointer.
[Bearbeiten] Speicher[Bearbeiten] 2 Register ohne Zwischenspeicher vertauschen
[Bearbeiten] Arithmetik[Bearbeiten] Konstante addieren
[Bearbeiten] Konstante addieren (16 Bit)
oder (sinnlos)
DAS geht auch ohne Makro
SBIW und ADIW sind aber beide auf die Register(paare) R24, R26, R28, R30 beschränkt UND nehmen nur Zahlen <64 an. [Bearbeiten] I/OBei grösseren und neueren AVRs sind etliche I/O-Register nicht mit IN/OUT-Befehlen ansprechbar. LDS/STS erreicht zwar alle, ist aber bei kleineren oder älteren ineffizient. [Bearbeiten] Port lesen
[Bearbeiten] Port schreiben
[Bearbeiten] Portbit abfragenAbfrage eines Bits eines I/O-Ports und Sprung wenn 1/0. Überschreibt u.U. ZL. Branch if Bit in I/O-Register is Set
Branch if Bit in I/O-Register is Cleared
[Bearbeiten] Location Pointer[Bearbeiten] AlignManchmal ist es notwendig, Tabellen oder Puffer auf eine bestimmte Byte- oder Wortgrenze zu bringen, z.B. um beim Zugriff einen Überlauf des Index in das obere Adressbyte zu verhindern.
@0 bezeichnet die Anzahl rechtsbündiger binärer Nullen. Beispiel: align 8 setzt die nächste Adresse auf $xx00. Funktioniert in allen Segmenten. [Bearbeiten] Delay[Bearbeiten] Verzögerung um X Nanosekundenvon Klaus2m5 Taktgenaue Verzögerung der Instruktionsausführung durch Angabe der Verzögerungszeit in Nanosekunden. Dabei werden maximal 4 Instruktionen erzeugt. Taktgenau bedeutet, dass auf die nächste volle Anzahl von Takten aufgerundet wird. Beispiel: 75ns bei 20MHZ (50ns Taktzeit) bedeutet eine tatsächliche Verzögerung von 2 Zyklen und entspricht 100ns. Die Variable Osc_Hz muss der verwendeten Taktquelle angepasst werden und definiert die CPU-Taktfrequenz in Hertz. wait_ns wird mit folgenden Parametern aufgerufen: 1. Verzögerungszeit in Nanosekunden 2. bereits verbrauchte Takte 3. ein Immediate-Register (R16-R31) als Zähler Bereits verbrauchte Takte werden aus den Instruktionen errechnet, die zwischen den zu verzögernden Ereignissen liegen. Beispiel:
In diesem Fall besteht die Anzahl der verbrauchten Takte lediglich aus den Instruktionen, die zum Ereignis führen. Am Ende von SBI wird die steigende Flanke, am Ende von CBI die fallende Flanke des Signals erzeugt. Wenn wir also möglichst exakt eine Pulsbreite von einer Mikrosekunde erzeugen wollen, müssen wir die Ausführungszeit von CBI von unserer Wartezeit abziehen. Die Ausführung von CBI liegt vor dem Ereignis! Wenn die Verzögerungszeit kleiner als die Anzahl bereits verbrauchter Taktzyklen ist, wird keine weitere Verzögerung erzeugt. Die maximale Verzögerung ist 767 Takte entsprechend 38350ns bei 20MHZ. Bei niedrigeren Frequenzen wird eine längere Verzögerung erreicht, allerdings nimmt dann auch die Genauigkeit der Verzögerung ab (exakt bis +1 Takt).
[Bearbeiten] Strukturierte Programmierung[Bearbeiten] SAM (Structured Assembly Macros)von Klaus2m5 SAM unterstützt strukturiertes Programmieren durch If-Then-Else und Do-Loop Makros. Beliebige Verschachtelung und Mehrfachbedingungen sind möglich. Läuft unter aktuellen Versionen von AVRASM2. Einige Beispiele: Verschachteltes If-Then-Else
Mehr Beispiele und das SAM-include als Download. |