Liebes Forum,
seit einiger Zeit lese ich hier mit und habe nun selbst ein Problem
wo ich nicht mehr weiter komme.
Ich habe mir eine Diodenuhr(LED Uhr) gebaut die in der Anzeige
nur aus LED's besteht.
Das Programm dazu habe ich in Assembler für den ATmega8 geschrieben.
Nachdem die Stunden und Minutenanzeige nun fertig ist
und funktioniert, möchte ich gerne einen Sekundenkreis der aus 60 LED's
besteht implementieren.
Hierzu möchte ich das Schieberegister 74HC595
nutzen. 8 Stück davon werden benötigt (muss also kaskadiert werden).
Aus der Timer1_compare Routine springe ich in die Schieberoutine
brcs Schiebe_One ; Carry gesetzt? -> weiter bei Schiebe_One
19
cbi SCHIEBE_PORT, SIN ; PB3 eine 0 auf PIN 14 (serieller Dateneingang) vom 595
20
rjmp Schiebe_Clock ; und Sprung zur Clock Puls Generierung
21
Schiebe_One:
22
sbi SCHIEBE_PORT, SIN ;PB3 eine 1 auf PIN 14 (serieller Dateneingang) vom 595
23
24
;
25
; einen Impuls an SCK zur Übernahme des Bits nachschieben
26
;
27
Schiebe_Clock:
28
sbi SCHIEBE_PORT, SCK ;PB5 eine 1 auf PIN 11 (Schiebetakt) vom 595 = Clock-Ausgang auf 1 ...
29
cbi SCHIEBE_PORT, SCK ;PB5 eine 0 auf PIN 11 (Schiebetakt) vom 595 = und wieder zurück auf 0
30
31
dec temp2 ; Anzahl der ausgegebenen Bits runterzählen
32
brne Schiebe_1 ; Wenn noch keine 8 Bits ausgegeben -> Schleife bilden
33
34
pop temp2
35
ret
36
37
;************ Inhalt vom Schieberegister ins Ausgaberegister setzen ************************
38
SchiebeOut:
39
40
sbi SCHIEBE_PORT, RCK ;PB2 eine 1 auf PIN 12 vom 595
41
cbi SCHIEBE_PORT, RCK ;PB2 eine 0 auf PIN 12 vom 595
42
43
ret
Was ich überhaupt nicht hin bekomme, ist ein einzelnes Bit (Sekundenled)
durch das Shift Register zu schieben. Wer kann mir helfen das ich es hin
bekomme, dass bei jedem Sekundensprung nur ein Bit geschoben wird.
Im Tutorial habe ich schon einige male geschaut, aber irgendwie habe
ich wohl eine Denkblockade.
Gruß Nick
NLS (/SLCR, Pin 10 am 595) ist doch aktiv low, das Programm hält dies
aber (fast immer) auf low, wenn ich es richtig verstehe.
Ich habe so etwas noch nicht gemacht, sehe aber zwei Möglichkeiten:
- NLS-low-Puls, dann eine '1' und danach Anzahl-Sekunden-mal minus 1
eine '0' einschieben, dann Übernahme
- NLS immer high, 60 Bits durchschieben, lauter '0'en bis auf eine '1'
an der Stelle der aktuellen Sekunde, dann wieder Übernahme
Okay, eine dritte Möglichkeit, und das war wohl Ihre Idee: eine einzige
'1' einschieben, und dann jede Sekunde (mit '0'en) um eins weitertakten
- minimaler Systemaufwand, das stimmt. Dann könnte man aber sogar auf
den NLS-Anschluss auch noch verzichten, wenn man ganz am Programmanfang
einmalig 60 '0'en durchschiebt.