Bitwise AND

Hallo liebe Community :smiley:

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:

  //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

  stp_cnt = stp_cnt & 0x07;

könnte mir dabei vielleciht jemand helfen ? XD

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:

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?

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]

uwefed:
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

Hahaha, klasse danke :smiley: 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 (Google Code Archive - Long-term storage for Google Code Project Hosting.) 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 :confused:

nach Fertigstellung des Projektes folgt auch noch eine richtige dokmentation dazu ! :smiley:
Alleine schon weil es mich immer nervt wenn ich cool projekte finde und diese dann einfach nicht nachzubauen sind...

J3RE:

uwefed:
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

Cracky:
Danke erstmal :slight_smile:

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

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.

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

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 :confused:

Sequenzer2.ino (10.7 KB)

Zeile 81

#elif defined(__AVR_ATmega1280__)

was passiert wenn du AVR_ATmega1280 in AVR_ATmega2560 änderst?

das selbe in Zeile 224

Soo, hat Funktioniert :smiley: ...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...

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

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

Zeile 268

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

delay(tmp_bpm);

mit

delay(20);

ersetzen, zum Beispiel

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 !

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