Forum: Mikrocontroller und Digitale Elektronik Problem mit Schieberegister


von warumname (Gast)


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

von Beo Bachter (Gast)


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.

von Pascal P. (pionraylz)


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).

von warumname (Gast)


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?

von Pascal P. (pionraylz)


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 ;-)

von Pascal P. (pionraylz)


Lesenswert?

Was bei dir übrigens fehlt, ist die Setup-Time.

von Dominik (Gast)


Lesenswert?

Gemäß main dürfte das maximal einmal blinken, stimmen die Pins?

Gruß Dominik

von Dietrich L. (dietrichl)


Lesenswert?

Ein Schaltplan und die Angabe über das verwendete Schieberegister wären 
auch nicht schlecht.

von Herbert B. (herbert_b)


Lesenswert?

Dietrich L. schrieb:
> Ein Schaltplan und die Angabe über das verwendete Schieberegister wären
> auch nicht schlecht.

Genau. Deshalb:

warumname schrieb:
> Es handelt sich um ein U74HC595AG der Hersteller ist leider nicht
> erkennbar.

Herbert

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.