3 Schieberegister / Drehzahlmesser

Hallo Leute!

irgendwie bin ich verzweifelt und komme einfach nicht mehr weiter. Ich versuche vergebens einen Drehzahlmesser zu programmieren.

Die Datenverarbeitung selbst funktioniert schon ganz gut jedoch scheitere ich daran die Werte über 3 Schieberegister auszugeben. Ich habe bereits einen errechneten Wert von 0-255 mit dem Verhältnis zu meiner Drehzahl (0-8000upm) Kann mir bitte jemand meinen Fehler erklären?

Hier mein Code:

[
byte rpmLedCount = map(rpm, 0, 8000, 0, 20);
byte rpmPattern = bit(rpmLedCount) - 1;

   Serial.begin(19200);
   Serial.println(rpmPattern,DEC);

   digitalWrite(latchPin, LOW);
   shiftOut(dataPin, clockPin, MSBFIRST, rpmPattern  >>16);
   shiftOut(dataPin, clockPin, MSBFIRST, rpmPattern  >>8);
   shiftOut(dataPin, clockPin, MSBFIRST, rpmPattern);
  
   digitalWrite(latchPin, HIGH);

 }

dave_neub: Kann mir bitte jemand meinen Fehler erklären?

Der Fehler ist, mit Code-Fragmenten kann keiner etwas anfangen. Poste den kompletten Sketch, damit wir auch die Zusammenhänge erkennen können.

Was genau erwartest Du denn als Ausgabe?

Bytes haben nur 8 Bit, das reicht schon mal nicht, um 24 Bit für die Ausgabe zu speichern.

Sorry, hier der ganze Code:

// Drehzahlmesser

int encoder_pin = 2;

int tDelay = 100;

int latchPin = 5;      // (11) ST_CP [RCK] on 74HC595
int clockPin = 6;      // (9) SH_CP [SCK] on 74HC595
int dataPin = 4;     // (12) DS [S1] on 74HC595

int Frequenz;
int potiwert;
int potiPin = 1;

volatile byte rpmcount;
unsigned int rpm;
unsigned long timeold;
unsigned int pulsesperturn = 1;

int rpmPattern;

void counter()
{
    //Update count
    rpmcount++;
}

#define Ausgangspin 13 // PIN13 Ausgang Frequenzerstellung mit Poti zum TEST  

void rpm_fun()
 {
   //Each rotation, this interrupt function is run twice, so take that into consideration for 
   //calculating RPM
   //Update count
      rpmcount++;
 }


void setup()
{

  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);  
  pinMode(clockPin, OUTPUT);

   //Interrupt 0 is digital pin 2, so that is where the IR detector is connected
   //Triggers on FALLING (change from HIGH to LOW)
   attachInterrupt(0, rpm_fun, FALLING);

   rpmcount = 0;
   rpm = 0;
   timeold = 0;

 // tone(Ausgangspin, Frequenz); // Frequenzerstellung
 }

 void loop()
 {
   //Update RPM every second
   delay(100);
   //Don't process interrupts during calculations
   detachInterrupt(0);
   //Note that this would be 60*1000/(millis() - timeold)*rpmcount if the interrupt
   //happened once per revolution instead of twice. Other multiples could be used
   //for multi-bladed propellers or fans
   rpm = (60*1000/pulsesperturn)/ (millis() - timeold)* rpmcount;
   timeold = millis();
   rpmcount = 0;

 // Write it out to serial port
 // Serial.begin(9600);
 // Serial.print("RPM = ");
 // Serial.println(rpm,DEC);

   //Restart the interrupt processing
   attachInterrupt(0, rpm_fun, FALLING); 

{  
byte rpmLedCount = map(rpm, 0, 8000, 0, 16);
byte rpmPattern = bit(rpmLedCount) - 1;


   Serial.begin(9600);
   Serial.println(rpmPattern,DEC);

   digitalWrite(latchPin, LOW);
  
   shiftOut(dataPin, clockPin, MSBFIRST, rpmPattern>>16);
   shiftOut(dataPin, clockPin, MSBFIRST, rpmPattern>>8);
   shiftOut(dataPin, clockPin, MSBFIRST, rpmPattern);

   digitalWrite(latchPin, HIGH);

 }

{
potiwert = analogRead(potiPin);
Frequenz = (((potiwert/4)*0.6)+35.0);
tone(Ausgangspin, Frequenz); // Frequenzerstellung mit Poti zum TEST
}
}

Weiterhin: Es macht keinen Sinn, ein einen 8 Bit Wert um 16 Bit zu verschieben.

:grin: Es sei denn, du möchtest das Nirwana umrühren. :grin:

Versteh dich schon. Wie wandle ich jetzt den Ledcount zB.: 0-20 (gibt aus wieviele Leds leuchten müssen) in 24bit um?

dave_neub: Wie wandle ich jetzt den Ledcount zB.: 0-20 (gibt aus wieviele Leds leuchten müssen) in 24bit um?

Die Variable byte rpmPattern braucht dann mindestens 24 Bits. Da es m. W. einen solchen Datentyp nicht gibt, dürfen es dann 32 Bits sein, wobei das höchste Byte ungenutzt bleibt: uint32_t rpmPattern

Ich bekomme übrigens Warnungen (Voreinstellungen der IDE):

 In function 'void loop()':
66:15: warning: integer overflow in expression [-Woverflow]
89:57: warning: right shift count >= width of type [enabled by default]

Hey Danke!!! kaum eingegeben hats schon funktioniert :)

dave_neub: Hey Danke!!! kaum eingegeben hats schon funktioniert :)

Bitte gerne, freut mich :)