(C / C++): Bitmanipulation mit bitweise Operatoren

Bitweises Komplement / Bitwise NOT

Der NOT-Operator (~) invertiert jedes einzelne Bit einer Zahl.

Beispiel mit 8-Bits:

 0000 0100 = 4
~0000 0100 = 1111 1011 = 251

Bitweises UND / Bitwise AND

Der AND-Operator (&) wird auf jedes einzelne Bit zwischen zwei Operanden angewendet. Das Ergebnisbit ist 1, wenn beide Bits den Wert 1 aufweisen.

Beispiel mit 4-Bits:

 0001
&1001
-----
 0001

Bitweises ODER / Bitwise OR

Der OR-Operator (|) wird auf jedes einzelne Bit zwischen zwei Operanden angewendet. Das Ergebnisbit ist 1, wenn eines der beiden Bits den Wert 1 aufweisen.

Beispiel mit 4-Bits:

 0001
|1001
-----
 1001

Bitweises exklusives ODER / Bitwise XOR

Der XOR-Operator (^) wird auf jedes einzelne Bit zwischen zwei Operanden angewendet. Das Ergebnisbit ist 1, wenn die beiden Bits unerschiedliche Werte haben.

Beispiel mit 4-Bits:

 0001
^1001
-----
 1000

Linksverschiebung / Left shift

Bei der bitweise Linksverschiebung (<<) werden alle Bits um die angegebene Position nach links verschoben.

Beispiel mit 4-Bits:

0001 << 1 = 0010
0001 << 2 = 0100

Rechtsverschiebung / Right shift

Bei der bitweise Rechtsverschiebung (>>) werden alle Bits um die angegebene Position nach rechts verschoben.

Beispiel mit 4-Bits:

0010 >> 1 = 0001
0100 >> 2 = 0001
1010 >> 1 = 0101 

Bit löschen

Will man in einem Byte mehrere Bits auf 0 setzen, wird dazu die UND-Verknüpfung verwendet.

PORTB &= ~((1 << 0)

Löscht Bit 0

Sollen gleichzeitig mehrere Bits gelöscht werden:

PORTB &= ~((1 << 0) | (1 << 2));

Löscht Bit 0 und 2 in PORTB

Bit invertieren


PORTB ^= (1 << 3);

Invertiere das dritte Bit

Bit setzen


PORTB |= (1 << 2);

Setzt das Bit 2 auf 1

Beispiel Methoden:


void set_PORTB_bit(int8_t  position, int8_t  value)
{
	// Sets or clears the bit in position 'position'
	// either high or low (1 or 0) to match 'value'.
	// Leaves all other bits in PORTB unchanged.
	
	if (value == 0)
	{
                // Set bit # 'position' low
		PORTB &= ~(1 << position);
	}
	else
	{
                // Set bit # 'position' high
		PORTB |= (1 << position);
	}
}

void set_Pin_Mode(int8_t  position, int8_t  value){
	if (value == 0)
	{
                // Set bit # 'position' to input
		DDRB  &= ~(_BV(position));
	}
	else
	{
                // Set bit # 'position' to output
		DDRB  |= (1 << position);
	}
}

Nützliche Links

mikrocontroller.net: Bitmanipulation

wikipedia: Bitweiser Operator

stackoverflow.com: How do you set, clear and toggle a single bit?

LearnCpp.Com: Bitwise operators

AVR: Unterschied zwischen sleep_cpu() und sleep_mode()

Die zwei Methoden unterscheiden sich nur beim Handling des SE-Bit. Bei der Methode sleep_cpu() muss durch den Code sichergestellt werden, dass zuvor das SE-Bit gesetzt wird und nach dem Aufwachen der CPU das SE-Bit wieder gelöscht wird.

Beispiel mit sleep_cpu():


    sleep_enable();
    sleep_cpu();
    sleep_disable();

Beispiel mit sleep_mode():


    sleep_mode();

Nützliche Links

avr-libc: sleep

AVR: ATtiny25 / ATtiny45 / ATtiny85 Sammelsurium

Zuletzt aktualisiert am: 25.11.2016

Übersicht

Microcontroller with xKB of programable memory:
Attiny13 = Microcontroller with 1KB
Attiny25 = Micocontroller with 2KB
Attiny45 = Microcontroller with 4KB
Attiny85 = Microcontroller with 8KB

CPU-Geschwindigkeit:
default: 1Mhz (Fuse bit set: CKDIV8)
max: 20MHz

Anzahl der Pins: 8Pin(s)
Anzahl der Ein-/Ausgänge: 6I/O(s)
Embedded-Schnittstelle: I2C, SPI
Versorgungsspannung, min.: 2.7V
Versorgungsspannung, max.: 5.5V

DC Current per I/O Pin: 40.0 mA
DC Current VCC and GND Pins: 200.0 mA

Pinout

ATtiny Pinout

ISP Programming

2x3-pin ISP headers
2×3-pin ISP headers

ISP Pins

Sleep Modes

Sleep-Modes


/*
 * The 5 different modes are:
 *     SLEEP_MODE_IDLE         -the least power savings
 *     SLEEP_MODE_ADC
 *     SLEEP_MODE_PWR_SAVE
 *     SLEEP_MODE_STANDBY
 *     SLEEP_MODE_PWR_DOWN     -the most power savings
 */ 
set_sleep_mode(SLEEP_MODE_IDLE);

sleep_enable(); // enables the sleep bit in the mcucr register

sleep_cpu();      // here the device is actually put to sleep
	
// -------------------------------------------------
// THE PROGRAM CONTINUES FROM HERE AFTER WAKING UP
// -------------------------------------------------
	
sleep_disable();	// disable sleep...

Power consumption

power consumption

Der Stromverbrauch wurde gemessen mit:

  • set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  • ADC deaktiviert

Siehe folgender Artikel: technoblogy.com: ATtiny Low Power

Disable Analog to Digital Converter ADC:


ADCSRA &= ~(1 << ADEN);

Disable ADC Makro:


#define adc_disable() (ADCSRA &= ~(1 << ADEN)) // disable ADC

Arduino Methode:


power_adc_disable();

Interrupt


ISR(PCINT0_vect) {     // pin change interrupt
}
ISR(INT0_vect) {       // external interrupt
}
  • ISR needed for sleep to not reset program after interrupt
  • Every PCINTx will rise PCINT0_vect
  • Typically global variables are used to pass data between an ISR and the main program. To make sure variables shared between an ISR and the main program are updated correctly, declare them as volatile.

GIMSK |= (1 << INT0);          // Enable external Interrupt

MCUCR &= (0 << ISC01);	       // The low level of INT0
MCUCR &= (0 << ISC00);         // generates an interrupt request

Interrupt 0 sense control


sei();          // enable interrupts
cli();          // disable interrupts

Arduino Methode:


interrupts ();// enable interrupts
noInterrupts(); // disable interrupts

Libraries
315Mhz and 433Mhz Manchester encoding RF library which works on Arduino and ATTiny

Nützliche Links
Atmel: ATtiny Datasheet pdf
The pinouts of the most popular AVR processors
mikrocontroller.net: AVR-Tutorial: Interrupts
gammon.com.au: Interrupts
ATtiny: Fuse Restore using HVSP
mikrocontroller.net: Sleep-Mode

MFOS Alien Screamer Noise Box

Zuletzt aktualisiert am: 02.06.2016

Klänge beeinflussen die Menschen, sie können uns faszinieren, sie erzeugen Erwartungen in uns oder aber stimmen uns traurig oder freudig. Sie können also den Gemütszustand von Menschen beeinflussen. Wie aber entstehen eigentlich Klänge? Klar, diese können mit Hilfe von Gesang, Instrumenten (Blechdosen, Klavier, Gitarre, Computer Software, Synthesizers, usw.) erzeugt werden.

Und endlich sind wir beim Thema angekommen. Dem elektronischen Erzeugen von Klängen. Wer im Internet über dieses Thema recherchiert, wird kurze Zeit später auf den Begriff „DIY-Synth“ stossen. Damit ist nichts anderes als „Do it yourself – Synthesizer“ gemeint. Klar, wer will den nicht seinen eigenen Synthesizer bauen!? Früher oder später stösst man auf die Webseite von Ray Wilson: Music From Outer Space.

Wow, die Webseite wirkt wirklich wie aus einer anderen Welt, oder doch eher aus einer anderen Zeit? Und vermutlich ist sie es auch! Den wo findet man sonst noch solche wertvollen Informationen rund um dieses Thema? Dazu stellt der Autor auch gleich viele seiner Projekte mit Schemas und Bauteillisten, mit vielen Erklärungen, zum Nachbauen zur Verfügung. Vielen herzlichen Dank Ray Willson!

Als Einstiegs-Projekt habe ich mich für die „MFOS Alien Screamer Noise Box“ entschieden, denn wie Ray Willson schreibt:

This is a fairly simple project and is perfect for a synth-diy newbie or a young person interested in synth-diy or making noise boxes. This project results in a little LO-FI noise maker you’ll find yourself playing with again and again. You will need to know how to: Read a schematic, Relate schematic diagrams to physical components, Solder, Populate a PC board, Wire the unit’s front panel components together and to the PC board., Make a simple case or build the board into something unusual.

Seine Aussage kann ich nur bestätigen, hat man sich einwenig mit seinen Plänen auseinandergesetzt und konnte alle Bauteile besorgen, ist es kein grosses Problem mehr die „Noise Box“ zu bauen. Da dürfte das beschaffen des Transistors „2N5457 N Channel JFET“ schon das grössere Problem sein. :o)

Die Schemas und Erklärungen findet ihr alles unter MFOS Alien Screamer Noise Box. Wünsche viel Spass beim Nachbauen und Ausprobieren!

Meine Version der „Noise Box“
Die Anordnung der Regler und Knöpfe, sowie das Design habe ich einwenig anders gestaltet, da ein Dinosaurier meinen kleinen Kindern mehr sagt als ein Alien. :o)

Screaming Dino: Meine Version der MFOS Alien Screamer Noise Box
Screaming Dino: Meine Version der MFOS Alien Screamer Noise Box
Innenansicht der "Noise Box"
Innenansicht der „Noise Box“
Verkabelung
Verkabelung

Anmerkung zu den verwendeten Bauteilen:

  • Anstelle des „2N5457 N Channel JFET“ kann auch die SMD-Version „MMBF5457“ verwendet werden
  • Anstelle der „1N914 High Speed Sw. Diode“ kann man die standard Diode 1N4148 verwenden, da diese die ältere Diode 1N914 ersetzt

Wird als Transistor die SMD-Version „MMBF5457“ von „2N5457“ verwendet, sieht das ganze so aus:

SMD Version „MMBF5457“
MMBF5457 das kleine schwarze Quadrat

Erweiterungen „Switched Jack Amplifier Bypass“
Wie auf der Seite MFOS beschrieben, muss man das Schema des Verstärkers einwenig anpassen, wenn der Lautsprecher bei der Verwendung des „Jack“ ruhig sein soll.

Modifizierte Verstärkerschaltung
Modifizierte Verstärkerschaltung
Jack Bypass
Jack Bypass

Nützliche Links:
Webseite von Ray Wilson: Music From Outer Space
MFOS Alien Screamer Schematik
Interessantes über Potis

Elektronik: UKW-Prüfsender

In der heutigen digitalisierten Welt, wo alle veralteten „analogen“ Techniken an Bedeutung verlieren, ist es trotzdem spannend sich diese noch anzuschauen und damit zu experimentieren. In der Schweiz wird ab 2024 auf allen analogen UKW-Sendern Funkstille herrschen, welche wir mit einer kleinen, aber dennoch spannenden Schaltung durchbrechen können. :o) Ein kleiner UKW-Sender, welcher ich auf der Seite Knolles Elektronik Bastel Page gefunden habe, eignet sich hervorragend für Experimente. Die Qualität des übertragenen Signals, scheint mir aus Laiensicht völlig in Ordnung.

Alle wichtigen Informationen zum Bau und der Justierung der Senderfrequenz findet ihr hier: UKW-Prüfsender 3

Datenblatt UKW-Sender
Datenblatt UKW-Sender
UKW-Prüfsender
Meine Version des UKW-Prüfsenders

Nützliche Links
Knolles Elektronik Bastel Page
News – digitalradio Schweiz