Pages: [1]   Go Down
Author Topic: Bitwise AND  (Read 1180 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo liebe Community smiley-grin

Ich habe ein Problem und zwar möchte ich gerne einen Source Code meinem Projekt anpassen aber bin dabei auf ein Problem gestoßen, welches mein Fähigkeiten übersteigt.

Am besten ich poste einfach mal den Code Fetzen:

Code:
  //Seqencer stepping.
  digitalWrite(SEQ_STP1,LOW);
  digitalWrite(SEQ_STP2,LOW);
  digitalWrite(SEQ_STP3,LOW);
  digitalWrite(SEQ_STP4,LOW);
  digitalWrite(SEQ_STP5,LOW);
  digitalWrite(SEQ_STP6,LOW);
  digitalWrite(SEQ_STP7,LOW);
  digitalWrite(SEQ_STP8,LOW);
  digitalWrite(SEQ_STP9,LOW);
  digitalWrite(SEQ_STP10,LOW);
  digitalWrite(SEQ_STP11,LOW);
  digitalWrite(SEQ_STP12,LOW);
  digitalWrite(SEQ_STP13,LOW);
  digitalWrite(SEQ_STP14,LOW);
  digitalWrite(SEQ_STP15,LOW);
  digitalWrite(SEQ_STP16,LOW);
 
  stp_cnt = stp_cnt & 0x07;
  switch(stp_cnt){
    case  0:
      digitalWrite(SEQ_STP1,HIGH);
      break;
    case  1:
      digitalWrite(SEQ_STP2,HIGH);
      break;
    case  2:
      digitalWrite(SEQ_STP3,HIGH);
      break;
    case  3:
      digitalWrite(SEQ_STP4,HIGH);
      break;
    case  4:
      digitalWrite(SEQ_STP5,HIGH);
      break;
    case  5:
      digitalWrite(SEQ_STP6,HIGH);
      break;
    case  6:
      digitalWrite(SEQ_STP7,HIGH);
      break;
    case  7:
      digitalWrite(SEQ_STP8,HIGH);
      break;
    case  8:
      digitalWrite(SEQ_STP9,HIGH);
      break;
    case  9:
      digitalWrite(SEQ_STP10,HIGH);
      break;
    case  10:
      digitalWrite(SEQ_STP11,HIGH);
      break;
    case  11:
      digitalWrite(SEQ_STP12,HIGH);
      break;
    case  12:
      digitalWrite(SEQ_STP13,HIGH);
      break;
    case  13:
      digitalWrite(SEQ_STP14,HIGH);
      break;
    case  14:
      digitalWrite(SEQ_STP15,HIGH);
      break;
    case  15:
      digitalWrite(SEQ_STP16,HIGH);
      break;
  }

  stp_cnt++;
 
  delay(tmp_bpm);

Das Ganze ist im void loop drinne und soll LEDs als lauflicht sozusagen aufblinken lassen die länge, wie lange sie aufleuchten und in welchem abstand wird über 2 Potis kontorliert.

So, jetzt bin ich aber über folgendes Problem gestolpert: der Code war uhrsprünglich nur für 8 schritte (0-7) gedacht, ich habe es jetzt aber auf 16 (0-15) erweitert und komme jetzt mit der Bitwise Operation nicht klar, die dort verwendet wurde
Code:
  stp_cnt = stp_cnt & 0x07;

könnte mir dabei vielleciht jemand helfen ?  smiley-lol

Danke schonmal !

Achja, bevor ich es vergesse, ich habe einen Arduino Mega 2560 und es gibt ja einen bestimmten Programmblock, der sieht ungefär so für den Mega 1280 aus:
Code:
TCCR3A = _BV(COM3C1) | _BV(WGM30);
TCCR3B = _BV(CS30);
TIMSK3 = _BV(TOIE3);

Dieser erhöht ja die frequenz der Pulsweitenmodulation, allerings weiß ich nicht wie dieser für den Mega 2560geht und ich finde ihn auch nitgends, kann mir da vielleicht jemand helfen?
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 272
Posts: 21940
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

stp_cnt = stp_cnt & 0x07;

Du und-veknüpfst den Zähler der LED mit B0000 0111. Das ist gleichbedeutend die Bit 7 bis 4 zu löschen.
Der obengenannte Code entspricht:
if (stp_cnt >=8 )stp_cnt=0;

Für 16 LED also:
stp_cnt = stp_cnt & 0x15;  //B0000 1111
stp_cnt = stp_cnt & 0x0f;  //B0000 1111
oder
if (stp_cnt >=16 )stp_cnt=0;

Das mit der PWM-Frequenz kann ich Dir nicht weiterhelfen.

Grüße Uwe

[EDIT] Fehler ausgebessert[/EDIT]
« Last Edit: January 23, 2013, 05:02:36 pm by uwefed » Logged

Austria
Offline Offline
Full Member
***
Karma: 2
Posts: 107
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Für 16 LED also:
stp_cnt = stp_cnt & 0x15;  //B0000 1111

Das ist falsch oder!?
0x15 entspricht ja B0001 0101

Es müsste 0x0F sein. B0000 1111


PWM verwendest du ja garnicht.
Oder für was brauchst du das?


Grüße,
J3RE
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hahaha, klasse danke smiley-grin 0x0F funktioniert :3 Endlich !

Also, das ganze wird bzw ist ein Sequencer zum musik machen und dafür brauche ich eben die erhöhung der Pulweitenmodulation, damit das ganze besser klingt, der Code den ich habe basiert auf dem Auduino Projekt (http://code.google.com/p/tinkerit/wiki/Auduino) nur etwas modeliert für die Steps des Sequenzers.

Im Programmcode für Auduino ist diese Frequenzerhöhung drinne, allerdings nur für boards wie das MEGA 1280 aber leider nicht für meins... und ich weiß auch leider nicht wo ich so etwas finde :/

nach Fertigstellung des Projektes folgt auch noch eine richtige dokmentation dazu ! smiley-grin
Alleine schon weil es mich immer nervt wenn ich cool projekte finde und diese dann einfach nicht nachzubauen sind...
« Last Edit: January 23, 2013, 05:04:10 pm by Cracky » Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 272
Posts: 21940
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Für 16 LED also:
stp_cnt = stp_cnt & 0x15;  //B0000 1111
Das ist falsch oder!?
0x15 entspricht ja B0001 0101
Es müsste 0x0F sein. B0000 1111

ops Falsch gerechnet.
15 dezimal und 0F hexadezimal.
Ich bitte um Entschuldigung.
Uwe
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 272
Posts: 21940
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Danke erstmal smiley

Ich habe das gerade mal ausprobiert, jetzt wechselt er allerdings nur die gesammte Zeit von der ersten zu zweiten LED :S

Dann bitte gesamten Sketch.
Grüße Uwe
Logged

Offline Offline
Full Member
***
Karma: 3
Posts: 138
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Da die Hälfte des Codes fehlt, sagt meine Kristallkugel: falsche Präprozessor-Direktive.

Der 1280 ist dem 2560 sehr ähnlich, Unterschiede gibt's nur bei der Grösse der verschiedenen Speicher.
Logged

duemilanove / OSX & WIN
Arduino & Teensy: http://bit.ly/13rbdtQ

Offline Offline
Newbie
*
Karma: 0
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Das mit den 2 LEDs hat sich bereits mit dem 0x0f erledigt smiley-grin

Allerdings habe ich jetzt das Problem, dass nach einen Durchlauf eine recht große Pause ist, könnte aber auch am rest des Programmes liegen, ich poste es einfach mal (datei im Anhang weil zu langer Code)

Ich habe nun auch das Problem, dass er keinen Ton ausgibt und ich dachte das  könnte vielleicht an den Registern liegen :/

* Sequenzer2.ino (10.7 KB - downloaded 18 times.)
Logged

Offline Offline
Full Member
***
Karma: 3
Posts: 138
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Zeile 81
Code:
#elif defined(__AVR_ATmega1280__)
was passiert wenn du __AVR_ATmega1280__ in __AVR_ATmega2560__ änderst?

das selbe in Zeile 224
Logged

duemilanove / OSX & WIN
Arduino & Teensy: http://bit.ly/13rbdtQ

Offline Offline
Newbie
*
Karma: 0
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Soo, hat Funktioniert smiley-grin ...man darauf hätte ich selbst kommen können ...

Allerdings ist für mich immernoch Fragwürdig, das er eine so große lücke zwischen den durchläufen hat, als ob er noch versucht ein paar leds mehr zum leuchten zu bringen...
Logged

Hamburg, Germany
Offline Offline
Sr. Member
****
Karma: 6
Posts: 291
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich hab den Sketch nur überflogen, aber digitalWrite z.B. ist saulahm. Das kann man alles noch sehr optimieren...
Logged


Offline Offline
Full Member
***
Karma: 3
Posts: 138
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wie lange ist denn die ungewollte Pause, eine halbe Sekunde, zwei Sekunden, .. ?

Zeile 268
Code:
uint16_t tmp_bpm = analogRead(FUNC_SELECTOR2);
hast du ein Potentiometer angeschlossen an A4? Und dieses auf den minimalen Wert gestellt.

Damit stellst du am Ende von loop das delay ein.

Testweise kannst du auch den Aufruf von delay direkt modifizieren, Zeile 367

Code:
delay(tmp_bpm);
mit
Code:
delay(20);
ersetzen, zum Beispiel
« Last Edit: January 24, 2013, 12:52:36 pm by thewknd » Logged

duemilanove / OSX & WIN
Arduino & Teensy: http://bit.ly/13rbdtQ

Offline Offline
Newbie
*
Karma: 0
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hmm, ja das könnte man machen, ich habe jetzt allerdings einfach die AND abfrage gegen den Zähler ausgetauscht und das hat auch schon funktioniert !
Logged

0
Offline Offline
Faraday Member
**
Karma: 24
Posts: 3501
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Was Lauflichter angeht: kennst Du schon meinen Blog? Wenn nein willst Du von dort sicher ein paar Ideen übernehmen smiley-wink
Logged

Check out my experiments http://blog.blinkenlight.net

Pages: [1]   Go Up
Jump to: