Difference between revisions of "AVR Programming/de"
Line 28: | Line 28: | ||
In diesem Beispielen sieht man, das die Label anders als bei Intel deklariert werden. Der Labelbezeichner muss mit '''.L'''xxx beginnen. | In diesem Beispielen sieht man, das die Label anders als bei Intel deklariert werden. Der Labelbezeichner muss mit '''.L'''xxx beginnen. | ||
− | Assemblerblock: | + | ===Assemblerblock:=== |
<syntaxhighlight lang="pascal"> | <syntaxhighlight lang="pascal"> | ||
procedure MyAsmProc; | procedure MyAsmProc; | ||
Line 40: | Line 40: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | Komplette Assembler Procedure: | + | ===Komplette Assembler Procedure:=== |
<syntaxhighlight lang="pascal"> | <syntaxhighlight lang="pascal"> | ||
procedure MyAsmProc; assembler; | procedure MyAsmProc; assembler; | ||
Line 50: | Line 50: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | Falsche | + | ===Ungültiges Label=== |
+ | Falsche Bezeichnung, das es nicht mit '''.L''' beginnt. | ||
<syntaxhighlight lang="pascal"> | <syntaxhighlight lang="pascal"> | ||
asm | asm | ||
Line 57: | Line 58: | ||
end, | end, | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | |||
+ | ===Einfacher Blinker in Assembler:=== | ||
+ | <syntaxhighlight lang="pascal"> | ||
+ | program Project1; | ||
+ | begin | ||
+ | asm | ||
+ | sbi 4, 5 // DDRD, Pin5 --> Output | ||
+ | |||
+ | // --- Hauptschleife | ||
+ | .Lloop: | ||
+ | sbi 5, 5 // PORTD, Pin5 --> On | ||
+ | ldi r20, 50 // 50ms | ||
+ | call .LDelay // Delay | ||
+ | |||
+ | cbi 5, 5 // PORTD, Pin5 --> Off | ||
+ | ldi r20, 250 // 250ms | ||
+ | call .LDelay // Delay | ||
+ | jmp .Lloop | ||
+ | |||
+ | // --- Delay | ||
+ | .LDelay: | ||
+ | .L1: | ||
+ | ldi r21, 16 // 16MHz | ||
+ | .L2: | ||
+ | ldi r22, 250 | ||
+ | .L3: | ||
+ | nop | ||
+ | dec r22 | ||
+ | brne .L3 | ||
+ | dec r21 | ||
+ | brne .L2 | ||
+ | dec r20 | ||
+ | brne .L1 | ||
+ | ret | ||
+ | end; | ||
+ | end.</syntaxhighlight> | ||
== Siehe auch == | == Siehe auch == |
Revision as of 22:42, 1 March 2018
Wichtige Hinweise zu AVR-Programmierung
Generell geht alles nicht, was dynamisch ist, zB. Classen, dynamische Arrays, dynamische Strings.
Integer
Die Integer sind nur 16Bit gross, somit wird nur ein Bereich von -32'768 bis +32'767 abgedeckt. Ansonsten muss man einen LongInt oder int32 nehmen.
Classen
Classen gehen nicht auf einem AVR, alternativ Object nehmen.
Fliesskommazahlen
Fliesskommazahlen sollten wen möglich vermieden werden, da der AVR dies Hardwaremässig nicht unterstützt.
String
AVR unterstützen nur ShortString, dies muss mit folgendem Compilerschalter eingestellt werden.
{$H-}
Oder man deklariert den String so:
var
s : String[123];
Assembler
Bei AVR ist auch Inline-Assembler möglich, dies funktioniert gleich, wie auf dem PC, der grosse Unterschied ist, das man AVR-Assembler verwenden muss.
In diesem Beispielen sieht man, das die Label anders als bei Intel deklariert werden. Der Labelbezeichner muss mit .Lxxx beginnen.
Assemblerblock:
procedure MyAsmProc;
begin
asm
.L2:
nop
jmp .L2
end;
end;
Komplette Assembler Procedure:
procedure MyAsmProc; assembler;
asm
.L2:
nop
jmp .L2
end;
Ungültiges Label
Falsche Bezeichnung, das es nicht mit .L beginnt.
asm
.ABC: // Syntax-Fehler !
...
end,
Einfacher Blinker in Assembler:
program Project1;
begin
asm
sbi 4, 5 // DDRD, Pin5 --> Output
// --- Hauptschleife
.Lloop:
sbi 5, 5 // PORTD, Pin5 --> On
ldi r20, 50 // 50ms
call .LDelay // Delay
cbi 5, 5 // PORTD, Pin5 --> Off
ldi r20, 250 // 250ms
call .LDelay // Delay
jmp .Lloop
// --- Delay
.LDelay:
.L1:
ldi r21, 16 // 16MHz
.L2:
ldi r22, 250
.L3:
nop
dec r22
brne .L3
dec r21
brne .L2
dec r20
brne .L1
ret
end;
end.
Siehe auch
- Übersichtseite AVR Embedded Tutorial
Autor: Mathias