Sign in Join
Wiki copytemporary

AVR Programming/de: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: AVR Programming/de

OldNewLine
1+# Wichtige Hinweise zu AVR-Programmierung
2+
3+Generell geht alles **nicht**, was dynamisch ist, zB. Classen, dynamische Arrays, dynamische Strings.
4+
5+## Integer
6+
7+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.
8+
9+## Shiften
10+
11+Da kleine Konstanten als 8Bit-Wert angenommen, gibt es beim Shiften mit einer Variable wen sie grösser 8 ist einen Überlauf. ( Stand: 26 Juli 2018 )\
12+Als Abhilfe eine Typenumwandlung durchführen.\
13+Beim Shiften mit einer Konstante wird automatisch ein 16Bit-Wert angenommen.
14+
15+``` pascal
16+var
17+ b: UInt8
18+ i: UInt16;
19+...
20+begin
21+ b := 8;
22+ i := 1 shl b; // i = 0 Überlauf
23+ i := UInt16(1) shl b; // i = 255 io.
24+ i := 1 shl 8; // i = 255 io.
25+```
26+
27+## Array
28+
29+Es ist **keine** dynamische Array erlaubt.
30+
31+## Classen
32+
33+**Classen** gehen nicht auf einem AVR, alternativ **Object** nehmen.
34+
35+## Fliesskommazahlen
36+
37+Werden von FPC nicht unterstützt. Stand: 21.05.2018\
38+AVR unterstützt Fliesskommazahlen Hardwaremässig **nicht**.\
39+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.\
40+
41+### Problem umgehen
42+
43+Das Problem kann man umzugehen, wen man mit improvisierten Festkommazahlen rechnet.
44+
45+Oder man nimmt eine andere Einheit. Als Beispiel ein Thermometer mit 1/10°. Man rechnet dabei mit 1/10°, anstelle mit ganzen Grad.\
46+Den Dezimalpunkt setzt man dann erst bei der Ausgabe, wen man die Zahl in einen String umwandelt.
47+
48+**Hinweis:** Es wird nicht auf Überlauf getestet.
49+
50+Die Anzeige geht dann von 00.0 bis 99.9 .
51+
52+``` pascal
53+var
54+ Digit: String[4];
55+
56+ // Erlaubte Werte fuer val: 0..999
57+ procedure IntToDigit(val: UInt16);
58+ var
59+ achr: byte;
60+ begin
61+ Digit[0] := #4; // Der String ist 4 Zeichen lang, inklusive Dezimalpunkt.
62+
63+ // Zehner
64+ achr := 0;
65+ while (val >= 100) do begin
66+ Dec(val, 100);
67+ Inc(achr);
68+ end;
69+ if achr=0 then begin
70+ Digit[1] := Char(32); //32 dezimal ist [SPACE] in Ascii Tabelle
71+ end else begin
72+ Digit[1] := Char(achr + 48);
73+ end;
74+
75+ // Einer
76+ achr := 0;
77+ while (val >= 10) do begin
78+ Dec(val, 10);
79+ Inc(achr);
80+ end;
81+ Digit[2] := Char(achr + 48);
82+
83+ // Dezimalpunkt
84+ Digit[3] := '.';
85+
86+ // Zehntel
87+ achr := 0;
88+ while (val >= 1) do begin
89+ Dec(val);
90+ Inc(achr);
91+ end;
92+ Digit[4] := Char(achr + 48);
93+ end;
94+
95+/*
96+IntToDigit(0); // Digit --> " 0.0"
97+IntToDigit(4); // Digit --> " 0.4"
98+IntToDigit(44); // Digit --> " 4.4"
99+IntToDigit(444); // Digit --> "44.4"
100+IntToDigit(999); // Digit --> "99.9"
101+*/
102+```
103+
104+Siehe auch:
105+
106+- [[AVR Embedded Tutorial - Int to digits/de|Ausgabe auf Digits (7 Segmentanzeige)]]
107+
108+## Rechnen mit Operatoren
109+
110+Der AVR ist ein schlechter Rechenknecht. Rechnen kann er nur mit Ganzzahlen.\
111+Die folgende Tabelle zeigt, was der AVR Hardwaremässig kann, alles andere muss der Compiler auf Softwarebasis emulieren.\
112+Als Beispiel **3 * 4** setzt der Compiler beim ATtiny etwa so um **4 + 4 + 4**. Bei gösseren Zahlen wird dies sehr langsam !
113+
114+| Operator | ATtiny | ATmega |
115+|----------|----------|----------|
116+| \+ | Hardware | Hardware |
117+| \- | Hardware | Hardware |
118+| * | Software | Hardware |
119+| / | Software | Software |
120+| | | |
121+
122+Shift-Operatoren, wie **shl** und **shr** werden hervorragend unterstützt.
123+
124+## String
125+
126+AVR unterstützen nur **ShortString**, dies muss mit folgendem Compilerschalter eingestellt werden.
127+
128+``` pascal
129+{$H-} // String = ShortString
130+```
131+
132+Oder man deklariert den String so:
133+
134+``` pascal
135+var
136+ s0: String[100]; // Stringlänge 100 Zeichen.
137+ s2: ShortString; // Stringlänge 255 Zeichen.
138+```
139+
140+Hinweis: Strings brauchen sehr viel Platz. So etwas **verbraucht 256 Byte !!**. Ein ATTiny2313 ist dabei überfordert.
141+
142+``` pascal
143+var
144+ s: ShortString = 'Hallo'; // Verbraucht 256 Byte !
145+```
146+
147+Deshalb immer die maximale Länge vorgeben.
148+
149+``` pascal
150+var
151+ s: String[10] = 'Hallo'; // Braucht 11 Byte
152+```
153+
154+## Plattform-Abfrag
155+
156+Bei einem auf mehreren Plattformen gebrauchten Code, kann man abfragen, ob es sich um einen **AVR** handelt.
157+
158+``` pascal
159+ {$ifdef cpuavr}
160+ UCSR0A := (0 shl U2X0); // Wird nur bei AVR berücksichtigt.
161+ {$endif}
162+```
163+
164+## Assembler
165+
166+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.\
167+In diesem Beispielen sieht man, das die Label anders als bei Intel deklariert werden. Der Labelbezeichner muss mit **.L**xxx beginnen.
168+
169+### Assemblerblock:
170+
171+``` pascal
172+procedure MyAsmProc;
173+begin
174+ asm
175+ .L2:
176+ nop
177+ jmp .L2
178+ end;
179+end;
180+```
181+
182+### Komplette Assembler Procedure:
183+
184+``` pascal
185+procedure MyAsmProc; assembler;
186+asm
187+ .L2:
188+ nop
189+ jmp .L2
190+end;
191+```
192+
193+### Ungültiges Label
194+
195+Falsche Bezeichnung, das es nicht mit **.L** beginnt.
196+
197+``` pascal
198+asm
199+ .ABC: // Syntax-Fehler !
200+ ...
201+end,
202+```
203+
204+### Einfacher Blinker in Assembler:
205+
206+``` pascal
207+program Project1;
208+begin
209+ asm
210+ sbi 4, 5 // DDRD, Pin5 --> Output
211+
212+// --- Hauptschleife
213+ .Lloop:
214+ sbi 5, 5 // PORTD, Pin5 --> On
215+ ldi r20, 50 // 50ms
216+ call .LDelay // Delay
217+
218+ cbi 5, 5 // PORTD, Pin5 --> Off
219+ ldi r20, 250 // 250ms
220+ call .LDelay // Delay
221+ jmp .Lloop
222+
223+// --- Delay
224+ .LDelay:
225+ .L1:
226+ ldi r21, 16 // 16MHz
227+ .L2:
228+ ldi r22, 250
229+ .L3:
230+ nop
231+ dec r22
232+ brne .L3
233+ dec r21
234+ brne .L2
235+ dec r20
236+ brne .L1
237+ ret
238+ end;
239+end.
240+```
241+
242+## Siehe auch
243+
244+- Übersichtseite [[AVR Embedded Tutorial/de|AVR Embedded Tutorial]]
245+
246+Autor: Mathias
247+
248+---
249+*From the Free Pascal wiki, page "AVR Programming/de", as it stood on 2020-06-10 after a change by Mathias, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history