zum Verständnis einer Programmierzeile

Hallo!
Ich arbeite mich in den Arduino neu ein. Als erstes Ziel will ich ein Stroboskop bauen, welches PWM UND frequenzeinstellbar ist. Ich habe schon mehrere "klassisch analoge" Stroboskope mit LEDs gebaut (555 etc.) und konnte damit auch tolle Bilder erzeugen, da ja durch den Stroboskopeffekt schnell ablaufende Vorgänge langsamer sichtbar werden. Dabei hat sich der Frequenzbereich von ca. 20 Hz bis 2 kHz als ausreichend erwiesen. Die kürzeste Leuchtdauer war mit 10 µs für scharfe Bilder erforderlich (3x1W-LED).
So, nun zu meinem Anliegen.
Für die Generierung kurzer Impulse habe ich ein Beispiel gefunden, welches interrupt verwendet. Das erscheint mir auch angebracht. Nun will ich aber nicht nur einfach Kopieren, Einfügen als Programmierung verwenden, sondern, ich will die einzelnen Programmschritte auch verstehen, z.B..
/* Select clock source: internal I/O clock */
ASSR &= ~(1<<AS2);
das heißt doch, das an der Adresse 0xB6 eine 1 um eine Stelle nach links verschoben wird (wenn AS2 1 ist), das Ganze negiert wird, nun ein Zwischenergebnis durch UND mir ASSR gebildet wird,und das jetz neue Ergebnis in 0xB6 eingeschrieben wird?
Stimmt das, oder ist hier schon einiges falsch?
Gruß

Zuerst einmal bezweifele ich das man durch den Stroboskopeffekt etwas langsamer wahrnimmt. Ist schliesslich keine Zeitmaschine. Es ist wohl vielmehr so das man von einem Handlungsablauf höchstens noch die Hälfte wahrnimmt !

Mag sein, aber wenn Du sich wiederholende Vorgänge (z.B. den Flügelschlag einer Motte) hast macht das ja nix. :wink:

Wenn man diese leicht abweichend beleuchtest (sie z.B. vor Deinen Fernseher fliegt, welcher das Bild 50 Mal pro Sekunde neu aufbaut) dann sieht das aus als würde das Objekt (die Motte) sich in Zeitlupe bewegen (mit den Flügeln schlagen). Sieht cool aus. :slight_smile:

Hier was zu deiner anderen Frage:

AS2 ist die Bitnummer, ich würde vermute 5.
1<<AS2 ist ein Byte wo das bit AS2 gesetzt ist, also 0b00100000
~(1<<AS2) ist das vorherige invertiert, also 0b11011111
ASSR &= ~(1<<AS2); löchte das Bit AS2 in ASSTR

Geht auch einfacher und schneller mit bitClear (ASSR, AS2)

Korman

Dake für die Antworten.
natürlich wird der Vorgang selbst nicht langsamer, aber es sieht aus, als laufen schnelle Vorgänge in Zeitlupe ab. Schon bei einem eifach laufenden Wasserhahn ist es toll, wenn man nun einzelne Tropfen sehen kann. Dabei kann man sehr gute oder eben schlechtere Bilder erkennen, entsprechend der eingestellten Frequenz UND des Tastverhältnises.

Anhand des Beitrages von Korman weiß ich nun, dass also mit AS2 das entsprechende Bit dirket angesprochen wird. Das vereinfacht vieles. Ich denke auch, das die Bittschieberei hier nicht DER Weg zum Löschen eines Bits ist (siehe bitClear).

Für eine stabile, vom Programmablauf unabhängige Frequenz werde ich ein Timerinterrupt verwenden (ca 8µs). Das habe ich schon realisiert. Also z.B. taktet Digitalpin2 mit 62,5kHz (8µsEin, 8µAus). Das zeigt auch der Oszi an. Wie erreiche ich nun, das diese Frequenz geteilt wird, wobei aber die neue Ausgangsfrequenz unabhängig vom Ablauf der Hauptschleife sein soll. Später soll ein Display diese Frequenz anzeigen. das ist aber wieder Rechenarbeit, die die Ausgangsfrequenz nicht verändern soll (analog die Einstellung des Taktverhältnisses).
MfG

Anhand des Beitrages von Korman weiß ich nun, dass also mit AS2 das entsprechende Bit dirket angesprochen wird. Das vereinfacht vieles. Ich denke auch, das die Bittschieberei hier nicht DER Weg zum Löschen eines Bits ist (siehe bitClear).

Naja, so einfach sind die Dinge nun auch wieder nicht. Unter normalen Umständen ist die Bitschieberei sehr wohl DER Weg zum Löschen eines Bits. Nur zufälligerweise hat der ATmega8-Assembler einen dedizierten Befehl für diese Operation, die glücklicherweise als Inlineassemblerfunktion in der Arduino-Library effizient implementiert wurden. Deshalb ist in diesem speziellen Fall bitClear besser. Sobald aber zwei Bit gelöscht werden sollen, sind beide Methoden gleichauf und ab drei Bits ist bitClear schlechter. Die Welt ist nun mal nicht so einfach.

Korman

O.K. das merke ich mir mal genau.

Ich habe nochmal über

AS2 ist die Bitnummer, ich würde vermute 5.
1<<AS2 ist ein Byte wo das bit AS2 gesetzt ist, also 0b00100000
~(1<<AS2) ist das vorherige invertiert, also 0b11011111
ASSR &= ~(1<<AS2); löchte das Bit AS2 in ASSTR

nachgedacht. Dabei ist mir die letzte Zeile
ASSR &= ~(1<<AS2); löchte das Bit AS2 in ASSTR
unklar.

Klar ist, das das 5. Bit gelöscht wird. Aber auch ALLE ANDEREN Bits werden durch die UND-Verknüpfung 0. Sollte das so sein? Die anderen Bits sollten doch eigentlich ihre Werte behalten. Das ist aber nur gegeben, wenn sich ~ nur auf das AS2-Bit bezieht. Wo ist mein Denkfehler???

z.B: auf das Byte bezogen auf das Bit bezogen
wie oben zus. Bit wie oben zus. Bit
00100000 10100000 00100000 10100000 1<<AS2
11011111 01011111 00000000 10000000 ~(1<<AS2)
00000000 00000000 00000000 10000000 &=(1<<AS2)

Also:

1 = 0b00000001
1<<AS2 = 0b00100000
~(1<<AS2) = 0b11011111 (das ganze Byte wird invertiert, da geklammert)
ASSR &= ~(1<<AS2) = keine Bitänderung bei 1, Bitlöschung bei 0

Mit dem genannten Grundsatz "..keine Bitänderung bei 1, Bitlöschung bei 0.." ist das klar.
Die Logik warum ein UND verwendet wird ist mir aber weiter unklar (das wurmt mich).
Bei UND ist doch das Ergebnis immer 0 wenn einerl 0 ist, egal vieviele sonst noch auf 1 sind (0 ist eben durchgreifend).
Das durch die Klammer das Byte gemeint ist hatte ich auch vermutet.
Ich grübele weiter.
MfG

Ich glaube ich weiß, wo mein Denkfehler liegt. Ich habe die Operantenreihenfolge nicht richtig beachtet.
Mit 1<<AS2 und ~(1<<AS2) wird ZUERST eine Maske erzeugt, die ÜBERALL 1 ist außer bei AS2
Nun wird mit ASSR &= ~(1<<AS2) diese Maske und das aktuelle ASSR-Byte verUNDet, was alles beibehalten läßt, außer eben AS2 wird garantiert 0.
MfG

Mit 1<<AS2 und ~(1<<AS2) wird ZUERST eine Maske erzeugt, die ÜBERALL 1 ist außer bei AS2
Nun wird mit ASSR &= ~(1<<AS2) diese Maske und das aktuelle ASSR-Byte verUNDet, was alles beibehalten läßt, außer eben AS2 wird garantiert 0.

Gewonnen!

Korman