Forum: Mikrocontroller und Digitale Elektronik Frage zum 74595 Schieberegister


von Peter B. (pebez)


Lesenswert?

Hallo,

als Anfänger habe ich eine für euch wohl simple Frage, also bitte nicht
totlachen.
Ich habe aus dem Tut die Kaskadierung nachgebaut.

Hardware:
Atmega 8 , 3 x 74595 , 24 x LED LOW Current , 24 x 330 Ohm

Um keinen statischen Ausgang zu haben, hab ich das Programm so 
abgeändert,
dass ein ständiger Laufeffekt entsteht.

.include "m8def.inc"
.def temp1 = r16
.equ SCHIEBE_DDR  = DDRB
.equ SCHIEBE_PORT = PORTB
.equ RCK          = PB2     ; SS
.equ SCK          = PB5     ; SCK
.equ SIN          = PB3     ; MOSI

main:
    ldi   temp1, LOW(RAMEND)
    out   SPL, temp1
    ldi   temp1, HIGH(RAMEND)
    out   SPH, temp1

;
; SCK, MOSI, SS als Ausgänge schalten
;
    in    temp1,SCHIEBE_DDR
    ori   temp1,(1<<SIN) | (1<<SCK) | (1<<RCK)
    out   SCHIEBE_DDR,temp1
;
; SPI Modul konfigurieren
;
    ldi   temp1, 0b01010000
    out   SPCR, temp1           ; keine Interrupts, MSB first, Master
                                ; CPOL = 0, CPHA =0
                                ; SCK Takt = 1/2 XTAL
    ldi   temp1,1
    out   SPSR,temp1            ; double speed aktivieren
    out   SPDR,temp1            ; Dummy Daten, um SPIF zu setzen
;
; Ein Datenbyte ausgeben

    ldi   temp1, 0x01
Ausgabe:
    rcall Schiebe               ; Daten schieben
    rcall SchiebeOut            ; Daten in Ausgangsregister übernehmen

dly:
    dec r20                ; von mir geändert
    brne dly               ;
    dec r21                ;
    brne dly               ;
    rol temp1              ;
    cpi temp1, 0xFF        ;
    rjmp ausgabe           ; bis hierhin

loop:
    rjmp  loop

SchiebeOut:
    sbis  SPSR,7
    rjmp  SchiebeOut
    sbi   SCHIEBE_PORT, RCK
    cbi   SCHIEBE_PORT, RCK
    ret

Schiebe:
    sbis    SPSR,7
    rjmp    Schiebe
    out     SPDR,temp1
    ret

Das funktioniert soweit alles.

Nun würde ich gern folgendes realisieren wollen:
Eine einzelne LED durchlaufen lassen von 1 - 24, also immer nur eine
LED ON alle anderen OFF.
So wie ich es jetzt habe laufen alle 3  74595 synchron also sind immer
min. 3 Led'S ON.

Kann mir hier jemand, unter Berücksichtigung das ich Anfänger bin, einen
Tipp oder noch besser eine Lösung mitteilen?

Vielleicht habe ich den Gaul auch von der falschen Seite aufgezäumt :-)

Gruß  Peter

von Marcel S. (marcel_74)


Lesenswert?

Hallo!

Wie hast Du denn die drei Schieberegister angeschlossen? Wenn Du sie 
alle tatsächlich parallel angeschlossen hast, leuchten auch mindestens 
immer drei LEDs.

Wenn Du sie kaskadiert hast, musst du alle Bits durch alle SRs 
durchschieben, bei drei 8Bit-SRs also 24Bits.

Alternativ kannst Du aber z.B. auch die Datenleitungen aller SR 
miteinander verbinden und z.B. die Clock-Leitungen einzeln an den uP 
legen. Dann taktest Du nur in das gewünschte SR.

Es gibt viele Möglichkeiten... Hast Du noch ein paar zusätzliche Infos, 
z.B. mal den Schaltplan DEINER Schaltung? Dann könnte man besser helfen.

Viele Grüße
Marcel

von Peter B. (pebez)


Angehängte Dateien:

Lesenswert?

Hallo,

danke für die schnelle Reaktion.

Anbei das Schaltbild aud dem Tut.

Gruß Peter

von Falk B. (falk)


Lesenswert?

@  Peter Bednarz (pebez)

>Das funktioniert soweit alles.

Schön zu hören.

>Nun würde ich gern folgendes realisieren wollen:
>Eine einzelne LED durchlaufen lassen von 1 - 24, also immer nur eine
>LED ON alle anderen OFF.

Kein Problem. Man muss nur den Schiebebefehl auf drei Register 
ausweiten.

>Kann mir hier jemand, unter Berücksichtigung das ich Anfänger bin, einen
>Tipp oder noch besser eine Lösung mitteilen?
1
; oben reinschreiben.
2
3
.def temp2 = r17
4
.def temp3 = r18
5
.def temp4 = r19
6
.def cnt   = r20
7
8
Anfang:
9
    ldi   temp2, 0x01           ; Anfangsmuster laden
10
    ldi   temp3, 0x00
11
    ldi   temp4, 0x00
12
    ldi   cnt, 24               ; Schleifenzähler laden
13
Ausgabe:
14
    mov   temp1, temp2
15
    rcall Schiebe               ; Daten schieben
16
    mov   temp1, temp3
17
    rcall Schiebe               ; Daten schieben
18
    mov   temp1, temp4
19
    rcall Schiebe               ; Daten schieben
20
    rcall SchiebeOut            ; Daten in Ausgangsregister übernehmen
21
22
dly:
23
    dec r20                ; von mir geändert
24
    brne dly               ;
25
    dec r21                ;
26
    brne dly               ;
27
                           ; schieben über drei Byte
28
    lsl temp2              ;
29
    rol temp3
30
    rol temp4
31
    dec cnt                ; Schleifenzähler verringern
32
    brne ausgabe
33
    rjmp Anfang            ; neuer Durchlauf

von Peter B. (pebez)


Lesenswert?

Hallo Falk,

Danke, funktioniert einwandfrei.
Im nächten Schritt werde ich die dly durch ein Timer Interrupt ersetzen.

Gibt es noch andere Möglichkeiten dieses "Lauflicht" mit den 74595 zu
realisieren, wobei so wenig Portpins benötigt werden?

Hintergedanke ist ein Sekundenkreis einer Uhr. Bei der jetzigen Methode
würden ja 9 Register benötigt werden, was man aber auch mit einer
.include Datei bewerkstelligen könnte.

Werde mal ein wenig weiter forschen.

Dir nochmals vielen Dank.

Gruß  Peter

von Marcel S. (marcel_74)


Lesenswert?

Hallo,

der Sekundenkreis ist mit der entsprechenden Anzahl Schieberegister kein 
Problem. Das Programm dazu ist auch recht einfach, weil Du ja nicht den 
Inhalt einzelner Variablen in die SR schieben musst. Du musst ja nur bei 
"0 Sekunden" ein 1-Bit in das erste Schieberegister schieben und danach 
immer nur 0-Bits. Dass machst du dann 59 Sekunden lang, bis das 1-Bit im 
8. SR verschwindet. Dann musst Du pünktlich zur 0. Sekunde wieder ein 
1-Bit reinschieben. Von den 64 Datenleitungen der acht kaskadierten SR 
schließt Du eben nur die ersten 60 an.

Das Vorgehen unterscheidet sich dabei nur geringfügig, wenn Du nur 59 
LEDs benutzen möchtest und bei 0 Sekunden alle Lampen aus sein sollen. 
Dann schiebst Du das 1-Bit eben bei Beginn der 1. Sekunde rein. Aber 
egal welche Variante Du haben möchtest: Du musst jede Sekunde ein Bit 
weiterschieben.

Viele Grüße
Marcel

von Falk B. (falk)


Lesenswert?

@  Peter Bednarz (pebez)

>Gibt es noch andere Möglichkeiten dieses "Lauflicht" mit den 74595 zu
>realisieren, wobei so wenig Portpins benötigt werden?

Sind dir die drei Pins schon zuviel?

>Hintergedanke ist ein Sekundenkreis einer Uhr. Bei der jetzigen Methode
>würden ja 9 Register benötigt werden, was man aber auch mit einer
>.include Datei bewerkstelligen könnte.

Was haben Schieberegister mit Includefiles zu tun?

>Werde mal ein wenig weiter forschen.

Tu das.

MfG
Falk

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.