Go Down

Topic: Problem beim verschieben von BITs von links nach rechts (Read 360 times) previous topic - next topic

File23

Hallo liebe Forum-Gemeinde,

Ich bin neu hier im Forum und auch neu bei Arduino. Habe nur wenig Vorkenntnisse mit µC. Habe mir vor einer Woche das Arduino Starter Kit zugelegt und experimentiere nun damit herum.
Ein kleines Problem hab ich nun mit meinem Programm das 16LEDs an 2 74HC595 Shiftregister angeschlossen und möchte 1 Bit von einem zum anderen ende laufen lassen und wieder zurück. Ich hab mir also 2 "for-schleifen" gemacht. Die eine schiebt das Bit 0x0001 nach links bis 0xA000 und die zweite sollte es dann wieder in die entgegengesetzte Richtung tun. Leider schalten sich nach der ersten schleife die LEDs nicht mehr ab sondern beim durchlaufen schalten sich die Bis von links nach rechts nur mehr dazu.
Am "Serial Monitor" habe ich mir das ganze dann mal angesehen und festgestellt, dass bei beginn der zweiten "for-schleife" der Zahlenwert negativ wird.

Ich würde gerne wissen wie es dazu kommt, warum werden die werte plötzlich negativ?

Hier der Code:

Code: [Select]
int clkPin = 8; // SH_CP
int writePin = 9; // ST_CP
int dataPin = 10; // DS
int abc = 0x0001;
int dly1 = 250; //delaytime

void setup(){
  pinMode(clkPin, OUTPUT);
  pinMode(writePin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  Serial.begin(9600);
  sendBytes(abc);  // Schaltet erste LED ein
  delay(dly1);
}
void loop(){
  for(int i = 0; i < 15; i++){  // Schleife nach links
    sendBytes(abc = abc << 1); 
    Serial.println(abc);
    delay(dly1);
  }

  for(int i = 0; i < 15; i++){  // Schleife nach rechts
    sendBytes(abc = abc >> 1);
    Serial.println(abc);
    delay(dly1);
  }
}
// Funktion zum Übertragen der Informationen
void sendBytes(int wert){
  digitalWrite(writePin, LOW);
  shiftOut(dataPin, clkPin, MSBFIRST, wert >> 8);
  shiftOut(dataPin, clkPin, MSBFIRST, wert & 255);
  digitalWrite(writePin, HIGH);
}


Hoffe ihr könnt mir da weiterhelfen
Cheers
Philipp

P.S.: im übrigen ist mir bewusst, dass der Code so nicht ganz sinnvoll ist. Ich möchte euch nur nicht verleiten euch darüber den Kopf zu zerbrechen. mir geht es nur darum den Sprung zu den negativen Werten zu verstehen :)

pylon

Quote
Ich würde gerne wissen wie es dazu kommt, warum werden die werte plötzlich negativ?


Weil Du die Variable als "int" deklariert hast und nicht als "unsigned int" (vorzeichenlose Ganzzahl). Das Vorzeichen wird durch das höchstwertige Bit ausgedrückt.

Die obere Grenze ist übrigens 0x8000 und nicht 0xA000 :), wenn Du nur shiftest.

File23

Vielen Dank für die schnelle Antwort. Habe mir schon gedacht, dass es was simples sein muss, die Schleife schien ja in Ordnung.
und danke für die korrektur mit 0x8000, hab nicht aufgepasst.

Cheers
Philipp

Go Up