From 892b3fb080d6eb51d2f3b173025952ce50feff1e Mon Sep 17 00:00:00 2001
From: Peter Gerwinski <peter.gerwinski@hs-bochum.de>
Date: Thu, 14 Jan 2021 16:47:46 +0100
Subject: [PATCH] Notizen und Beispiele 14.1.2021

---
 20210114/Makefile           |  8 ++++
 20210114/bit-operations.txt | 78 +++++++++++++++++++++++++++++++++++++
 20210114/blink-0.c          |  9 +++++
 20210114/blink-1.c          | 18 +++++++++
 20210114/blink-2.c          | 16 ++++++++
 20210114/blink-3.c          | 18 +++++++++
 6 files changed, 147 insertions(+)
 create mode 100644 20210114/Makefile
 create mode 100644 20210114/bit-operations.txt
 create mode 100644 20210114/blink-0.c
 create mode 100644 20210114/blink-1.c
 create mode 100644 20210114/blink-2.c
 create mode 100644 20210114/blink-3.c

diff --git a/20210114/Makefile b/20210114/Makefile
new file mode 100644
index 0000000..7ae33df
--- /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 0000000..72160be
--- /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 0000000..eebbd9e
--- /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 0000000..1b1b89b
--- /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 0000000..008bfd0
--- /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 0000000..590b619
--- /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;
+}
-- 
GitLab