[gelöst] 32 Bit Zahl in 4 x 8 Bit (Byte) zerhacken

Hallo, ich habe hier vier Schiftout Register vom Typ 74HC595 kaskadiert und die 32 Ausgänge mit Low Current LEDs und 2,2k Vorwiderständen versehen. Die Schaltung funktioniert einwandfrei wenn ich vier Bytes über die serielle Schnittstelle hineinschiebe, kann ich die 32 LEDs alle wunderbar ansteuern.

Wie kann ich es machen, daß ich einen unsigned longint (32bit) in vier Bytes zerhacken kann?

Sinn der Geschichte ist, ein 24bit breiter Adressbus und 8bit breiter Datenbus für die Ansteuerung eines SRAMs ( 2 Stück 8x512k ). Die Logik für die beiden Chips und die Adressierung sind kein Problem. Aber um eine bestimmte Adresse schreibend (später auch lesend) zuzugreifen, möchte ich nicht immer mit dem Taschenrechner 32 Bits in binär umrechnen und diese in 4 Bytes zu packen. Ich habe 1 Datenbyte und 3 Adressbytes.

Ihr wisst was ich meine?

Beispiel: unsigned long adresse = 1048575; soll 20 Adressbits einschalten.

Die Hardware ist kein Problem, aber mit der Software habe ich ehrlich gesagt noch so meine Probleme.

Edit: Schreibfehler weitestgehend beseitigt :wink:

union number
{
      long integer;
      byte bytes[4];
} ;

void loop()
{
   number num1;
   num1.integer = 20000;
}

Unions belegen für alle Bestandteile den gleichen Speicher. Dann steht in bytes[0] 32 und bytes[1] 78. 78 * 256 + 32 = 20000;

Die Alternative ist die Zahl einfach mit Shift-Operationen nach rechts zu schieben und jeweils das unterste Byte rauszugreifen.

Realizer:
Wie kann ich es machen, daß ich einen unsigned longint (32bit) in vier Bytes zerhacken kann?

Ein long hat schon vier Bytes und braucht daher nicht “zerhackt” werden.

Du brauchst zum byteweisen Zugriff eigentlich nur ein Pointer auf ein Byte-Array deklarieren, das auf die long Variable gecastet wird, und dann kannst Du auf die vier Bytes zugreifen als wären sie in einem Byte-Array gespeichert.

void setup() {
  int i;
  Serial.begin(9600);
  long test=0xAABBCCDD;
  byte* bytes=(byte*) &test;
  for (i=0;i<4;i++) Serial.print(bytes[i],HEX);
}

An dem Democode kannst Du auch sehr schön sehen, dass bei den Variablen die höherwertigen Bytes in den niedrigeren Speicheradressen gespeichert werden.

Danke @Serenifly und @jurs. :slight_smile:

Als ich das mit dem Shiften gelesen habe, legte ich sofort los und es funktioniert.

for (adresszaehler = 0; adresszaehler < 1048575; adresszaehler++) {
  
     // shift out DATA byte
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, (255));
      digitalWrite(latchPin, HIGH);

      // shift out highest byte
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, (adresszaehler >> 16));
      digitalWrite(latchPin, HIGH);
 
     // shift out high byte
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, (adresszaehler >> 8));  
      digitalWrite(latchPin, HIGH);
  
    // shift out low byte
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, adresszaehler);
      digitalWrite(latchPin, HIGH);

     delay(10); 
    }

Und das mit den Pointern und Unions werde ich mir auch mal zu Gemüte ziehen. Problem gelöst. Vieeelen Dank. :slight_smile: