AVR Programming/de
│
Deutsch (de) │
English (en) │
Wichtige Hinweise zu AVR-Programmierung
Generell geht alles nicht, was dynamisch ist, zB. Classen, dynamische Arrays, dynamische Strings.
Integer
Der Standard-Integer ist nur 16Bit gross, somit wird nur ein Bereich von -32'768 bis +32'767 abgedeckt. Ansonsten muss man einen LongInt oder int32/uint32 nehmen.
shl
Da kleine Konstanten als 8Bit-Wert angenommen, gibt es beim Shiften mit einer Variable wen sie grösser 8 einen Überlauf.
Als Abhilfe eine Typenumwandlung durchführen.
Beim Shiften mit einer Konstante wird automatisch ein 16Bit-Wert angenommen.
</syntaxhighlight>
var
b: UInt8 i: UInt16;
... begin
b := 8; i := 1 shl b; // i = 0 i := UInt16(1) shl b; // i = 255 i := 1 shl 8; // i = 255
==Array==
Es ist '''keine''' dynamische Array erlaubt.
==Classen==
'''Classen''' gehen nicht auf einem AVR, alternativ '''Object''' nehmen.
==Fliesskommazahlen==
Werden von FPC nicht unterstützt. Stand: 21.05.2018<br>
AVR unterstützt Fliesskommazahlen Hardwaremässig '''nicht'''.<br>Mit Arduino/AVR C++, kann man mit '''float''' rechnen, aber dies wird Softwaremässig emuliert. Ein '''double''' ist dort gleich wie ein '''float''', beide in 16Bit breite.
==Rechnen mit Operatoren==
Der AVR ist ein schlechter Rechenknecht. Rechnen kann er nur mit Ganzzahlen.<br>
Die folgende Tabelle zeigt, was der AVR Hardwaremässig kann, alles andere muss der Compiler auf Softwarebasis emulieren.<br>
Als Beispiel '''3 * 4''' setzt der Compiler beim ATtiny etwa so um '''4 + 4 + 4'''. Bei gösseren Zahlen wird dies sehr langsam !
{| class="wikitable"
|-
!Operator !! ATtiny !! ATmega
|-
|style="text-align:center"|+ || Hardware || Hardware
|-
|style="text-align:center"|- || Hardware || Hardware
|-
|style="text-align:center"|* || Software || Hardware
|-
|style="text-align:center"|/ || Software || Software
|-
|}
Shift-Operatoren, wie '''shl''' und '''shr''' werden hervorragend unterstützt.
==String==
AVR unterstützen nur '''ShortString''', dies muss mit folgendem Compilerschalter eingestellt werden.
<syntaxhighlight>
{$H-} // String = ShortString
Oder man deklariert den String so:
var
s0: String[100]; // Stringlänge 100 Zeichen.
s2: ShortString; // Stringlänge 255 Zeichen.
Plattform-Abfrag
Bei einem auf mehreren Plattformen gebrauchten Code, kann man abfragen, ob es sich um einen AVR handelt.
{$ifdef cpuavr}
UCSR0A := (0 shl U2X0); // Wird nur bei AVR berücksichtigt.
{$endif}
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