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