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
1 | timer1_compare:
|
2 | push temp1
|
3 | in temp1, SREG
|
4 | inc SubCount
|
5 | cpi SubCount,100
|
6 | brne endisr
|
7 | clr SubCount
|
8 | rcall Ausgabeziffer
|
9 |
|
10 | ;************** Sekundenkreisroutine ****************************
|
11 | ;/*
|
12 | sekundenkreis:
|
13 |
|
14 | rcall Testschiebe ; hier wird jede Skunde in die Testroutine gesprungen
|
15 |
|
16 |
|
17 | inc sekunden
|
18 | cpi sekunden, 60
|
19 | brne endisr
|
20 | clr sekunden
|
21 | sbi SCHIEBE_PORT, NLS;PB0 nach 60 Sekunden Reset Funktion für Schieberegister = 1 auf PIN 10 vom 595
|
22 | cbi SCHIEBE_PORT, NLS;PB0 nach 60 Sekunden Reset Funktion für Schieberegister = 0 auf PIN 10 vom 595
|
Die Schieberoutine sieht wie folgt aus
1 | Testschiebe:
|
2 |
|
3 | ldi temp1, 1 ;Das ist der Vorgabewert für den SIN
|
4 | rcall Schiebe
|
5 | rcall SchiebeOut ;PB2 PIN 12 vom 595 = 1 - 0 = Inhalt des Schieberegisters ins Ausgangsregister
|
6 |
|
7 | ret
|
8 |
|
9 | ;**************** Schieberoutine ****************************
|
10 | ;/*
|
11 | Schiebe:
|
12 | push temp2
|
13 | ldi temp2, 8 ; 8 Bits müssen ausgegeben werden
|
14 |
|
15 | Schiebe_1:
|
16 |
|
17 | rol temp1 ; 1,2,4,8,16,32,64,128 bis Carry Flag
|
18 | 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