Skip to content
Snippets Groups Projects
Commit 892b3fb0 authored by Peter Gerwinski's avatar Peter Gerwinski
Browse files

Notizen und Beispiele 14.1.2021

parent 16f3b019
No related branches found
No related tags found
No related merge requests found
%.elf: %.c
avr-gcc -Wall -Os -mmcu=atmega328p $< -o $@
%.hex: %.elf
avr-objcopy -O ihex $< $@
download:
./download.sh
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;
#include <avr/io.h>
int main (void)
{
DDRD = 0x7c; /* binär: 0111 1100 */
PORTD = 0x40; /* binär: 0100 0000 */
while (1);
return 0;
}
#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;
}
#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;
}
#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;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment