Schieberegisteransteuerung Problem

OP #3185493
Lesenswert?

Hallo,
mein folgendes Programm zur Schieberegisteransteuerung funktioniert 
nicht:
1
#define SCL PD3 //Reset PD
2
#define SCK PD2 //Schiebetakt
3
#define RCK PD1 //Speichertakt
4
#define SER PD0 //Serieller Dateneingang
5

6
#define F_CPU
7
#include <avr/io.h>
8
#include <stdint.h>
9

10
uint8_t ShiftWert; //Wert auszushiften
11

12
void shiftOut(uint8_t data){
13
  PORTD &= ~(1<<RCK);
14
  for (int i=0; i<8; i++)
15
  {
16
    if (data & 0b1000000){
17
      PORTD |= (1<<SER);
18
    }
19
    else{
20
      PORTD &= ~(1<<SER);
21
    }
22
    
23
    PORTD |= (1<<SCK);
24
    PORTD &= ~(1<<SCK);
25
    data = data<<1;
26
  }
27
  PORTD |= (1<<RCK);
28
}
29

30
int main(void)
31
{
32
  DDRD |= (1<<SCL) | (1<<SCK) | (1<<RCK) | (1<<SER);
33
  PORTD |= (1<<SCL); //Reset deaktiviert
34
  
35
    while(1)
36
    {
37
        ShiftWert = 0b11111111;
38
    shiftOut(ShiftWert);
39
    }
40
}

Könnt ihr mir bitte sagen, ob mein Fehler in der Software liegt?

Danke schon einal im voraus,
MfG Bene
#3185530
Lesenswert?

Benedikt K. schrieb:

>     if (data & 0b1000000){

Bist du dir da ganz sicher?
(Zähl mal die Nullen)

Klarer Fall von: untauglicher Darstellung gewählt.
Schreibs als

     if (data & 0x80)

also in Hex-Schreibweise, oder als

     if (data & (1<<7))

dann passiert dir so ein Mist nicht.
Es gibt nur ganz wenige Fälle, in denen eine reine binäre Schreibweise 
tatsächlich sinnvoll ist. Der Fall hier gehört sicher nicht dazu.
Genau aus dem Grund gibt es Hex-Schreibweise, weil man bei binärer 
Schreibweise einfach zu viele Fehler macht ohne sie zu bemerken.


Wenns das noch nicht war, dann hast du noch ein Hardware-Problem.
Was hast du mit dem G-Eingang (Output Enable) gemacht?
#3185557
Lesenswert?

Benedikt K. schrieb:
> Vielen Dank!
>
> Aber mit der Änderung funktioniert es immer noch nicht.

Gut.
Dann ist noch was anderes faul.

Was genau bedeutet 'funktioniert nicht'?

Du darfst übrigens ein 595 Schieberegister beliebig langsam ansteuern. 
Wenn du da also massig delays zwischen die einzelnen Schritte einfügst, 
ein paar LED direkt an die Pins vom 595 klemmst, dann 'siehst' du, 
welche Leitung wann was in welcher Reihenfolge macht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren