Problem mit Schieberegister

Gast #5320252
Lesenswert?

Hallo zusammen,
nachdem ich mir die Anleitung im Forum durchgelesen habe, hab ich mich 
vorhin mal an ein Schieberegister gewagt.

Leider blinken die angeschlossen Leds nur wild. Eigentlich sollten zwei 
der vier angeschlossenen Leds leuchten und zwei nicht.

Hier der Code:
1
#define F_CPU 16000000UL
2

3
#include <avr/io.h>
4
#include <util/delay.h>
5

6
#define SCK  PB1
7
#define RCK PB2
8
#define SER  PB3
9

10

11
int p_RCK (void)
12
{
13
  PORTB &= ~(1<<RCK);
14
  PORTB |=  (1<<RCK);
15
  _delay_us(1);
16
  PORTB &= ~(1<<RCK);
17
}
18

19
int p_SCK (void)
20
{
21
  PORTB &= ~(1<<SCK);
22
  PORTB |=  (1<<SCK);
23
  _delay_us(1);
24
  PORTB &= ~(1<<SCK);
25
}
26

27
int s_SER (bool x)
28
{
29
  if (x==0)
30
  {
31
    PORTB &= ~(1<<SER);
32
  }
33
  
34
  if (x==1)
35
  {
36
    PORTB |= (1<<SER);
37
  }
38
}
39

40
int main(void)
41
{
42
  DDRB |=(1<<SCK);
43
  DDRB |=(1<<RCK);
44
  DDRB |=(1<<SER);
45
  
46
    
47
    while (1) 
48
    {
49
    s_SER(1);
50
    
51
    p_SCK();
52
    p_SCK();
53
    
54
    s_SER(0);
55
    
56
    p_SCK();
57
    p_SCK();
58
    
59
    p_RCK();
60
    
61
    _delay_ms(1000);  
62
    
63
    }
64
}

Des weiteren war ich mir unsicher wie lange der Impuls sein muss.

Über Hilfe würde ich mich sehr freuen.

mfG
Gast #5320260
Lesenswert?

warumname schrieb:
> Eigentlich sollten zwei
> der vier angeschlossenen Leds leuchten und zwei nicht.

Da hast du die Funktionalität eines Schiebregisters noch
nicht verstanden, jedenfalls spiegelt sich dessen Anforderung
nicht wirklich in deinem Code wieder.

Studier nochmal das Datenblat eines Schiebregisters genau,
im Speziellen schaue dir die dargebotenen Daten-Diagramme
an.
#5320268
Lesenswert?

Ob die Mikrosekunde bei für SCK und RCK ausreicht, sollte aus dem 
Datenblatt des Schieberegisters hervorgehen.
Welches Schieberegister ist es denn?

Ansonsten ist zu vermuten, dass sich durch die aufeinander folgenden 
Schiebeoperationen die HIGH-Bits "verschieben" (und das dann nach RCK zu 
einem Blinken der LEDs führt).
Gast #5320279
Lesenswert?

Danke erstmal für eure schnellen Antworten

Beo Bachter schrieb:
> Da hast du die Funktionalität eines Schiebregisters noch
> nicht verstanden, jedenfalls spiegelt sich dessen Anforderung
> nicht wirklich in deinem Code wieder.

meinst du damit das ein Schieberegister für eine derartige Aufgabe nicht 
nötig ist? Das ist mir bewusst. Habe es ja auch nur zum testen und 
lernen in Betrieb.

Beo Bachter schrieb:
> Studier nochmal das Datenblat eines Schiebregisters genau,
> im Speziellen schaue dir die dargebotenen Daten-Diagramme
> an.

Danke für den Tipp.

Pascal P. schrieb:
> Ob die Mikrosekunde bei für SCK und RCK ausreicht, sollte aus dem
> Datenblatt des Schieberegisters hervorgehen.

Hab nachgeschaut. Die Zeiten liegen alle im ns Bereich, also deutlich 
unter meiner ms. Danke für den Hinweis.

Pascal P. schrieb:
> Welches Schieberegister ist es denn?

Es handelt sich um ein U74HC595AG der Hersteller ist leider nicht 
erkennbar. Habe bereits versucht den Herauszufinden um das richtige 
Datenblatt zu nehmen.
Aber zu "UTC TCTA" habe ich nix gefunden.

Pascal P. schrieb:
> Ansonsten ist zu vermuten, dass sich durch die aufeinander folgenden
> Schiebeoperationen die HIGH-Bits "verschieben" (und das dann nach RCK zu
> einem Blinken der LEDs führt).

Dann müsste das Flackern doch im us Bereich liegen oder? Bei mir liegt 
das Flackern aber eher im bereich von einigen Herz. Ich werde mal 
versuchen herauszufinden ob es daran liegt. Dazu am besten zwischen die 
einzelnen Schiebeaktionen delays einbauen oder wie würdet ihr da 
vorgehen?
#5320292
Lesenswert?

> Dann müsste das Flackern doch im us Bereich liegen oder?

Eher im Sekundenbereich (ca. 1), da sich der Zustand ja nur etwa* jede 
Sekunde ändern sollte. Wenn es "einige Hertz" sind, stellt sich die 
Frage nach der CPU-Frequenz. Sind die 16MHz korrekt?

> wie würdet ihr da vorgehen?
Ähnlich wie du, aber zuerst mal einen Reset einbauen (oder immer 8 bit 
reinschieben). Bei jedem anderen Wert als 4 Bit (LED's) würde sich sonst 
der Ausgangswert verschieben...

* Kommentar der Funktion _delay_ms mal anschauen ;-)

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