Pages: [1]   Go Down
Author Topic: zum Verständnis einer Programmierzeile  (Read 954 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 6
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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ß
Logged

0
Offline Offline
Edison Member
*
Karma: 20
Posts: 1980
Wo ein Wille ist, da ist auch ein Weg !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 !
Logged

Mein Arduino Projekte Blog:
http://ardu-megatank.blogspot.de/

Weinsberg, Germany
Offline Offline
God Member
*****
Karma: 3
Posts: 773
A Coder's Tale
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Mag sein, aber wenn Du sich wiederholende Vorgänge (z.B. den Flügelschlag einer Motte) hast macht das ja nix. smiley-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. smiley
« Last Edit: December 10, 2010, 08:44:29 am by Joghurt » Logged

Central Europe
Offline Offline
Edison Member
*
Karma: 7
Posts: 1220
Use the Source, Luke.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 6
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Central Europe
Offline Offline
Edison Member
*
Karma: 7
Posts: 1220
Use the Source, Luke.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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
« Last Edit: December 11, 2010, 04:54:26 am by Korman » Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 6
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

O.K. das merke ich mir mal genau.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 6
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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)
Logged

Munich/Germany
Offline Offline
God Member
*****
Karma: 11
Posts: 643
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: December 11, 2010, 12:42:55 pm by MaFu » Logged

_______
Manfred

0
Offline Offline
Newbie
*
Karma: 0
Posts: 6
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 6
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Central Europe
Offline Offline
Edison Member
*
Karma: 7
Posts: 1220
Use the Source, Luke.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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
Logged

Pages: [1]   Go Up
Jump to: