Forum: Mikrocontroller und Digitale Elektronik Anfänger Schieberegister Probleme


von Nick (Gast)


Lesenswert?

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

von S. Landolt (Gast)


Lesenswert?

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

von S. Landolt (Gast)


Lesenswert?

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.

von S. Landolt (Gast)


Lesenswert?

Ausführlich:
Minutenbeginn: SER: 1, Schiebetakt (SCK: 0-1-0), Übernahme (RCK: 0-1-0)
jede Sekunde:  SER: 0, Schiebetakt, Übernahme

Ganz zu Beginn 60-mal '0' durchschieben. /SCLR fest auf 1, /OE fest auf 
0 verdrahtet.

(Keine Garantie, nur überflogen)

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.