diff --git a/20210114/Makefile b/20210114/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..7ae33df99f68fcf460324cfbb008f3f7a3863638
--- /dev/null
+++ b/20210114/Makefile
@@ -0,0 +1,8 @@
+%.elf: %.c
+	avr-gcc -Wall -Os -mmcu=atmega328p $< -o $@
+
+%.hex: %.elf
+	avr-objcopy -O ihex $< $@
+
+download:
+	./download.sh
diff --git a/20210114/bit-operations.txt b/20210114/bit-operations.txt
new file mode 100644
index 0000000000000000000000000000000000000000..72160be53e7c5ae912714d2d9cb709747536f6f7
--- /dev/null
+++ b/20210114/bit-operations.txt
@@ -0,0 +1,78 @@
+a = 0100 1111   Bit Nr. 4 auf 1 setzen
+       ^
+    0100 1111
+  | 0001 0000   bitweise Oder-Verknüpfung mit Bit-Maske
+    ---------                                     ~~~~~
+    0101 1111   b = a | mask;
+
+a = 0100 1111   Bit Nr. 4 auf 0 setzen
+  & 1110 1111   bitweise Und-Verknüpfung mit Bit-Maske
+    ---------                                    ~~~~~
+    0100 1111   b = a & mask;
+
+                a = a & mask;
+                a &= mask;
+
+a = 0100 1111   Bit Nr. 6 auf 0 setzen
+  & 1011 1111   bitweise Und-Verknüpfung mit Bit-Maske
+    ---------                                    ~~~~~
+    0000 1111   a &= mask;
+
+Woher bekomme ich die Maske?
+
+  Verschiebe-Operationen:
+    1001 0010 << 2 = 0100 1000   (Die 1 ganz links wurde aus der 8-Bit-Zahl herausgeschoben und geht verloren.)
+    1001 0010 >> 2 = 0010 0100   (Die 1 rechts wurde aus der 8-Bit-Zahl herausgeschoben und geht verloren.)
+
+    Zahl << 3 = Zahl * 2 hoch 3 = Zahl * 8
+
+  Was wurde herausgeschoben?
+
+    1001 0010 >> 2
+           ~~
+  = 1001 0010
+  & 0000 0011   Maske für die 2 Bits, die gleich herausgeschoben werden
+    ---------
+    0000 0010   Wert ermittelt, der durch ">> 2" verloren gehen wird
+
+Bei Bitverschiebungen schiebt man normalerweise Nullen hinein.
+Ausnahme: negative Zahlen (int) nach rechts schieben --> mit Einsen aufgefüllt
+          (in der Praxis eher unüblich)
+
+Daher verwendet man für Bit-Operationen normalerweise vorzeichenlose Variablen (unsigned)
+anstelle von vorzeichenbehafteten (int)
+
+Maske bauen:  1 << Nr. des Bits
+
+a = 0100 1111   Bit Nr. 4 auf 1 setzen
+       ^
+    0100 1111
+  | 0001 0000   Maske = 1 << 4
+    ---------
+    0101 1111   a |= 1 << 4;
+
+a = 0100 1111   Bit Nr. 6 auf 0 setzen
+  & 1011 1111   Maske = ~(1 << 6)
+    ---------
+    0000 1111   a &= ~(1 << 6);
+
+a = 0100 1111   Zweites Bit von links auf 0 setzen
+  & 1011 1111   Maske = ~(0x80 >> (2 - 1))
+    ---------
+    0000 1111   a &= ~(0x80 >> 1);
+
+Exklusiv-Oder
+
+a = 0100 1111   Bit Nr. 4 umklappen
+       ^
+    0100 1111
+  ^ 0001 0000   Maske = 1 << 4
+    ---------
+    0101 1111   a ^= 1 << 4;
+
+a = 0100 1111   Bit Nr. 6 umklappen
+     ^
+    0100 1111
+  ^ 0100 0000   Maske = 1 << 6
+    ---------
+    0000 1111   a ^= 1 << 6;
diff --git a/20210114/blink-0.c b/20210114/blink-0.c
new file mode 100644
index 0000000000000000000000000000000000000000..eebbd9e5380e1d38a7e04def7099db9d56cf7770
--- /dev/null
+++ b/20210114/blink-0.c
@@ -0,0 +1,9 @@
+#include <avr/io.h>
+
+int main (void)
+{
+  DDRD = 0x7c;   /* binär: 0111 1100 */
+  PORTD = 0x40;  /* binär: 0100 0000 */
+  while (1);
+  return 0;
+}
diff --git a/20210114/blink-1.c b/20210114/blink-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..1b1b89bfc8426b37c6c10e6dd4583c53604d28e1
--- /dev/null
+++ b/20210114/blink-1.c
@@ -0,0 +1,18 @@
+#include <avr/io.h>
+
+#define F_CPU 16000000l
+#include <util/delay.h>
+
+int main (void)
+{
+  DDRD = 0x7c;
+  PORTD |= 0x40;
+  while (1)
+    {
+      _delay_ms (500);
+      PORTD &= ~0x40;
+      _delay_ms (500);
+      PORTD |= 0x40;
+    }
+  return 0;
+}
diff --git a/20210114/blink-2.c b/20210114/blink-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..008bfd0c34ba4943318bb1aa1389cd6c96303f27
--- /dev/null
+++ b/20210114/blink-2.c
@@ -0,0 +1,16 @@
+#include <avr/io.h>
+
+#define F_CPU 16000000l
+#include <util/delay.h>
+
+int main (void)
+{
+  DDRD = 0x7c;
+  PORTD = 0x40;
+  while (1)
+    {
+      _delay_ms (250);
+      PORTD ^= 0x40;
+    }
+  return 0;
+}
diff --git a/20210114/blink-3.c b/20210114/blink-3.c
new file mode 100644
index 0000000000000000000000000000000000000000..590b6197d1f070e58b01354970410c217c5e3228
--- /dev/null
+++ b/20210114/blink-3.c
@@ -0,0 +1,18 @@
+#include <avr/io.h>
+
+#define F_CPU 16000000
+#include <util/delay.h>
+
+int main (void)
+{
+  DDRD = 0x7c;
+  PORTD = 0x40;
+  while (1)
+    {
+      while ((PIND & 0x02) == 0)
+        ; /* just wait */
+      PORTD ^= 0x40;
+      _delay_ms (200);
+    }
+  return 0;
+}