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