Forum: Compiler & IDEs Schieberegisteransteuerung Problem


von Benedikt K. (benek)


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

von Karl H. (kbuchegg)


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?

von Benedikt K. (benek)


Lesenswert?

Vielen Dank!

Aber mit der Änderung funktioniert es immer noch nicht. Den G Eingang 
habe ich mit GND verbunden. Ich werde die Schaltung jetzt erst 
nocheinmal auf Lochraster aufbauen, weil das einfach übersichtlicher 
ist.

von Karl H. (kbuchegg)


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.

von Michael (Gast)


Lesenswert?

Benedikt K. schrieb:
> mein folgendes Programm zur Schieberegisteransteuerung funktioniert
> nicht:

Dann verrate doch einfach mal, was für ein Schieberegistertyp du 
anzusteuern versuchst. Sollte es, wie von Karl Heinz vermutet, ein 
74HC595 sein?

von Benedikt K. (benek)


Lesenswert?

Michael schrieb:
> Dann verrate doch einfach mal, was für ein Schieberegistertyp du
> anzusteuern versuchst. Sollte es, wie von Karl Heinz vermutet, ein
> 74HC595 sein?

Stimmt habe ich ganz vergessen. Ja es ist ein 74HC595. Mein Fehler lag 
aber in der Hardware/Verschaltung. Jetzt funktioniert es

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.