···63636464Ein DataFrame kann ähnlich wie eine Series erstellt werden. Dabei kann man eine Vielzahl an verschiedenen Objekttypen übergeben.
65656666-- **Dictionary**
6767- In diesem Fall hat der Input für das DataFrame den Typen `Dictionary`, dessen Schlüssel ein String und dessen Wert eine Liste ist.
6666+- **Dictionary**
6767+ In diesem Fall hat der Input für das DataFrame den Typen `Dictionary`, dessen Schlüssel ein String und dessen Wert eine Liste ist.
68686969- ```python
7070- data = {
7171- 'A': [1, 2, 3, 4],
7272- 'B': [5, 6, 7, 8],
7373- 'C': [9, 10, 11, 12]
7474- }
7575- df = pd.DataFrame(data, index=["I","II","III","IV"])
7676- ```
6969+ ```python
7070+ data = {
7171+ 'A': [1, 2, 3, 4],
7272+ 'B': [5, 6, 7, 8],
7373+ 'C': [9, 10, 11, 12]
7474+ }
7575+ df = pd.DataFrame(data, index=["I","II","III","IV"])
7676+ ```
77777878-- **Liste**
7979- In diesem Fall hat der Input für das DataFrame den Typen einer Liste, in welcher sich mehrere Dictionaries befinden.
7878+- **Liste**
7979+ In diesem Fall hat der Input für das DataFrame den Typen einer Liste, in welcher sich mehrere Dictionaries befinden.
80808181- ```python
8282- data = [{'A': 1, 'B': 5, 'C': 9},
8383- {'A': 2, 'B': 6, 'C': 10},
8484- {'A': 3, 'B': 7, 'C': 11},
8585- {'A': 4, 'B': 8, 'C': 12}]
8686- df = pd.DataFrame(data, index=["I","II","III","IV"])
8787- ```
8181+ ```python
8282+ data = [{'A': 1, 'B': 5, 'C': 9},
8383+ {'A': 2, 'B': 6, 'C': 10},
8484+ {'A': 3, 'B': 7, 'C': 11},
8585+ {'A': 4, 'B': 8, 'C': 12}]
8686+ df = pd.DataFrame(data, index=["I","II","III","IV"])
8787+ ```
88888989-- **Tuple**
9090- In diesem Fall hat der Input für das DataFrame den Typen einer Liste, mit mehreren Tuples darin. Man beachte, dass die Spaltennamen beim instantiieren des DataFrames angegeben werden müssen, da `data` selbst keine Informationen darüber enthält.
8989+- **Tuple**
9090+ In diesem Fall hat der Input für das DataFrame den Typen einer Liste, mit mehreren Tuples darin. Man beachte, dass die Spaltennamen beim instantiieren des DataFrames angegeben werden müssen, da `data` selbst keine Informationen darüber enthält.
91919292- ```python
9393- data = [(1, 5, 9),
9494- (2, 6, 10),
9595- (3, 7, 11),
9696- (4, 8, 12)]
9797- df = pd.DataFrame(data, columns=['A', 'B', 'C'], index=["I","II","III","IV"])
9898- ```
9292+ ```python
9393+ data = [(1, 5, 9),
9494+ (2, 6, 10),
9595+ (3, 7, 11),
9696+ (4, 8, 12)]
9797+ df = pd.DataFrame(data, columns=['A', 'B', 'C'], index=["I","II","III","IV"])
9898+ ```
9999100100-- **NumPy**
101101- Man kann ein DataFrame auch mithilfe von einem Numpy-`Array` erstellen.
100100+- **NumPy**
101101+ Man kann ein DataFrame auch mithilfe von einem Numpy-`Array` erstellen.
102102103103- ```python
104104- import numpy as np
105105- data = np.array([[1, 5, 9],
106106- [2, 6, 10],
107107- [3, 7, 11],
108108- [4, 8, 12]])
109109- df = pd.DataFrame(data, columns=['A', 'B', 'C'], index=["I","II","III","IV"])
110110- ```
103103+ ```python
104104+ import numpy as np
105105+ data = np.array([[1, 5, 9],
106106+ [2, 6, 10],
107107+ [3, 7, 11],
108108+ [4, 8, 12]])
109109+ df = pd.DataFrame(data, columns=['A', 'B', 'C'], index=["I","II","III","IV"])
110110+ ```
111111112112-- **CSV**
113113- Man kann ein DataFrame auch mithilfe einer CSV-Datei erstellen. Dies kommt in der Praxis sehr häufig vor, da CSV-Dateien häufig als Eingabe für Analyseprogramme verwendet werden. Hierbei kann man auch angeben, dass eine Bestimmte Spalte Informationen bezüglich der Indizes enthält.
112112+- **CSV**
113113+ Man kann ein DataFrame auch mithilfe einer CSV-Datei erstellen. Dies kommt in der Praxis sehr häufig vor, da CSV-Dateien häufig als Eingabe für Analyseprogramme verwendet werden. Hierbei kann man auch angeben, dass eine Bestimmte Spalte Informationen bezüglich der Indizes enthält.
114114115115- ```csv
116116- //file.csv
117117- ,A,B,C
118118- I,1,5,9
119119- II,2,6,10
120120- III,3,7,11
121121- IV,4,8,12
122122- ```
115115+ ```csv
116116+ //file.csv
117117+ ,A,B,C
118118+ I,1,5,9
119119+ II,2,6,10
120120+ III,3,7,11
121121+ IV,4,8,12
122122+ ```
123123124124- ```python
125125- df = pd.read_csv('file.csv', index_col=0) # Beispiel für das Lesen aus einer CSV-Datei
126126- ```
124124+ ```python
125125+ df = pd.read_csv('file.csv', index_col=0) # Beispiel für das Lesen aus einer CSV-Datei
126126+ ```
127127128128-- **JSON**
129129- Natürlich kann das Datenformat auch JSON sein:
128128+- **JSON**
129129+ Natürlich kann das Datenformat auch JSON sein:
130130131131- ```json
132132- //file.json
133133- {
134134- "A": { "I": 1, "II": 2, "III": 3, "IV": 4 },
135135- "B": { "I": 5, "II": 6, "III": 7, "IV": 8 },
136136- "C": { "I": 9, "II": 10, "III": 11, "IV": 12 }
137137- }
138138- ```
131131+ ```json
132132+ //file.json
133133+ {
134134+ "A": { "I": 1, "II": 2, "III": 3, "IV": 4 },
135135+ "B": { "I": 5, "II": 6, "III": 7, "IV": 8 },
136136+ "C": { "I": 9, "II": 10, "III": 11, "IV": 12 }
137137+ }
138138+ ```
139139140140- ```python
141141- df = pd.read_json('file.json') # Beispiel für das Lesen aus einer JSON-Datei
142142- ```
140140+ ```python
141141+ df = pd.read_json('file.json') # Beispiel für das Lesen aus einer JSON-Datei
142142+ ```
143143144144-- **SQL-Datenbank**
145145- Man kann auch direkt aus einer SQL-Datenbank lesen. In diesem Fall muss man zunächst eine Verbindung mit der Datenbank herstellen.
144144+- **SQL-Datenbank**
145145+ Man kann auch direkt aus einer SQL-Datenbank lesen. In diesem Fall muss man zunächst eine Verbindung mit der Datenbank herstellen.
146146147147- ```bash title="Installing sqlite3"
148148- pip install pysqlite3
149149- ```
147147+ ```bash title="Installing sqlite3"
148148+ pip install pysqlite3
149149+ ```
150150151151- ```python
152152- import sqlite3
153153- con = sqlite3.connect("database.db")
151151+ ```python
152152+ import sqlite3
153153+ con = sqlite3.connect("database.db")
154154155155- df = pd.read_sql_query("SELECT * FROM examples", con)
156156- ```
155155+ df = pd.read_sql_query("SELECT * FROM examples", con)
156156+ ```
157157158158In allen Fällen sieht das DataFrame in diesem Beispiel zum Schluss so aus:
159159···170170171171Um ein DataFrame persistieren zu können, kann man die Daten in eine Datei oder Datenbank speichern. Dabei werden die Formate `CSV` und `JSON` am häufigsten verwendet, weswegen die Integration mit Pandas einfacher denn je ist.
172172173173-- **CSV**
173173+- **CSV**
174174175175- ```python
176176- df.to_csv('example.csv')
177177- ```
175175+ ```python
176176+ df.to_csv('example.csv')
177177+ ```
178178179179-- **JSON**
179179+- **JSON**
180180181181- ```python
182182- df.to_json('example.json')
183183- ```
181181+ ```python
182182+ df.to_json('example.json')
183183+ ```
184184185185-- **SQL**
186186- ```python
187187- df.to_sql('example.sql', con)
188188- ```
185185+- **SQL**
186186+ ```python
187187+ df.to_sql('example.sql', con)
188188+ ```
189189190190#### Zugriff auf Daten
191191192192Bei einem DataFrame ist der Zugriff auf die Daten nun ein wenig anders, da ein DataFrame quasi eine Liste von Series ist.
193193194194-- Zugriff auf bestimmte **Spalten**
195195- Um auf eine Spalte zuzugreifen, können diese Möglichkeiten verwendet werden:
194194+- Zugriff auf bestimmte **Spalten**
195195+ Um auf eine Spalte zuzugreifen, können diese Möglichkeiten verwendet werden:
196196197197- ```python
198198- print(df.A) # Property A
199199- print(df['A']) # Spalte A
200200- print(df.loc[:, 'A']) # Spalte A; alle Zeilen
201201- print(df.iloc[:, 0]) # Spalte Index 0; alle Zeilen
202202- ```
197197+ ```python
198198+ print(df.A) # Property A
199199+ print(df['A']) # Spalte A
200200+ print(df.loc[:, 'A']) # Spalte A; alle Zeilen
201201+ print(df.iloc[:, 0]) # Spalte Index 0; alle Zeilen
202202+ ```
203203204204- Um auf mehrere Spalten zuzugreifen, können diese Möglichkeiten verwendet werden:
204204+ Um auf mehrere Spalten zuzugreifen, können diese Möglichkeiten verwendet werden:
205205206206- ```python
207207- print(df[['A', 'B']]) # Spalten A & B
208208- print(df.loc[:, ['A', 'B']]) # Spalten A & B; alle Zeilen
209209- print(df.iloc[:, [0, 1]]) # Spalten Indizes 0 & 1; alle Zeilen
210210- print(df.iloc[:, 0:2]) # Spalten Indizes 0 bis 1; alle Zeilen
211211- print(df.iloc[:, :2]) # Spalten Indizes bis 1; alle Zeilen
212212- print(df.iloc[:, :-1]) # Spalten Indizes bis vorletzte Spalte; alle Zeilen
213213- ```
206206+ ```python
207207+ print(df[['A', 'B']]) # Spalten A & B
208208+ print(df.loc[:, ['A', 'B']]) # Spalten A & B; alle Zeilen
209209+ print(df.iloc[:, [0, 1]]) # Spalten Indizes 0 & 1; alle Zeilen
210210+ print(df.iloc[:, 0:2]) # Spalten Indizes 0 bis 1; alle Zeilen
211211+ print(df.iloc[:, :2]) # Spalten Indizes bis 1; alle Zeilen
212212+ print(df.iloc[:, :-1]) # Spalten Indizes bis vorletzte Spalte; alle Zeilen
213213+ ```
214214215215-- Zugriff auf bestimmte **Zeilen**
216216- Um auf eine Zeile zuzugreifen, können diese Möglichkeiten verwendet werden:
215215+- Zugriff auf bestimmte **Zeilen**
216216+ Um auf eine Zeile zuzugreifen, können diese Möglichkeiten verwendet werden:
217217218218- ```python
219219- print(df.loc["I"]) # Zeile I
220220- print(df.iloc[0]) # Zeile Index 0
221221- ```
218218+ ```python
219219+ print(df.loc["I"]) # Zeile I
220220+ print(df.iloc[0]) # Zeile Index 0
221221+ ```
222222223223- Um auf mehrere Zeilen zuzugreifen, können diese Möglichkeiten verwendet werden:
223223+ Um auf mehrere Zeilen zuzugreifen, können diese Möglichkeiten verwendet werden:
224224225225- ```python
226226- print(df.loc[["I", "II"]]) # Zeilen I & II
227227- print(df.iloc[[0, 1]]) # Zeilen Indizes 0 & 1
228228- print(df.iloc[0:2]) # Zeilen Indizes 0 bis 1
229229- print(df.iloc[:2]) # Zeilen Indizes bis 1
230230- print(df.iloc[:-2]) # Zeilen Indizes bis vorvorletzte Zeile
231231- ```
225225+ ```python
226226+ print(df.loc[["I", "II"]]) # Zeilen I & II
227227+ print(df.iloc[[0, 1]]) # Zeilen Indizes 0 & 1
228228+ print(df.iloc[0:2]) # Zeilen Indizes 0 bis 1
229229+ print(df.iloc[:2]) # Zeilen Indizes bis 1
230230+ print(df.iloc[:-2]) # Zeilen Indizes bis vorvorletzte Zeile
231231+ ```
232232233233-- Zugriff auf bestimmte **Zellen**
234234- Um auf eine Zelle zuzugreifen, können diese Möglichkeiten verwendet werden:
233233+- Zugriff auf bestimmte **Zellen**
234234+ Um auf eine Zelle zuzugreifen, können diese Möglichkeiten verwendet werden:
235235236236- ```python
237237- print(df.loc["I", 'A']) # Zeile I; Spalte A
238238- print(df.iloc[0, 0]) # Zeile Index 0; Spalte Index 0
239239- ```
236236+ ```python
237237+ print(df.loc["I", 'A']) # Zeile I; Spalte A
238238+ print(df.iloc[0, 0]) # Zeile Index 0; Spalte Index 0
239239+ ```
240240241241- Um auf mehrere Zellen zuzugreifen, können diese Möglichkeiten verwendet werden (bei `iloc()` sind die Angaben jeweils `inklusiv:exklusiv`):
241241+ Um auf mehrere Zellen zuzugreifen, können diese Möglichkeiten verwendet werden (bei `iloc()` sind die Angaben jeweils `inklusiv:exklusiv`):
242242243243- ```python
244244- print(df.loc[["I","II","III"], ['A','B']]) # Zeilen I, II & III; Spalten A & B
245245- print(df.loc["I":"III", 'A':'B']) # Zeilen I bis III; Spalten A bis B
246246- print(df.iloc[0:3, 0:2]) # Zeilen Indizes 0 bis 2; Spalten Indizes 0 bis 1
247247- print(df.iloc[:3, :2]) # Zeilen Indizes bis 2; Spalten Indizes bis 1
248248- print(df.iloc[:-1, :-1]) # Zeilen Indizes bis vorletzte Zeile; Spalten Indizes bis vorletzte Spalte
249249- ```
243243+ ```python
244244+ print(df.loc[["I","II","III"], ['A','B']]) # Zeilen I, II & III; Spalten A & B
245245+ print(df.loc["I":"III", 'A':'B']) # Zeilen I bis III; Spalten A bis B
246246+ print(df.iloc[0:3, 0:2]) # Zeilen Indizes 0 bis 2; Spalten Indizes 0 bis 1
247247+ print(df.iloc[:3, :2]) # Zeilen Indizes bis 2; Spalten Indizes bis 1
248248+ print(df.iloc[:-1, :-1]) # Zeilen Indizes bis vorletzte Zeile; Spalten Indizes bis vorletzte Spalte
249249+ ```
250250251251-- Zugriff mittels **Bedingungen**
252252- Die Daten eines DataFrames können mithilfe von Bedingungen auch gefiltert werden:
251251+- Zugriff mittels **Bedingungen**
252252+ Die Daten eines DataFrames können mithilfe von Bedingungen auch gefiltert werden:
253253254254- ```python
255255- # Alle Zeilen, dessen Wert in Spalte 'A' größer 2 ist
256256- print(df[df['A'] > 2])
254254+ ```python
255255+ # Alle Zeilen, dessen Wert in Spalte 'A' größer 2 ist
256256+ print(df[df['A'] > 2])
257257258258- """
259259- A B C
260260- III 3 7 11
261261- IV 4 8 12
262262- """
263263- ```
258258+ """
259259+ A B C
260260+ III 3 7 11
261261+ IV 4 8 12
262262+ """
263263+ ```
264264265265- ```python
266266- # Alle Series 'A', dessen Wert größer 2 ist
267267- print(df.loc[df['A'] > 2, 'A'])
265265+ ```python
266266+ # Alle Series 'A', dessen Wert größer 2 ist
267267+ print(df.loc[df['A'] > 2, 'A'])
268268269269- """
270270- III 3
271271- IV 4
272272- """
273273- ```
269269+ """
270270+ III 3
271271+ IV 4
272272+ """
273273+ ```
274274275275- Diese Bedingungen funktieren nur, weil die Bedingung eine Series selbst ist und somit die Berechnung pro Zeile durchgeführt werden.
275275+ Diese Bedingungen funktieren nur, weil die Bedingung eine Series selbst ist und somit die Berechnung pro Zeile durchgeführt werden.
276276277277- ```python
278278- df['A'] > 2
277277+ ```python
278278+ df['A'] > 2
279279280280- """
281281- I False
282282- II False
283283- III True
284284- IV True
285285- Name: A, dtype: bool
286286- """
287287- ```
280280+ """
281281+ I False
282282+ II False
283283+ III True
284284+ IV True
285285+ Name: A, dtype: bool
286286+ """
287287+ ```
288288289289## Operationen und Methoden
290290291291Pandas bietet eine Vielzahl von Methoden und Operationen zur Datenanalyse und -manipulation. Alle Methoden, welche die Daten des DataFrames verändern, verfügen über zwei Möglichkeiten, die Änderungen zu speichern:
292292293293-- **Überschreiben**
294294- Einerseits kann man die alten Daten einfach überschreiben, indem man das DataFrame auf die neuen Daten setzt:
293293+- **Überschreiben**
294294+ Einerseits kann man die alten Daten einfach überschreiben, indem man das DataFrame auf die neuen Daten setzt:
295295296296- ```python
297297- df = df.dropna()
298298- ```
296296+ ```python
297297+ df = df.dropna()
298298+ ```
299299300300- Im Hintergrund wird der Parameter `inplace` der Methode auf `False` gesetzt und die neuen Daten werden einfach returniert.
300300+ Im Hintergrund wird der Parameter `inplace` der Methode auf `False` gesetzt und die neuen Daten werden einfach returniert.
301301302302- ```python
303303- df.dropna(inplace=False) # dieser Aufruf gibt das DataFrame zurück
304304- ```
302302+ ```python
303303+ df.dropna(inplace=False) # dieser Aufruf gibt das DataFrame zurück
304304+ ```
305305306306-- **Inplace**
307307- Die elegantere Variante ist jedoch die Verwendung der `inplace`-Option, welche die Änderungen direkt in dem DataFrame speichert:
306306+- **Inplace**
307307+ Die elegantere Variante ist jedoch die Verwendung der `inplace`-Option, welche die Änderungen direkt in dem DataFrame speichert:
308308309309- ```python
310310- df.dropna(inplace=True)
311311- ```
309309+ ```python
310310+ df.dropna(inplace=True)
311311+ ```
312312313313- Wichtig zu beachten ist, dass beim positiven Setzen des `inplace`-Parameters kein DataFrame mehr zurückgegeben wird. Stattdessen returniert dieser Aufruf nun `None`.
313313+ Wichtig zu beachten ist, dass beim positiven Setzen des `inplace`-Parameters kein DataFrame mehr zurückgegeben wird. Stattdessen returniert dieser Aufruf nun `None`.
314314315315### `head()`
316316···356356357357Dabei ist die Reihenfolge der Anzahl an Dimensionen gleich der aufsteigenden Achsenzahl. In unserem Beispiel bedeutet das, wir haben vier Zeilen und drei Spalten, weil Achse 0 die Zeilen sind und Achse 1 die Spalten.
358358359359-Die erste Zahl ist in den meisten Fällen der künstlichen Intelligenz die Anzahl an Beispielen. In unserem Fall gibt uns die zweite Zahl Auskunft über die Anzahl an Features (Eigenschaften) jedes Beispiels. Beim [`Supervised Learning`](#supervised-learning) ist die letzte Spalte meistens die Antwort des Beispiels, weshalb es auch nur zwei Features sein könnten.
359359+Die erste Zahl ist in den meisten Fällen der künstlichen Intelligenz die Anzahl an Beispielen. In unserem Fall gibt uns die zweite Zahl Auskunft über die Anzahl an Features (Eigenschaften) jedes Beispiels. Beim [`Supervised Learning`](/de/artificial-intelligence/supervised-learning) ist die letzte Spalte meistens die Antwort des Beispiels, weshalb es auch nur zwei Features sein könnten.
360360361361### `columns`
362362···469469470470### `isnull()`
471471472472-Die Methode `isnull` gibt ein DataFrame mit boolischen Werte zurück, welche Auskunft über die fehlenden Werte eines DataFrames geben. Mithilfe der [`sum`-Methode](#aggregationsfunktionen) kann man dadurch wichtige Informationen des DataFrames extrahieren.
472472+Die Methode `isnull` gibt ein DataFrame mit boolischen Werte zurück, welche Auskunft über die fehlenden Werte eines DataFrames geben. Mithilfe der [`sum`-Methode](/de/artificial-intelligence/numpy#aggregationsfunktionen) kann man dadurch wichtige Informationen des DataFrames extrahieren.
473473474474```python ins="NaN"
475475"""
···57575858### Vektorisieren
59596060-Beim maschinellen Lernens wird die Vektorisierung der Daten als wichtiger Schritt betrachtet. Die Vektorisierung ist ein Prozess, bei dem die Daten in Form von Vektoren umgewandelt werden. In diesem Beispiel werden die Textdaten mittels [BoW](#bag-of-words-bow) vektorisiert.
6060+Beim maschinellen Lernens wird die Vektorisierung der Daten als wichtiger Schritt betrachtet. Die Vektorisierung ist ein Prozess, bei dem die Daten in Form von Vektoren umgewandelt werden. In diesem Beispiel werden die Textdaten mittels [BoW](/de/artificial-intelligence/natural-language-processing#bag-of-words-bow) vektorisiert.
61616262```python
6363from sklearn.feature_extraction.text import CountVectorizer
···107107In der folgenden Abbildung sieht man ein Beispiel eines Entscheidungsbaums, welcher feststellen soll, ob eine Frucht `essbar` oder `nicht essbar` ist. Dieser Baum verfügt über einen Wurzelknoten, zwei innere Knoten und vier Blattknoten.
108108109109<img
110110- src="/images/artificial_intelligence/rfc_tree_lm.png"
111111- alt="Entscheidungsbaum"
112112- class="light-only"
110110+ src="/images/artificial_intelligence/rfc_tree_lm.png"
111111+ alt="Entscheidungsbaum"
112112+ class="light-only"
113113/>
114114<img
115115- src="/images/artificial_intelligence/rfc_tree_dm.png"
116116- alt="Entscheidungsbaum"
117117- class="dark-only"
115115+ src="/images/artificial_intelligence/rfc_tree_dm.png"
116116+ alt="Entscheidungsbaum"
117117+ class="dark-only"
118118/>
119119120120#### Ensemble-Lernen
···124124Im folgenden Bild sieht man anhand eines Beispiels, wie die Genauigkeit des gesamten Waldes aufgrund des unterschiedlichen Aufbaus der Bäume insgesamt steigt, da sich Fehler gegenseitig automatisch aufheben. Dieses Phänomen nennt sich `Weisheit der Crowd`.
125125126126<img
127127- src="/images/artificial_intelligence/rfc_ensemble_lm.png"
128128- alt="Entscheidungsbaum"
129129- class="light-only"
127127+ src="/images/artificial_intelligence/rfc_ensemble_lm.png"
128128+ alt="Entscheidungsbaum"
129129+ class="light-only"
130130/>
131131<img
132132- src="/images/artificial_intelligence/rfc_ensemble_dm.png"
133133- alt="Entscheidungsbaum"
134134- class="dark-only"
132132+ src="/images/artificial_intelligence/rfc_ensemble_dm.png"
133133+ alt="Entscheidungsbaum"
134134+ class="dark-only"
135135/>
136136137137#### Codebeispiel mit Datenaufbereitung und Anwendung des RFC
···220220221221Neuronale Netzwerke bestehen aus einer Reihe von Schichten:
222222223223-- **Eingabeschicht:** Die erste Schicht, die die Eingabedaten empfängt.
224224-- **Versteckte Schichten:** Eine oder mehrere Schichten, die die Eingabedaten transformieren und komplexe Merkmale extrahieren.
225225-- **Ausgabeschicht:** Die letzte Schicht, die das Ergebnis der Verarbeitung liefert.
223223+- **Eingabeschicht:** Die erste Schicht, die die Eingabedaten empfängt.
224224+- **Versteckte Schichten:** Eine oder mehrere Schichten, die die Eingabedaten transformieren und komplexe Merkmale extrahieren.
225225+- **Ausgabeschicht:** Die letzte Schicht, die das Ergebnis der Verarbeitung liefert.
226226227227Jedes Neuron berechnet eine gewichtete Summe seiner Eingaben, wendet eine Aktivierungsfunktion an und gibt das Ergebnis an die nächste Schicht weiter. Häufig verwendete Aktivierungsfunktionen sind die Sigmoid-Funktion, die Tanh-Funktion und die ReLU-Funktion (Rectified Linear Unit).
228228···253253254254Convolutional Neural Networks sind eine spezielle Art von neuronalen Netzwerken, die besonders gut für die Verarbeitung von Bildern und anderen grid-basierten Daten geeignet sind. Sie bestehen aus:
255255256256-- **Convolutional Layers:** Diese Schichten verwenden Filter (oder Kernel), die über das Eingabebild gleiten und lokale Merkmale extrahieren.
257257-- **Pooling Layers:** Diese Schichten reduzieren die Dimensionalität der Daten, indem sie lokale Bereiche zusammenfassen, z.B. durch Max-Pooling oder Average-Pooling.
258258-- **Fully Connected Layers:** Diese Schichten sind ähnlich wie in herkömmlichen neuronalen Netzwerken und verbinden alle Neuronen miteinander.
256256+- **Convolutional Layers:** Diese Schichten verwenden Filter (oder Kernel), die über das Eingabebild gleiten und lokale Merkmale extrahieren.
257257+- **Pooling Layers:** Diese Schichten reduzieren die Dimensionalität der Daten, indem sie lokale Bereiche zusammenfassen, z.B. durch Max-Pooling oder Average-Pooling.
258258+- **Fully Connected Layers:** Diese Schichten sind ähnlich wie in herkömmlichen neuronalen Netzwerken und verbinden alle Neuronen miteinander.
259259260260CNNs werden häufig in der Bild- und Videoverarbeitung, Mustererkennung und der Verarbeitung von mehrdimensionalen Daten eingesetzt.
261261···282282283283Varianten von RNNs sind:
284284285285-- **Long Short-Term Memory (LSTM):** Eine spezielle RNN-Architektur, die entwickelt wurde, um das Problem des verschwindenden Gradienten zu lösen und langfristige Abhängigkeiten besser zu modellieren.
286286-- **Gated Recurrent Unit (GRU):** Eine vereinfachte Version von LSTM, die ähnliche Leistungsmerkmale aufweist.
285285+- **Long Short-Term Memory (LSTM):** Eine spezielle RNN-Architektur, die entwickelt wurde, um das Problem des verschwindenden Gradienten zu lösen und langfristige Abhängigkeiten besser zu modellieren.
286286+- **Gated Recurrent Unit (GRU):** Eine vereinfachte Version von LSTM, die ähnliche Leistungsmerkmale aufweist.
287287288288```python
289289import torch
···328328329329Hauptmerkmale von TensorFlow sind:
330330331331-- **Tensors:** Grundlegende Datenstrukturen, die n-dimensionalen Arrays ähneln.
332332-- **Graphen:** Modelle werden als gerichtete Graphen dargestellt, wobei Knoten Operationen und Kanten Datenströme darstellen.
333333-- **Keras API:** Eine hochstufige API, die das Erstellen und Trainieren von Modellen vereinfacht.
331331+- **Tensors:** Grundlegende Datenstrukturen, die n-dimensionalen Arrays ähneln.
332332+- **Graphen:** Modelle werden als gerichtete Graphen dargestellt, wobei Knoten Operationen und Kanten Datenströme darstellen.
333333+- **Keras API:** Eine hochstufige API, die das Erstellen und Trainieren von Modellen vereinfacht.
334334335335TensorFlow bietet Unterstützung für verteiltes Training, ermöglicht den Einsatz auf verschiedenen Plattformen (CPUs, GPUs, TPUs) und hat eine große Community sowie umfangreiche Dokumentation.
336336···351351352352Hauptmerkmale von PyTorch sind:
353353354354-- **Tensors:** Ähnlich wie in TensorFlow, aber mit einer einfacheren Syntax.
355355-- **Autograd:** Automatische Differenzierung zur Berechnung von Gradienten.
356356-- **TorchScript:** Ermöglicht die Konvertierung von PyTorch-Modellen in eine Form, die in einer Produktionsumgebung ausgeführt werden kann.
354354+- **Tensors:** Ähnlich wie in TensorFlow, aber mit einer einfacheren Syntax.
355355+- **Autograd:** Automatische Differenzierung zur Berechnung von Gradienten.
356356+- **TorchScript:** Ermöglicht die Konvertierung von PyTorch-Modellen in eine Form, die in einer Produktionsumgebung ausgeführt werden kann.
357357358358PyTorch ist besonders bei Forschern und Entwicklern beliebt, da es intuitive und pythonische APIs bietet, die das Experimentieren und Debuggen erleichtern.
359359
···14141515Transaktionen sind mehrere Operationen, welche so zu einer Einheit verbunden sind, dass entweder alle oder gar kein Schritt ausgeführt wird. Sprich, Transaktionen sind atomar. Das Akronym BASE steht für folgende Eigenschaften bei dokumentenorientierte Datenbanken:
16161717-- **B**asically **A**vailable
1818- Die Daten sind jederzeit zugänglich und erreichbar.
1717+- **B**asically **A**vailable
1818+ Die Daten sind jederzeit zugänglich und erreichbar.
19192020-- **S**oft State
2121- Es ist erlaubt, dass es Zustände im System geben kann, in welchem Daten falsch sind.
2020+- **S**oft State
2121+ Es ist erlaubt, dass es Zustände im System geben kann, in welchem Daten falsch sind.
22222323-- **E**ventual Consistency
2424- Es wird garantiert, dass die Daten zu irgendeinem Zeitpunkt in der Zukunft richtig sein werden. Dies muss jedoch nicht jetzt sein. Das Gegenteil wäre _Strong Consistency_, wie es bei [relationalen Datenbanken](#relationale-datenbanken) der Fall ist.
2323+- **E**ventual Consistency
2424+ Es wird garantiert, dass die Daten zu irgendeinem Zeitpunkt in der Zukunft richtig sein werden. Dies muss jedoch nicht jetzt sein. Das Gegenteil wäre _Strong Consistency_, wie es bei [relationalen Datenbanken](/de/databases/relational-databases) der Fall ist.
25252626## Realisierungen
27272828### MongoDB
29293030-### CouchDB3030+### CouchDB
···6677## Vorteile
8899-- **Einfaches Datenmodell**
1010- Dem relationalen Datenbankmodell liegt ein vergleichsweise einfach umsetzbares Datenmodell zugrunde. Informationen wie Kundendaten, Bestelllisten oder Kontobewegungen, die Unternehmen langfristig speichern wollen, lassen sich mit der Tabellenstruktur, die dem relationalen Datenbankmodell zugrunde liegt, ideal abbilden.
99+- **Einfaches Datenmodell**
1010+ Dem relationalen Datenbankmodell liegt ein vergleichsweise einfach umsetzbares Datenmodell zugrunde. Informationen wie Kundendaten, Bestelllisten oder Kontobewegungen, die Unternehmen langfristig speichern wollen, lassen sich mit der Tabellenstruktur, die dem relationalen Datenbankmodell zugrunde liegt, ideal abbilden.
11111212-- **Geringe Datenredundanz**
1313- Das relationale Datenbankmodell legt klare Vorschriften zur Vermeidung von Redundanz durch verschiedene [Normalformen](#normalisierung) fest. Bei konsequenter Umsetzung ermöglichen relationale Datenbanksysteme eine nahezu redundanzfreie Datenhaltung. Dies erleichtert insbesondere die Pflege und Wartung von Datenbeständen, da Änderungen lediglich an einer einzigen Stelle vorgenommen werden müssen.
1212+- **Geringe Datenredundanz**
1313+ Das relationale Datenbankmodell legt klare Vorschriften zur Vermeidung von Redundanz durch verschiedene [Normalformen](#normalisierung) fest. Bei konsequenter Umsetzung ermöglichen relationale Datenbanksysteme eine nahezu redundanzfreie Datenhaltung. Dies erleichtert insbesondere die Pflege und Wartung von Datenbeständen, da Änderungen lediglich an einer einzigen Stelle vorgenommen werden müssen.
14141515-- **Hohe Datenkonsistenz**
1616- Normalisierte relationale Datenbanken ermöglichen eine konsistente Datenhaltung und tragen somit zur Datenkonsistenz bei. Relationale Datenbanksysteme bieten auch Funktionen, um Integritätsbedingungen zu definieren und automatisch zu überprüfen. Transaktionen, die die Datenkonsistenz gefährden könnten, sind ausgeschlossen.
1515+- **Hohe Datenkonsistenz**
1616+ Normalisierte relationale Datenbanken ermöglichen eine konsistente Datenhaltung und tragen somit zur Datenkonsistenz bei. Relationale Datenbanksysteme bieten auch Funktionen, um Integritätsbedingungen zu definieren und automatisch zu überprüfen. Transaktionen, die die Datenkonsistenz gefährden könnten, sind ausgeschlossen.
17171818-- **Mengenorientierte Datenverarbeitung**
1919- Das relationale Datenbanksystem basiert auf einer mengenorientierten Datenverarbeitung, bei der jede Entität in atomare Werte zerlegt wird. Dies ermöglicht die Verknüpfung verschiedener Entitäten über den Inhalt sowie komplexe Datenbankabfragen wie JOINs.
1818+- **Mengenorientierte Datenverarbeitung**
1919+ Das relationale Datenbanksystem basiert auf einer mengenorientierten Datenverarbeitung, bei der jede Entität in atomare Werte zerlegt wird. Dies ermöglicht die Verknüpfung verschiedener Entitäten über den Inhalt sowie komplexe Datenbankabfragen wie JOINs.
20202121-- **Einheitliche Abfragesprache**
2222- Für Abfragen relationaler Datenbanken hat sich die durch ein Gremium von ISO und IEC standardisierte Datenbanksprache SQL etabliert. Diese Standardisierung ermöglicht es, Anwendungen weitgehend unabhängig vom zugrunde liegenden Datenbank-Managementsystem zu entwickeln und auszuführen. Allerdings variiert der Support von SQL je nach DBMS nach wie vor erheblich.
2121+- **Einheitliche Abfragesprache**
2222+ Für Abfragen relationaler Datenbanken hat sich die durch ein Gremium von ISO und IEC standardisierte Datenbanksprache SQL etabliert. Diese Standardisierung ermöglicht es, Anwendungen weitgehend unabhängig vom zugrunde liegenden Datenbank-Managementsystem zu entwickeln und auszuführen. Allerdings variiert der Support von SQL je nach DBMS nach wie vor erheblich.
23232424## Nachteile
25252626-- **Big Data**
2727- Bei enormen Datenmengen zeigen sich die Grenzen relationaler Datenbanken, insbesondere in Bezug auf die Effizienz von [JOIN-Operationen](#join-operationen). In solchen Umgebungen, in denen Big Data verarbeitet wird, erweisen sich relationale Datenbanken aufgrund ihrer Performance-Belastung durch JOINs oft als weniger empfehlenswert.
2626+- **Big Data**
2727+ Bei enormen Datenmengen zeigen sich die Grenzen relationaler Datenbanken, insbesondere in Bezug auf die Effizienz von [JOIN-Operationen](#join-operationen). In solchen Umgebungen, in denen Big Data verarbeitet wird, erweisen sich relationale Datenbanken aufgrund ihrer Performance-Belastung durch JOINs oft als weniger empfehlenswert.
28282929-- **Tabellen nicht passend**
3030- Das scheinbar einfache tabellenbasierte Datenmodell und die Verknüpfung von Daten in relationalen Datenbanksystemen können in bestimmten Kontexten als Herausforderung erscheinen. Insbesondere die starre Struktur zweidimensionaler Tabellen stößt an ihre Grenzen, wenn es um die Abbildung komplexer Datentypen wie in Multimedia-Anwendungen und Big-Data-Szenarien geht.
2929+- **Tabellen nicht passend**
3030+ Das scheinbar einfache tabellenbasierte Datenmodell und die Verknüpfung von Daten in relationalen Datenbanksystemen können in bestimmten Kontexten als Herausforderung erscheinen. Insbesondere die starre Struktur zweidimensionaler Tabellen stößt an ihre Grenzen, wenn es um die Abbildung komplexer Datentypen wie in Multimedia-Anwendungen und Big-Data-Szenarien geht.
31313232-- **Fehlende Hierarchie in den Datenbankstrukturen**
3333- Ein zentrales Defizit relationaler Datenbanken im Vergleich zu Objektdatenbanken liegt in der fehlenden Möglichkeit, hierarchisch strukturierte Klassen in den Datenbankschemata umzusetzen. Die Unmöglichkeit, untergeordnete Entitäten mit den Eigenschaften ihrer übergeordneten Entitäten zu versehen, führt zu einer einheitlichen Hierarchieebene und schließt die Erstellung von Sub-Tupeln aus.
3232+- **Fehlende Hierarchie in den Datenbankstrukturen**
3333+ Ein zentrales Defizit relationaler Datenbanken im Vergleich zu Objektdatenbanken liegt in der fehlenden Möglichkeit, hierarchisch strukturierte Klassen in den Datenbankschemata umzusetzen. Die Unmöglichkeit, untergeordnete Entitäten mit den Eigenschaften ihrer übergeordneten Entitäten zu versehen, führt zu einer einheitlichen Hierarchieebene und schließt die Erstellung von Sub-Tupeln aus.
34343535-- **Segmentierung der Daten und komplexe Abfragen**
3636- Die fundamentale Praxis der Datensegmentierung durch Normalisierung in relationalen Datenbanksystemen kann zu einer fragmentierten Datenhaltung führen. Das Zusammenführen von thematisch zusammenhängenden Daten gestaltet sich schwieriger, was zu komplexen Abfragen über mehrere Tabellen und damit zu einer potenziellen Beeinträchtigung der Performance auf der Anwendungsebene führen kann.
3535+- **Segmentierung der Daten und komplexe Abfragen**
3636+ Die fundamentale Praxis der Datensegmentierung durch Normalisierung in relationalen Datenbanksystemen kann zu einer fragmentierten Datenhaltung führen. Das Zusammenführen von thematisch zusammenhängenden Daten gestaltet sich schwieriger, was zu komplexen Abfragen über mehrere Tabellen und damit zu einer potenziellen Beeinträchtigung der Performance auf der Anwendungsebene führen kann.
37373838## Konzepte
3939···49495050Transaktionen sind mehrere Operationen, welche so zu einer Einheit verbunden sind, dass entweder alle oder gar kein Schritt ausgeführt wird. Sprich, Transaktionen sind atomar. Dies wird beim ACID-Transaktionsmodell (Akronym) erneuert ersichtlich:
51515252-- **A**tomar
5353- Transaktionen sind nicht aufspaltbar.
5252+- **A**tomar
5353+ Transaktionen sind nicht aufspaltbar.
54545555-- **C**onsistent
5656- Relationale Datenbanken haben eine hohe Datenkonsistenz (_Strong Consistency_). Das bedeutet, dass zu jedem Zeitpunkt alle Daten richtig sein müssen. [_Eventual Consistency_](#base-transaktionen) bedeutet, dass die Datenrichtigkeit irgendwann gegeben sein wird (nicht gezwungenermaßen jetzt sofort).
5555+- **C**onsistent
5656+ Relationale Datenbanken haben eine hohe Datenkonsistenz (_Strong Consistency_). Das bedeutet, dass zu jedem Zeitpunkt alle Daten richtig sein müssen. [_Eventual Consistency_](/de/databases/document-oriented-databases#base-transaktionen) bedeutet, dass die Datenrichtigkeit irgendwann gegeben sein wird (nicht gezwungenermaßen jetzt sofort).
57575858- Bei SQL-Datenbanken wird diese hohe Datenkonsistenz mittels Constraints (`NOT NULL`, `PRIMARY KEY` / `FOREIGN KEY`, `UNIQUE`, `CHECK`, `DEFAULT`) gewährleistet.
5858+ Bei SQL-Datenbanken wird diese hohe Datenkonsistenz mittels Constraints (`NOT NULL`, `PRIMARY KEY` / `FOREIGN KEY`, `UNIQUE`, `CHECK`, `DEFAULT`) gewährleistet.
59596060-- **I**solated
6161- Sobald eine Transaktion Daten bearbeitet, werden diese Daten gesperrt, damit keine anderen Transaktionen die Daten überschreiben können.
6060+- **I**solated
6161+ Sobald eine Transaktion Daten bearbeitet, werden diese Daten gesperrt, damit keine anderen Transaktionen die Daten überschreiben können.
62626363-- **D**urable
6464- Die Daten werden selbst bei einem Ausfall gespeichert. Somit werden die Ergebnisse im Rahmen einer Transaktion sogar bei Ausfallzeiten fortlaufend geliefert.
6363+- **D**urable
6464+ Die Daten werden selbst bei einem Ausfall gespeichert. Somit werden die Ergebnisse im Rahmen einer Transaktion sogar bei Ausfallzeiten fortlaufend geliefert.
65656666#### Isolation verbessern
6767···105105106106### SQLite
107107108108-### MariaDB108108+### MariaDB
···26262727Jede Azure Function ist eine einfache Funktion in C## oder [anderen Programmiersprachen](https://learn.microsoft.com/de-de/azure/azure-functions/supported-languages?tabs=isolated-process%2Cv4&pivots=programming-language-csharp). Dabei benötigt jede AF (Azure Function) einen Trigger, bei welchen sie ausgeführt werden soll. Es gibt viele verschiedene Arten von Triggern:
28282929-| Azure Function Trigger |
3030-| ------------------------------------------------------------------------------- |
3131-| HTTP Trigger (Ausführung bei HTTP Request) |
3232-| Timer Trigger (Ausführung in Intervallen) |
3333-| Queue Trigger (Ausführung bei neuer Message in [Queue Storage](#queue-storage)) |
3434-| Blob Trigger (Ausführung bei Dateiupload in [Blob Storage](#blob-storage)) |
3535-| Cosmos DB Trigger |
3636-| Event Grid Trigger |
3737-| Event Hub Trigger |
3838-| Custom Bindings (.NET) |
2929+| Azure Function Trigger |
3030+| ------------------------------------------------------------------------------------------------------------------------ |
3131+| HTTP Trigger (Ausführung bei HTTP Request) |
3232+| Timer Trigger (Ausführung in Intervallen) |
3333+| Queue Trigger (Ausführung bei neuer Message in [Queue Storage](/de/decentralised-systems/storage-account#queue-storage)) |
3434+| Blob Trigger (Ausführung bei Dateiupload in [Blob Storage](/de/decentralised-systems/storage-account#blob-storage)) |
3535+| Cosmos DB Trigger |
3636+| Event Grid Trigger |
3737+| Event Hub Trigger |
3838+| Custom Bindings (.NET) |
39394040### Timer Trigger
4141
···81818282## Activity
83838484-Eine Activity ist eine normale Azure Function, welche vom Orchestrator ein oder mehrere Male aufgerufen werden kann. Für die Activity gelten die gleichen Regeln wie für eine [Azure Function](#azure-functions).
8484+Eine Activity ist eine normale Azure Function, welche vom Orchestrator ein oder mehrere Male aufgerufen werden kann. Für die Activity gelten die gleichen Regeln wie für eine [Azure Function](/de/decentralised-systems/azure-functions).
85858686```csharp
8787[FunctionName("SayHello")]
···69697070#### Normal Mode
71717272-Beim normalen Modus muss die Konvertierung von analogen auf digitales Signal jedes mal manuell gestartet werden. Sobald die Messung abgeschlossen ist, wird die entsprechende ISR aufgerufen. Meistens startet man die nächste Messung direkt nach der Absolvierung des Durchlaufs des [Interrupts](#interrupts).
7272+Beim normalen Modus muss die Konvertierung von analogen auf digitales Signal jedes mal manuell gestartet werden. Sobald die Messung abgeschlossen ist, wird die entsprechende ISR aufgerufen. Meistens startet man die nächste Messung direkt nach der Absolvierung des Durchlaufs des [Interrupts](/de/embedded-programming/interrupts).
73737474```c
7575int main(void)
···94949595#### Free Running Mode
96969797-Es gibt die Möglichkeit den ADC so einzustellen, dass er so schnell wie er nur kann hintereinander unendlich oft automatisch getriggert wird. Dabei entsteht die Gefahr, dass bei einer länger andauernden Ausführung des ADC [Interrupts](#interrupts) die nächste Ausführung gestartet wird, bevor die aktuell Ausführung überhaupt fertig ist.
9797+Es gibt die Möglichkeit den ADC so einzustellen, dass er so schnell wie er nur kann hintereinander unendlich oft automatisch getriggert wird. Dabei entsteht die Gefahr, dass bei einer länger andauernden Ausführung des ADC [Interrupts](/de/embedded-programming/interrupts) die nächste Ausführung gestartet wird, bevor die aktuell Ausführung überhaupt fertig ist.
98989999```c
100100ADCSRA |= (1<<ADATE);
···8899Grundsätzlich gibt es zwei verschiedene Arten, Tasten zu verwenden:
10101111-- Active Low Beschaltung => Pull-Up Widerstand
1212-- Active High Beschaltung => Pull-Down Widerstand
1111+- Active Low Beschaltung => Pull-Up Widerstand
1212+- Active High Beschaltung => Pull-Down Widerstand
13131414-Diese beiden Arten müssen auf [Code-Ebene](#code-1) unterschiedlich verarbeitet werden.
1414+Diese beiden Arten müssen auf [Code-Ebene](#code) unterschiedlich verarbeitet werden.
15151616### Active Low / Pull-Up
1717···152152153153### Mit Interrupts
154154155155-Mit Interrupts hat man den Vorteil, dass man nicht in der while-Schleife ständig eine Methode aufrufen muss, welche die Tasten abfragt. Dieses Verhalten wird bei den [Interrupts](#interrupts) noch besser erklärt.
155155+Mit Interrupts hat man den Vorteil, dass man nicht in der while-Schleife ständig eine Methode aufrufen muss, welche die Tasten abfragt. Dieses Verhalten wird bei den [Interrupts](/de/embedded-programming/interrupts) noch besser erklärt.
156156157157#### Direkt externe Interrupts
158158
···3535Die Funktionalitäten von `*` und `&` werden in dieser Tabelle dargestellt:
36363737<table>
3838- <thead>
3939- <tr>
4040- <th>Symbol</th>
4141- <th>Funktion</th>
4242- <th style="min-width: 200px;">Beispiel</th>
4343- </tr>
4444- </thead>
4545- <tbody>
4646- <tr>
4747- <td rowspan="2">
4848- <code>*</code>
4949- </td>
5050- <td>
5151- Pointer erstellen
5252- <blockquote>
5353- <strong><a href="https://stackoverflow.com/questions/5590150/difference-between-int-p-and-int-p-declaration">Anmerkung</a></strong>:
5454- Die Position des Sternchens relativ zum
5555- Variablennamen macht keinen Unterschied. Jedoch gilt das Sternchen immer nur für
5656- die folgende Variable! In Beispiel 4 wird demnach genau wie in Beispiel 3 nur
5757- ein Pointer und eine normale Variable erstellt.
5858- </blockquote>
5959- </td>
6060- <td>
6161- <code>int *p;</code>
6262- <br />
6363- <code>int* p;</code>
6464- <br />
6565- <code>int *p, q;</code>
6666- <br />
6767- <code>int* p, q;</code>
6868- </td>
6969- </tr>
7070- <tr>
7171- <td>den Wert des Pointers auslesen (Dereferenzierung)</td>
7272- <td>
7373- <code>int i = *p;</code>
7474- </td>
7575- </tr>
7676- <tr>
7777- <td>
7878- <code>&</code>
7979- </td>
8080- <td>
8181- Mit dem Adressoperator kann man einen Wert zu einem Pointer konvertieren (die
8282- Adresse des Wertes auslesen).
8383- </td>
8484- <td>
8585- <code>int *p = &i;</code>
8686- </td>
8787- </tr>
8888- </tbody>
3838+ <thead>
3939+ <tr>
4040+ <th>Symbol</th>
4141+ <th>Funktion</th>
4242+ <th style="min-width: 200px;">Beispiel</th>
4343+ </tr>
4444+ </thead>
4545+ <tbody>
4646+ <tr>
4747+ <td rowspan="2">
4848+ <code>*</code>
4949+ </td>
5050+ <td>
5151+ Pointer erstellen
5252+ <blockquote>
5353+ <strong>
5454+ <a href="https://stackoverflow.com/questions/5590150/difference-between-int-p-and-int-p-declaration">
5555+ Anmerkung
5656+ </a>
5757+ </strong>
5858+ : Die Position des Sternchens relativ zum Variablennamen macht keinen
5959+ Unterschied. Jedoch gilt das Sternchen immer nur für die folgende
6060+ Variable! In Beispiel 4 wird demnach genau wie in Beispiel 3 nur ein
6161+ Pointer und eine normale Variable erstellt.
6262+ </blockquote>
6363+ </td>
6464+ <td>
6565+ <code>int *p;</code>
6666+ <br />
6767+ <code>int* p;</code>
6868+ <br />
6969+ <code>int *p, q;</code>
7070+ <br />
7171+ <code>int* p, q;</code>
7272+ </td>
7373+ </tr>
7474+ <tr>
7575+ <td>den Wert des Pointers auslesen (Dereferenzierung)</td>
7676+ <td>
7777+ <code>int i = *p;</code>
7878+ </td>
7979+ </tr>
8080+ <tr>
8181+ <td>
8282+ <code>&</code>
8383+ </td>
8484+ <td>
8585+ Mit dem Adressoperator kann man einen Wert zu einem Pointer konvertieren
8686+ (die Adresse des Wertes auslesen).
8787+ </td>
8888+ <td>
8989+ <code>int *p = &i;</code>
9090+ </td>
9191+ </tr>
9292+ </tbody>
8993</table>
90949195## mit Arrays arbeiten
···134138}
135139```
136140137137-Bei Strings, sprich Array von Zeichen, wird beim Erstellen automatisch ein Terminierungssymbol (`\0`) nach dem Array gespeichert, sodass man untige `while`-Schleife zum Ausgeben verwenden kann. Die `while`-Schleife hört automatisch am Ende der Zeichenkette auf, da das Terminierungszeichen `\0` einer falschen Bedingung entspricht. Genau auf diese Art und Weise werden beim [USART](#daten-senden) die Zeichen einzeln hintereinander versendet.
141141+Bei Strings, sprich Array von Zeichen, wird beim Erstellen automatisch ein Terminierungssymbol (`\0`) nach dem Array gespeichert, sodass man untige `while`-Schleife zum Ausgeben verwenden kann. Die `while`-Schleife hört automatisch am Ende der Zeichenkette auf, da das Terminierungszeichen `\0` einer falschen Bedingung entspricht. Genau auf diese Art und Weise werden beim [USART](/de/embedded-programming/usart#daten-senden) die Zeichen einzeln hintereinander versendet.
138142139143```c
140144char buffer[10] = "Hallo";
···77Nachstehende Tabelle fasst die SFR für die drei Ports jeweils zusammen.
8899<table>
1010-<tr><th></th><th>Data Direction Register</th><th>Ausgangsregister</th><th>Eingangsregister</th></tr>
1111-<tr><td>B</td><td><code>DDRB</code></td><td><code>PORTB</code></td><td><code>PINB</code></td></tr>
1212-<tr><td>C</td><td><code>DDRC</code></td><td><code>PORTC</code></td><td><code>PINC</code></td></tr>
1313-<tr><td>D</td><td><code>DDRD</code></td><td><code>PORTD</code></td><td><code>PIND</code></td></tr>
1414-<tr><td>Beschreibung</td>
1515-<td>Jedes Pin kann entweder ein Eingang oder ein Ausgang sein. Diese Flussrichtung der Daten, kann mittels Data Direction Register eingestellt werden. Da standardmäßig alle <code>DDR</code> auf <code>0</code> gesetzt sind, ist auch <strong>standardmäßig alles ein Eingang</strong>. Mit dem Code unten kann man die jeweilgen Pins auf Ausgänge setzen (für LED zB).</td>
1616-<td>Will man intern bei dem jeweiligen Pin <code>5V</code> anlegen, so kann man dies tun, indem man das korrespondierende Ausgangsregister auf <code>1</code> setzt.</td>
1717-<td>Die Eingangsregister erlauben Konfigurationen, welche beim Arbeiten mit Tasten von Entscheidung sind.</td></tr>
1010+ <tr>
1111+ <th></th>
1212+ <th>Data Direction Register</th>
1313+ <th>Ausgangsregister</th>
1414+ <th>Eingangsregister</th>
1515+ </tr>
1616+ <tr>
1717+ <td>B</td>
1818+ <td>
1919+ <code>DDRB</code>
2020+ </td>
2121+ <td>
2222+ <code>PORTB</code>
2323+ </td>
2424+ <td>
2525+ <code>PINB</code>
2626+ </td>
2727+ </tr>
2828+ <tr>
2929+ <td>C</td>
3030+ <td>
3131+ <code>DDRC</code>
3232+ </td>
3333+ <td>
3434+ <code>PORTC</code>
3535+ </td>
3636+ <td>
3737+ <code>PINC</code>
3838+ </td>
3939+ </tr>
4040+ <tr>
4141+ <td>D</td>
4242+ <td>
4343+ <code>DDRD</code>
4444+ </td>
4545+ <td>
4646+ <code>PORTD</code>
4747+ </td>
4848+ <td>
4949+ <code>PIND</code>
5050+ </td>
5151+ </tr>
5252+ <tr>
5353+ <td>Beschreibung</td>
5454+ <td>
5555+ Jedes Pin kann entweder ein Eingang oder ein Ausgang sein. Diese
5656+ Flussrichtung der Daten, kann mittels Data Direction Register eingestellt
5757+ werden. Da standardmäßig alle <code>DDR</code> auf <code>0</code> gesetzt
5858+ sind, ist auch <strong>standardmäßig alles ein Eingang</strong>. Mit dem
5959+ Code unten kann man die jeweilgen Pins auf Ausgänge setzen (für LED zB).
6060+ </td>
6161+ <td>
6262+ Will man intern bei dem jeweiligen Pin <code>5V</code> anlegen, so kann
6363+ man dies tun, indem man das korrespondierende Ausgangsregister auf{" "}
6464+ <code>1</code> setzt.
6565+ </td>
6666+ <td>
6767+ Die Eingangsregister erlauben Konfigurationen, welche beim Arbeiten mit
6868+ Tasten von Entscheidung sind.
6969+ </td>
7070+ </tr>
1871</table>
19722073## Beispiele
···58111}
59112```
601136161-Meistens verwendet man bei der Abfrage von Tasteneingaben die [`Interne Pull-Up Widerstand`-Methode](#active-low--pull-up). Hierbei liegen 0V an, wenn die Taste gedrückt ist, was bedeutet, dass die Bedinung negiert werden muss. Um diese dann noch zu entprellen (auf Softwareebene) macht man ein Delay.
114114+Meistens verwendet man bei der Abfrage von Tasteneingaben die [`Interne Pull-Up Widerstand`-Methode](/de/embedded-programming/button#active-low--pull-up). Hierbei liegen 0V an, wenn die Taste gedrückt ist, was bedeutet, dass die Bedinung negiert werden muss. Um diese dann noch zu entprellen (auf Softwareebene) macht man ein Delay.
6211563116```c del="!"
64117if (!(PIND & (1<<PIND1)))
···10101111Dabei muss die Kommunikation immer vom Controller aus gestartet werden. Ein Peripheral kann nur Daten senden, wenn er vom Controller dazu aufgefordert wird.
12121313-Das SPI verwendet separate Takt- und Datenleitungen sowie eine Auswahlleitung, um das Gerät auszuwählen, mit dem Sie sprechen möchten. Dies ist auch einer der Unterschiede zum [USART](#usart---universal-synchronous-and-asynchronous-receiver-transmitter), welches keine synchrone Schnittstelle ist, da es keine Garantie gibt, dass beide Seiten mit der gleichen Taktrate laufen. Beim USART müssen sich die beiden Seiten im Vorhinein einigen, mit welcher Übertragungsgeschwindigkeit ([Baudrate](#baud-rate)) sie kommunizieren und es müssen zusätzliche Start- und Stoppbits übertragen werden.
1313+Das SPI verwendet separate Takt- und Datenleitungen sowie eine Auswahlleitung, um das Gerät auszuwählen, mit dem Sie sprechen möchten. Dies ist auch einer der Unterschiede zum [USART](/de/embedded-programming/usart), welches keine synchrone Schnittstelle ist, da es keine Garantie gibt, dass beide Seiten mit der gleichen Taktrate laufen. Beim USART müssen sich die beiden Seiten im Vorhinein einigen, mit welcher Übertragungsgeschwindigkeit ([Baudrate](/de/embedded-programming/usart#baud-rate)) sie kommunizieren und es müssen zusätzliche Start- und Stoppbits übertragen werden.
14141515:::note
1616Einige Dokumentationen verwenden noch die veralteten Begriffe, wie `Master` oder `Slave`. Aufgrund ihrer historischen Verbindung mit Rassismus werden diese Begriffe heutzutage durch neutralere Alternativen ersetzt. Folgende Tabelle zeigt die Änderungen diesbezüglich:
···28282929### Clock
30303131-Genau wie der [Timer](#timer--counter) benötigt das SPI einen Prescaler, um den Systemtakt anzupassen. Mithilfe dieser Tabelle ([Datenblatt](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=141)) und diesen Registern kann man den Prescaler einstellen:
3131+Genau wie der [Timer](/de/embedded-programming/timer) benötigt das SPI einen Prescaler, um den Systemtakt anzupassen. Mithilfe dieser Tabelle ([Datenblatt](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=141)) und diesen Registern kann man den Prescaler einstellen:
32323333| `SPI2X` | `SPR1` | `SPR0` | `SCK` Frequency |
3434| ------- | ------ | ------ | --------------------- |
···8989Der Prozess dieses Ablaufs ist in diesem Diagramm nochmal dargestellt:
90909191<img
9292- src="/images/embedded_programming/spi/transfer_data.png"
9393- alt="Data Transfer"
9494- class="light-only"
9292+ src="/images/embedded_programming/spi/transfer_data.png"
9393+ alt="Data Transfer"
9494+ class="light-only"
9595/>
9696<img
9797- src="/images/embedded_programming/spi/transfer_data_dark.png"
9898- alt="Data Transfer"
9999- class="dark-only"
9797+ src="/images/embedded_programming/spi/transfer_data_dark.png"
9898+ alt="Data Transfer"
9999+ class="dark-only"
100100/>
101101102102Und anschließend werden die berechneten Daten vom Peripheral zum Controller gesendet:
···111111```
112112113113<img
114114- src="/images/embedded_programming/spi/transfer_data_2.png"
115115- alt="Data Transfer"
116116- class="light-only"
114114+ src="/images/embedded_programming/spi/transfer_data_2.png"
115115+ alt="Data Transfer"
116116+ class="light-only"
117117/>
118118<img
119119- src="/images/embedded_programming/spi/transfer_data_2_dark.png"
120120- alt="Data Transfer"
121121- class="dark-only"
119119+ src="/images/embedded_programming/spi/transfer_data_2_dark.png"
120120+ alt="Data Transfer"
121121+ class="dark-only"
122122/>
123123124124## Code
···4455Der Timer ist ein sehr nützliches Instrument in der hardwarenahen Programmierung und eignet sich besonders gut für zeitbasierte Vorgänge, wie zum Beispiel:
6677-- Delay (Programmverzögerung) um bestimmte Anzahl an Sekunden
88-- regelmäßig ADC triggern
99-- DC-Motor drehzahlgesteuert zu betreiben
77+- Delay (Programmverzögerung) um bestimmte Anzahl an Sekunden
88+- regelmäßig ADC triggern
99+- DC-Motor drehzahlgesteuert zu betreiben
10101111## Theorie
12121313Der ATmega 328p hat 3 verschiedene Timer:
14141515-- TC0: 8-bit
1616-- TC1: 16-bit
1717-- TC2: 8-bit; async
1515+- TC0: 8-bit
1616+- TC1: 16-bit
1717+- TC2: 8-bit; async
18181919:::note
2020Ersetzen Sie im gesamten Artikel das `n` immer mit der jeweiligen Nummer des Timers, welchen Sie gerade verwenden (TC0: n = 0; TC1: n = 1; ...). Im ATmega328P Datenblatt, ist TC0 [Kapitel 14](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=74), TC1 [Kapitel 15](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=89) und TC2 [Kapitel 17](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=116).
···162162163163Für den normalen Modus beim Timer können folgende Konfigurationen getroffen werden:
164164165165-- `WGMn0`, `WGMn1` und `WGMn2` (und `WGM13`) auf 0 setzen (siehe [Table 14-8](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=86), [Table 15-5](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=109) oder [Table 17-8](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=130))
165165+- `WGMn0`, `WGMn1` und `WGMn2` (und `WGM13`) auf 0 setzen (siehe [Table 14-8](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=86), [Table 15-5](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=109) oder [Table 17-8](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=130))
166166167167- ```c
168168- // Timer Modus auf Normal Mode setzen
169169- TCCRnA &= ~((1<<WGMn0) | (1<<WGMn1));
170170- TCCRnB &= ~((1<<WGMn2));
171171- ```
167167+ ```c
168168+ // Timer Modus auf Normal Mode setzen
169169+ TCCRnA &= ~((1<<WGMn0) | (1<<WGMn1));
170170+ TCCRnB &= ~((1<<WGMn2));
171171+ ```
172172173173-- `CSn0`, `CSn1` und `CSn2` einstellen (siehe [Table 14-9](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=87), [Table 15-6](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=110) oder [Table 17-9](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=131))
173173+- `CSn0`, `CSn1` und `CSn2` einstellen (siehe [Table 14-9](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=87), [Table 15-6](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=110) oder [Table 17-9](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=131))
174174175175- ```c
176176- // Prescaler einstellen - Beispiel 1024
177177- TCCRnB |= (1<<CSn0) | (1<<CSn2);
178178- TCCRnB &= ~(1<<CSn1);
179179- ```
175175+ ```c
176176+ // Prescaler einstellen - Beispiel 1024
177177+ TCCRnB |= (1<<CSn0) | (1<<CSn2);
178178+ TCCRnB &= ~(1<<CSn1);
179179+ ```
180180181181- Nutzen Sie [diese](#prescaler-1) Tabelle, um herauszufinden, welcher Prescaler Wert in Ihrem Program am meisten Sinn macht.
181181+ Nutzen Sie [diese](#prescaler) Tabelle, um herauszufinden, welcher Prescaler Wert in Ihrem Program am meisten Sinn macht.
182182183183#### `TCNTn` vorladen
184184···220220221221Für den CTC Modus beim Timer müssen/können folgende Konfigurationen getroffen werden:
222222223223-- `WGMnx` richtig setzen (TC0 / TC2: `WGMn1`; TC1: `WGM12` (und `WGM13`))
224224- (siehe [Table 14-8](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=86), [Table 15-5](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=109) oder [Table 17-8](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=130))
223223+- `WGMnx` richtig setzen (TC0 / TC2: `WGMn1`; TC1: `WGM12` (und `WGM13`))
224224+ (siehe [Table 14-8](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=86), [Table 15-5](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=109) oder [Table 17-8](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=130))
225225226226-- `OCIEnx` auf 1 setzen (siehe [14.9.6](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=88), [15.11.8](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=112) oder [17.11.6](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=132))
226226+- `OCIEnx` auf 1 setzen (siehe [14.9.6](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=88), [15.11.8](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=112) oder [17.11.6](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=132))
227227228228- ```c
229229- // Interrupts aktivieren - Beispiel Compare Match A
230230- TIMSKn |= (1<<OCIEnA);
231231- ```
228228+ ```c
229229+ // Interrupts aktivieren - Beispiel Compare Match A
230230+ TIMSKn |= (1<<OCIEnA);
231231+ ```
232232233233-- `CSn0`, `CSn1` und `CSn2` einstellen (siehe [Table 14-9](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=87), [Table 15-6](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=110) oder [Table 17-9](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=131))
233233+- `CSn0`, `CSn1` und `CSn2` einstellen (siehe [Table 14-9](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=87), [Table 15-6](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=110) oder [Table 17-9](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=131))
234234235235- ```c
236236- // Prescaler einstellen - Beispiel 256
237237- TCCRnB |= (1<<CSn2);
238238- TCCRnB &= ~((1<<CSn0) | (1<<CSn1));
239239- ```
235235+ ```c
236236+ // Prescaler einstellen - Beispiel 256
237237+ TCCRnB |= (1<<CSn2);
238238+ TCCRnB &= ~((1<<CSn0) | (1<<CSn1));
239239+ ```
240240241241- Nutzen Sie [diese](#prescaler-1) Tabelle, um herauszufinden, welcher Prescaler Wert in Ihrem Program am meisten Sinn macht.
241241+ Nutzen Sie [diese](#prescaler) Tabelle, um herauszufinden, welcher Prescaler Wert in Ihrem Program am meisten Sinn macht.
242242243243:::tip[Aufgabe]
244244Erstellen Sie ein Programm, bei welchem eine ISR alle **vier Millisekunden** ausgeführt wird! Nutzen Sie dafür den Timer im CTC Mode!
···279279280280Für den PWM Modus beim Timer müssen/können folgende Konfigurationen getroffen werden:
281281282282-- `WGMnx` richtig setzen
283283- (siehe [Table 14-8](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=86), [Table 15-5](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=109) oder [Table 17-8](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=130))
282282+- `WGMnx` richtig setzen
283283+ (siehe [Table 14-8](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=86), [Table 15-5](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=109) oder [Table 17-8](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=130))
284284285285-- invertierenden / nicht-invertierenden Modus einstellen
285285+- invertierenden / nicht-invertierenden Modus einstellen
286286287287- - `COMnA0` und `COMnA1` (siehe [Table 14-3 und 14-4](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=84), [Table 15-3 und 15-4](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=108) oder [Table 17-3 und 17-4](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=128))
287287+ - `COMnA0` und `COMnA1` (siehe [Table 14-3 und 14-4](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=84), [Table 15-3 und 15-4](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=108) oder [Table 17-3 und 17-4](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=128))
288288289289- - `COMnB0` und `COMnB1` (siehe [Table 14-6 und 14-7](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=85), [Table 15-3 und 15-4](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=108) oder [Table 17-6 und 17-7](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=129))
289289+ - `COMnB0` und `COMnB1` (siehe [Table 14-6 und 14-7](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=85), [Table 15-3 und 15-4](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=108) oder [Table 17-6 und 17-7](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=129))
290290291291-- `CSn0`, `CSn1` und `CSn2` einstellen (siehe [Table 14-9](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=87), [Table 15-6](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=110) oder [Table 17-9](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=131))
291291+- `CSn0`, `CSn1` und `CSn2` einstellen (siehe [Table 14-9](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=87), [Table 15-6](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=110) oder [Table 17-9](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=131))
292292293293- ```c
294294- // Prescaler einstellen - Beispiel 64
295295- TCCRnB |= (1<<CSn0) | (1<<CSn1);
296296- TCCRnB &= ~(1<<CSn2);
297297- ```
293293+ ```c
294294+ // Prescaler einstellen - Beispiel 64
295295+ TCCRnB |= (1<<CSn0) | (1<<CSn1);
296296+ TCCRnB &= ~(1<<CSn2);
297297+ ```
298298299299- Nutzen Sie [diese](#prescaler-1) Tabelle, um herauszufinden, welcher Prescaler Wert in Ihrem Program am meisten Sinn macht.
299299+ Nutzen Sie [diese](#prescaler) Tabelle, um herauszufinden, welcher Prescaler Wert in Ihrem Program am meisten Sinn macht.
300300301301:::tip[Aufgabe]
302302Erstellen Sie ein Programm, bei welchem eine ISR alle **vier Millisekunden** ausgeführt wird! Nutzen Sie dafür den Timer im CTC Mode!
···66666767### Daten senden
68686969-Um die Implementierung zu erleichtern, verwendet man [Pointer](#pointer). Dies ist die Methode für einzelne [ASCII-Zeichen](https://www.torsten-horn.de/techdocs/ascii.htm).
6969+Um die Implementierung zu erleichtern, verwendet man [Pointer](/de/embedded-programming/pointer). Dies ist die Methode für einzelne [ASCII-Zeichen](https://www.torsten-horn.de/techdocs/ascii.htm).
70707171```c
7272void write_char(char str) {
···24242525<CardGrid stagger>
2626 <Card title="Schnuppere ins Wissen!" icon="random">
2727- Du interessierst sich für technisches Wissen von einer HTL? Entdecke das Mutanuq-Universum!
2727+ Du interessierst sich für technisches Wissen von einer HTL? Entdecke das
2828+ Mutanuq-Universum!
2829 </Card>
2930 <Card title="Seie ein Mitbegründer dieser Webseite" icon="add-document">
3030- Schaue einmal bei <a href="https://github.com/trueberryless-org/mutanuq">GitHub</a> vorbei und erstelle einen Pull Request!
3131+ Schaue einmal bei{" "}
3232+ <a href="https://github.com/trueberryless-org/mutanuq">GitHub</a> vorbei und
3333+ erstelle einen Pull Request!
3134 </Card>
3235 <Card title="Unterstütze unsere Arbeit" icon="rocket">
3333- Ich würde mich riesig freuen, wenn du mich unterstützen würdest mittels <a href="https://www.paypal.com/donate/?hosted_button_id=WDQ5D2VQ6SWEC">PayPal</a>, <a href="https://www.patreon.com/trueberryless">Patreon</a> oder <a href="https://ko-fi.com/trueberryless">Ko-fi</a>.
3636+ Ich würde mich riesig freuen, wenn du mich unterstützen würdest mittels{" "}
3737+ <a href="https://www.paypal.com/donate/?hosted_button_id=WDQ5D2VQ6SWEC">
3838+ PayPal
3939+ </a>
4040+ , <a href="https://www.patreon.com/trueberryless">Patreon</a> oder{" "}
4141+ <a href="https://ko-fi.com/trueberryless">Ko-fi</a>.
3442 </Card>
3543 <Card title="Vergib einen Stern" icon="star">
3636- Gib dem Projekt auf <a href="https://github.com/trueberryless-org/mutanuq">GitHub</a> einen Stern!
4444+ Gib dem Projekt auf{" "}
4545+ <a href="https://github.com/trueberryless-org/mutanuq">GitHub</a> einen
4646+ Stern!
3747 </Card>
3848 <Card title="Verbesser gefundene Fehler" icon="pencil">
3939- Wenn dir irgendwelche inhaltlichen Fehler oder Rechtschreibfehler auffallen, klicke ganz unten auf `Seite bearbeiten`, um diese auszubessern!
4949+ Wenn dir irgendwelche inhaltlichen Fehler oder Rechtschreibfehler auffallen,
5050+ klicke ganz unten auf `Seite bearbeiten`, um diese auszubessern!
4051 </Card>
4152</CardGrid>
4253···54655566---
56675757-[Impressum](/de/imprint)
6868+[Impressum](/de/imprint/)
···22title: Command
33---
4455-Das Command Design Pattern ist auch als Action und Transaction Pattern bekannt.
55+Das Command Entwurfsmuster ist auch als Action und Transaction Pattern bekannt.
6677## Problem
88···36363737 public override void Undo() => Robot.MoveUp();
3838}
3939-```3939+```
···4455## Problem
6677-Das Singleton Design Patterns sorgt dafür, dass eine Klasse nur eine einzige Instanz haben kann. Außerdem kann auf diese eine Instanz global - im gesamten Programm - zugegriffen werden.
77+Das Singleton Entwurfsmuster sorgt dafür, dass eine Klasse nur eine einzige Instanz haben kann. Außerdem kann auf diese eine Instanz global - im gesamten Programm - zugegriffen werden.
8899## Lösung
1010···14141515## Code
16161717-Einfaches Singleton Design Pattern:
1717+Einfaches Singleton Entwurfsmuster:
18181919```csharp
2020public class Singleton
···2727}
2828```
29293030-Threadsicheres Singleton Design Pattern mittels Double-Checked-Locking-Pattern:
3030+Threadsicheres Singleton Entwurfsmuster mittels Double-Checked-Locking-Pattern:
31313232```csharp
3333public class Singleton
···5252 return _instance;
5353 }
5454}
5555-```5555+```
···11---
22-title: Design Patterns
22+title: Entwurfsmuster
33---
4455-In der Softwareentwicklung kommt es oft vor, dass ähnliche Problemstellungen gelöst werden müssen. Um bereits durchdachte Lösungen für diese Probleme effizienter umsetzen und entwickeln zu können, gibt es **Design Patterns**.
66-77-:::note[Hinweis]
88-Alle Design Patterns und Kategorien werden hier mit dem englisch Originalnamen genannt, um eine sprachliche Konsistenz zu schaffen.
99-:::
1010-1111-import { LinkCard, CardGrid } from '@astrojs/starlight/components';
1212-1313-<CardGrid>
1414- <LinkCard title="Creational Design Patterns" href="/software-development/design-patterns/creational-design-patterns/" />
1515- <LinkCard title="Structural Design Patterns" href="/software-development/design-patterns/structural-design-patterns/" />
1616- <LinkCard title="Behavioral Design Patterns" href="/software-development/design-patterns/behavioral-design-patterns/" />
1717-</CardGrid>55+In der Softwareentwicklung kommt es oft vor, dass ähnliche Problemstellungen gelöst werden müssen. Um bereits durchdachte Lösungen für diese Probleme effizienter umsetzen und entwickeln zu können, gibt es **Entwurfsmuster**.
+1-1
starlight/src/content/docs/en/imprint.md
···22title: Imprint
33template: splash
44sidebar:
55- hidden: true
55+ hidden: true
66---
7788Information according to § 5 of the Austrian E-Commerce Act (ECG)
+16-6
starlight/src/content/docs/en/index.mdx
···27272828<CardGrid stagger>
2929 <Card title="Sniff into the knowledge" icon="random">
3030- You're interested in technical college knowledge? Explore the Mutanuq universe!
3030+ You're interested in technical college knowledge? Explore the Mutanuq
3131+ universe!
3132 </Card>
3233 <Card title="Contribute to the universe" icon="add-document">
3333- Check out the project on <a href="https://github.com/trueberryless-org/mutanuq">GitHub</a> and create pull requests.
3434+ Check out the project on{" "}
3535+ <a href="https://github.com/trueberryless-org/mutanuq">GitHub</a> and create
3636+ pull requests.
3437 </Card>
3538 <Card title="Support my work" icon="rocket">
3636- I would really appreciate if you support my work, either on <a href="https://www.paypal.com/donate/?hosted_button_id=WDQ5D2VQ6SWEC">PayPal</a>, <a href="https://www.patreon.com/trueberryless">Patreon</a> or <a href="https://ko-fi.com/trueberryless">Ko-fi</a>.
3939+ I would really appreciate if you support my work, either on{" "}
4040+ <a href="https://www.paypal.com/donate/?hosted_button_id=WDQ5D2VQ6SWEC">
4141+ PayPal
4242+ </a>
4343+ , <a href="https://www.patreon.com/trueberryless">Patreon</a> or{" "}
4444+ <a href="https://ko-fi.com/trueberryless">Ko-fi</a>.
3745 </Card>
3846 <Card title="Star the project" icon="star">
3939- Give the Mutanuq project a star on <a href="https://github.com/trueberryless-org/mutanuq">GitHub</a>!
4747+ Give the Mutanuq project a star on{" "}
4848+ <a href="https://github.com/trueberryless-org/mutanuq">GitHub</a>!
4049 </Card>
4150 <Card title="Correct my mistakes" icon="pencil">
4242- If you notice any errors in content or spelling mistakes, click on `Edit page` at the bottom to correct them!
5151+ If you notice any errors in content or spelling mistakes, click on `Edit
5252+ page` at the bottom to correct them!
4353 </Card>
4454</CardGrid>
4555···57675868---
59696060-[Imprint](/en/imprint)
7070+[Imprint](/en/imprint/)