Forum: Mikrocontroller und Digitale Elektronik Schieberegister 74HC595


von Peter (Gast)


Lesenswert?

Hallo,

als erstes möchte ich darauf hinweisen, dass ich nicht besonders gut 
darin bin
technische Probleme, schriftlich leicht verständlich darzustellen.
Ich habe hier im Forum schon zahlreiche Beiträge zum Thema 
Schieberegister
gelesen, aber keinen Beitrag gefunden, der mir bei meinem Problem 
wirklich hilft.

Ich versuche eine LED-Uhr zu bauen und selber in Assembler zu 
programmieren.
Das bisherige Programm für die Stunden und Minutenanzeige läuft soweit 
und
wird Hardwaremäßig (LED's) richtig dargestellt

Ich verwende als µC = ATmega8 im DIL-Gehäuse - Sprache: Assembler

Nun würde ich gern die Sekunden über einen LED-Kreis anzeigen lassen.
Hierzu möchte ich das Schieberegister 74HC595 verwenden, und da nehmen
meine Probleme ihren Lauf. Ich schaffe es nicht, mit jeder Sekunde eine 
weitere einzelne LED einzuschalten (erst1, dann 2, dann 3, dann 4.....)
Zu Testzwecken habe ich ersteinmal nur zwei 74HC595 in Betrieb und die
Sekunden auf 12 reduziert (schnellerer Durchlauf zum testen)

Die 8 LED's am SR zählen auch bis 12 und werden dann gelöscht und
das Spiel beginnt von vorne (allerdings wird alles binär angezeigt 1100)
Parallel zum SR1 läuft auch mit 1 Sekunde Verzögerung das SR2 an und 
zeigt
die selben Werte wie SR1 minus1 an.

Ich wollte aber dass alle 8 LED's im SR1 leuchten und nach weiteren 4 
LED's
im SR2 die Kette gelöscht wird und dann von vorn beginnt.
Das würde ich dann auf 8 SR ausweiten wollen

Voreinstellungen in der Initialisierung
1
    ldi temp2, 1
2
    ldi temp1, 0
3
    ldi r25, 0
4
    ldi r26, 0
5
    ldi r27, 0      
6
    sbi SCHIEBE_PORT, NLS  ; PIN 10 = 1

Die ISR:
1
timer1_compare:
2
    
3
    push  temp1
4
    in    temp1, SREG  
5
    inc   SubCount
6
    cpi   SubCount,100
7
    brne  endisr
8
    clr   SubCount
9
    rcall Ausgabeziffer
10
11
12
    mov   temp1, sekunden
13
    rcall Schiebe
14
    mov   temp1, r25
15
    rcall Schiebe
16
17
    rcall SchiebeOut
18
   
19
    lsl temp1
20
    rol r25
21
22
    inc   sekunden
23
    cpi   sekunden, 12
24
    brne  endisr
25
    clr   sekunden                    ; NLS ist in der ini auf 1 gesetzt
26
    cbi   SCHIEBE_PORT, NLS ;Reset Funktion für Schieberegister = 0 auf PIN 10 vom 595
27
    sbi   SCHIEBE_PORT, NLS ;Reset Funktion für Schieberegister = 1 auf PIN 10 vom 595
28
    .
29
    .
30
    .
31
    .
32
endisr:   
33
    out   SREG, temp1      
34
    pop   temp1
35
    reti

Die Schiebefunktion
1
Schiebe:
2
    push  temp2            
3
    ldi   temp2, 8            
4
5
Schiebe_1:
6
    
7
    rol  temp1                 
8
    brcs Schiebe_One           
9
    cbi  SCHIEBE_PORT, SIN     
10
    rjmp Schiebe_Clock         
11
12
Schiebe_One:
13
    sbi  SCHIEBE_PORT, SIN    
14
15
Schiebe_Clock:
16
    sbi   SCHIEBE_PORT, SCK    ;PB5  eine 1 auf PIN 11 Schiebetakt
17
    cbi   SCHIEBE_PORT, SCK    ;PB5  eine 0 auf PIN 11 Schiebetakt
18
19
    dec   temp2                
20
    brne  Schiebe_1          
21
22
    pop   temp2
23
    ret
24
25
;************ Inhalt vom Schieberegister ins Ausgaberegister setzen ************************
26
SchiebeOut:
27
    
28
    sbi     SCHIEBE_PORT, RCK 
29
    cbi     SCHIEBE_PORT, RCK
30
    ret

Kann mir hier jemand Hilfestellung leisten, dass ich das für mich
verständlich umsetzen kann?

Vielen Dank im Voraus

von S. Landolt (Gast)


Lesenswert?

> Kann mir hier jemand Hilfestellung leisten

Um dann wieder keinerlei Reaktion zu erhalten wie am 9.? Wenn ich mich 
derart unverständlich ausgedrückt hatte, so hätten Sie das zumindest 
rückmelden können, und vielleicht hätte sich ja sogar ein Dialog 
ergeben.

von S. Landolt (Gast)


Lesenswert?

Welchen Sinn sollte es haben, den Wert von sekunden in die 
Schieberegister zu übertragen?
  Pro Sekunde, d.h. einmal in der ISR, wird eine '1' rausgeschoben (und 
mit RCK alles übernommen); zum Minutenbeginn ein Impuls auf NLS. 
Wobei, wie schon am 9. geschrieben, die Verdrahtung von NLS eingespart 
werden könnte, indem man eben zum Minutenbeginn 12 bzw. 60 mal '0' 
rausschiebt, das geht schnell genug.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Ganz vorneweg:
Ist denn dein Ansatz überhaupt "zweckmäßig", 0 .. 60 LED einzuschalten?
Macht es denn dein Netzteil mit, dass du 60 LED mit ca. 5 mA (=300 mA) 
betreibst?
Ist es "optisch ansprechend", eine ansteigende Helligkeit von 1 bis 60 
LED wahrzunehmen?

-> Vielleicht ist es ja optisch "schöner", nur EINE EINZIGE LED im Kreis 
herum hüpfen zu lassen. {das liesse sich genau so machen, nur das du 
anstelle von 1en halt 0en in deine KAskade hinein schiebst}

Nun zum Schiebe-Thema:

Klar kannst du 8 (versuchsweise auch nur 2) 74HC595 kaskadieren, un 
damit 60 LED anzusteuern.

Die Funktion der verschiedenen Leitungen (MR*, SHCP, STCP, OE*, DS) sind 
dir klar? Wie beabsichtigst du, diese anzusteuern?

Wie sieht deine Hardware-Schaltung aus?
Ich nehme an, dass du einzelne Bits "von rechts nach links" reinschieben 
möchtest, also "das ganz rechteste" Bit 2^0 der ersten Sekunde 
entspricht, das links daneben der 2^1 = zweite Sekunde etc. ??

Hier hatte ich mal eine Schieberegister-Spielerei mit 2 kaskadierten 
'595 zusammen gebaut (und was in C dazu geschrieben)
Beitrag "Tasten einer Tastatur schalten mit FET?"

versuche nun mal, nicht in Assembler-Befehlen zu denken, sondern das 
erst einmal "algorithmisch" zu erfassen, was du da machen möchtest. 
Auszug aus meiner Schieberegister-Spielerei:

1
// Nutzung der folgenden Leitungen:
2
// Port B5 = SHIFT_Data    =   SER [74595 Pin 14]
3
// Port B7 = SHIFT_Clock   =   SCK [74595 Pin 11]
4
// Port B6 = SHIFT_Strobe  =   RCK [75595 Pin 12]
5
// Port xx = Master_Reset  =   MR* [74595 Pin 10]
6
7
8
Sekunde 0:
9
Alle LED werden gelöscht [1-0-1 auf Master Reset]
10
11
für alle Sekunden 1..60 mache:
12
13
a)
14
// 1 auf SHIFT_DATA anlegen
15
16
b)
17
// 0-1-0 an Clock schiebt das an Data stehende Bit um eine Registerstelle weiter
18
//                  // 0 steht eh schon initial an
19
//  PORTB |=  (1<<SHIFT_CLOCK);   // kurzer 1 Impuls
20
//  PORTB &= ~(1<<SHIFT_CLOCK);   // und wieder auf 0 zurück setzen
21
22
c)
23
// 0-1-0 an Strobe   überträgt die eingeschobenen Daten nach draußen
24
//                  // 0 steht eh schon initial an
25
//  PORTB |=  (1<<SHIFT_STROBE);   // kurzer 1 Impuls
26
//  PORTB &= ~(1<<SHIFT_STROBE);   // und wieder auf 0 zurück setzen

: Bearbeitet durch User
von Peter (Gast)


Lesenswert?

Hallo Herr Landolt,

das ist wohl eher unglücklich gelaufen, aber da seit dem 09.04 keine
einzige weitere Reaktion erfolgte ging ich davon aus, dass das Problem
von mir nicht richtig geschildert wurde und so entschloss ich mich dies
in einem neuen Thread zu posten. War wohl nicht besonders klug von mir.

So ist z.B. der NLS Anschluss ja funktionsfähig und muss nicht durch
60 '0'en ersetzt werden.

Auch der von Ihnen geschilderte Vorgang:
Minutenbeginn: SER: 1, Schiebetakt (SCK: 0-1-0), Übernahme (RCK: 0-1-0) 
jede Sekunde:  SER: 0, Schiebetakt, Übernahme

ist nicht das Problem, sondern eher die Frage woher nehme ich die
erste '1' ganz am Anfang und dann die '0', welches Register? Es soll ja 
immer NUR eine'1' geschoben werden, aber in der Schieberoutine wird doch 
durch 'rol' das Register verändert. Das durchschieben in der Kaskade 
erfolgt ja durch die parallel geschalteten PIN 10 , 11 und 12, da muss 
man doch nur das
erste SR mit einer '1' ansprechen der Rest wird ja durch SCK geschoben.
Die Funktion des SR ist eigentlich klar, nur eben nicht wie man in
jeder Sekunde eine '1' hinterher schiebt, also bevor man schiebt, das 
temp1 entsprechend setzt.

von S. Landolt (Gast)


Lesenswert?

> nur EINE EINZIGE LED im Kreis herum hüpfen zu lassen
So hatte ich es beim letztem Mal auch verstanden, dass eben ein 
Leuchtpunkt zeigerartig umläuft.

von Stefan F. (Gast)


Lesenswert?

Peter schrieb:
> ging ich davon aus, dass das Problem
> von mir nicht richtig geschildert wurde

Das wird wohl auch dieses mal wieder der Fall sein, denn der Schaltplan 
fehlt.

von S. Landolt (Gast)


Lesenswert?

> ... woher nehme ich ...
?
Nirgendwoher, bzw. aus dem Zeitablauf:
Beim Leuchtpunkt zum Minutenbeginn eine '1', danach nur noch '0'.
Beim Leuchtband nur '1'.

Wobei beim Leuchtband wegstabenverbuchslers Frage nach der 
Stromversorgung zu beachten ist! Auch optisch halte ich den Leuchtpunkt 
für angenehmer.

von Peter (Gast)


Lesenswert?

Wegstaben V. schrieb:
> Ist denn dein Ansatz überhaupt "zweckmäßig", 0 .. 60 LED einzuschalten?
> Macht es denn dein Netzteil mit, dass du 60 LED mit ca. 5 mA (=300 mA)
> betreibst?
> Ist es "optisch ansprechend", eine ansteigende Helligkeit von 1 bis 60
> LED wahrzunehmen?

Die LED's werden mit 12 V versorgt. Hinter jedem 74HC595 ist ein
ULN2803 angeschlossen, da bleibt die Helligkeit konstant und der Strom 
ist auch kein Thema.

Eine einzelne LED laufen lassen ist allerdings auch eine optische 
Option, die man später vielleicht über einen Schalter setzen kann?

von Stefan F. (Gast)


Lesenswert?

Peter schrieb:
> Die LED's werden mit 12 V versorgt. Hinter jedem 74HC595 ist ein
> ULN2803 angeschlossen

Da hättest du gleich TPIC6B595 nehmen können, da wäre beides in einem 
Chip drin gewesen.

von Peter (Gast)


Angehängte Dateien:

Lesenswert?

Stefan ⛄ F. schrieb:
> Das wird wohl auch dieses mal wieder der Fall sein, denn der Schaltplan
> fehlt.




Der Schaltplan ist der aus dem Tutorial, die PIN Belegung:
1
.equ RCK  = 2 ;Speichertakt PIN 12 am 74595 und                    PIN 16 am ATmega8
2
.equ SCK  = 5 ;Schiebetakt SHIFT CLOCK PIN 11 am 74595             PIN 19 am ATmega8 
3
.equ SIN  = 3 ;Serieller Dateneingang PIN 14 am 74595              PIN 17 am ATmega8
4
.equ NLS  = 0 ;Reset Funktion PIN 10 vom 595 -0-1 Impuls = Reset  PIN 14 am ATmega8

von Peter (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Da hättest du gleich TPIC6B595 nehmen können, da wäre beides in einem
> Chip drin gewesen.

Das mag sein, aber den kenne ich überhaupt nicht

von S. Landolt (Gast)


Angehängte Dateien:

Lesenswert?

Vielleicht helfen diese beiden Programme als Muster.

von Stefan F. (Gast)


Lesenswert?

Peter schrieb:
> Der Schaltplan ist der aus dem Tutorial

Das ist nur ein Fragment von einem Schaltplan. Ich habe keine Lust, 
meine Freizeit für Faulenzer einzusetzen.

von Peter (Gast)


Lesenswert?

S. Landolt schrieb:
> Welchen Sinn sollte es haben, den Wert von sekunden in die
> Schieberegister zu übertragen?

Das habe ich gemacht, um zu testen ob ich überhaupt eine Funktion an den 
Ausgängen habe. Die habe ich auch, denn der Sekundenwert wird binär 
angezeigt (0001-0010-0011-0100-0101-0110......)
und hier würde ich gerne(0001-0011-0111-1111.....) haben.

von Stefan F. (Gast)


Lesenswert?

Peter schrieb:
>> Da hättest du gleich TPIC6B595 nehmen können, da wäre beides in einem
>> Chip drin gewesen.
> Das mag sein, aber den kenne ich überhaupt nicht

Jetzt kennst du ihn - für's nächste Projekt.

Hier wurde auch mal ein Chip genannt, wo sogar die Strom-Regelung mit 
drin war. Dann braucht man keine Widerstände vor den LEDs. Aber der war 
schwer zu bekommen.

Es gibt da noch einen LED Matrix IC von Maxim (MAX6963, MAX7219), die 
scheinen allerdings ein wenig kompliziert zu sein, was die 
Programmierung angeht.

Wie dem auch sei, viel Spaß mit den Schieberegistern. Was du dabei 
lernst, wirst du noch oft wieder gebrauchen können.

Dein eigentlicher Fehler war (falls das nicht klar wurde), dass du die 
Zahlen als Byte ins Schieberegister geschoben hast.
1
        binär       dezimal
2
Zahl    falsch      richtig
3
4
0       00000000    00000000
5
1       00000001    00000001
6
2       00000010    00000011
7
3       00000011    00000111
8
4       00000100    00001111
9
5       00000101    00011111
10
6       00000110    00111111
11
7       00000111    01111111
12
8       00001000    11111111

Die Umwandlung vom Binärformat ins Dezimalformat fehlt bei dir.

von S. Landolt (Gast)


Lesenswert?

> hier würde ich gerne(0001-0011-0111-1111.....) haben
S. Musterprogramm Leuchtband.

von Peter (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Das ist nur ein Fragment von einem Schaltplan. Ich habe keine Lust,
> meine Freizeit für Faulenzer einzusetzen.

Was würde denn noch fehlen? Aus der ISR wird in die Schieberoutine 
gesprungen und dort habe ich nur die 74HC595 an den PortB vom ATmega8 
mit vier
Leitungen verbunden.
1
RCK  = PB2 ;Speichertakt PIN 12 am 74595 und                    PIN 16 am ATmega8
2
SCK  = PB5 ;Schiebetakt SHIFT CLOCK PIN 11 am 74595             PIN 19 am ATmega8 
3
SIN  = PB3 ;Serieller Dateneingang PIN 14 am 74595              PIN 17 am ATmega8
4
NLS  = PB0 ;Reset Funktion PIN 10 vom 595 -0-1 Impuls = Reset  PIN 14 am ATmega8

von S. Landolt (Gast)


Lesenswert?

an Stefan Frings:
Da ja zumindest binär etwas Richtiges angezeigt wird, halte ich die 
hartnäckige Frage nach dem Schaltplan für wenig sinnvoll.

von Stefan F. (Gast)


Lesenswert?

Peter schrieb:
> Was würde denn noch fehlen?

Vergiss es, das führt in die falsche Richtung.

Zu einem vollständigen Schaltplan würde die Stromversorgung, die 
Beschaltung der Takt- und Reset-Pins und die LEDs natürlich auch 
gehören. Das brauchen wir jetzt nicht. Aber wenn du deine Anfragen 
vollständig schreibst, machen auch viel mehr fachkundige Leute mit. Mit 
schlampig hingesauten Anfragen lockst du eher die Laberköppe an, wie 
mich.

von Peter (Gast)


Lesenswert?

Ich möchte mich bei allen Beteiligten für die erbrachte Geduld bedanken.
Mein Fehler war es, dass ich immer die Schieberoutine angesprochen habe
in der immer ein ganzes Byte bearbeitet wurde. Auf die Idee die 
einzelnen
Befehle der Schiebetechnik aufzurufen bin ich nicht gekommen.
meine Lösung:
1
     sbi  Schiebe_Port, SIN
2
     sbi  SCHIEBE_PORT, SCK
3
     cbi  SCHIEBE_PORT, SCK
4
5
     rcall SchiebeOut
6
7
     inc   sekunden
8
     cpi   sekunden, 60
9
     brne  endisr
10
     clr   sekunden
11
     cbi   SCHIEBE_PORT, NLS
12
     rcall SchiebeOut
13
     sbi   SCHIEBE_PORT, NLS

Das hat mich jetzt 4 Tage gekostet. Gut, dass man sowieso daheim bleiben 
muss.
Nochmals vielen Dank

von S. Landolt (Gast)


Lesenswert?

Aha, also doch Leuchtband. Bei Dunkelheit u.U. ein interessanter Effekt.

> ... immer ein ganzes Byte ...
Tja, und eine solche Denk-Fixierung kam umgekehrt mir nicht in den Sinn. 
Solange man aber darüber redet, kann man zusammen weiterkommen (meistens 
jedenfalls).

von Charly B. (charly)


Lesenswert?

noch schnell eine etwas OT Frage hinterher,
gibts sowas wie den TPIC6B595 auch als "HiGH Side" ?

VlG
Charly

von Mario M. (thelonging)


Lesenswert?

MIC5891

von Charly B. (charly)


Lesenswert?

dankeschoen!

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.