www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage zum 74595 Schieberegister


Autor: Peter Bednarz (pebez)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marcel S. (marcel_74)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Bednarz (pebez)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

danke für die schnelle Reaktion.

Anbei das Schaltbild aud dem Tut.

Gruß Peter

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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?
; oben reinschreiben.

.def temp2 = r17
.def temp3 = r18
.def temp4 = r19
.def cnt   = r20

Anfang:
    ldi   temp2, 0x01           ; Anfangsmuster laden
    ldi   temp3, 0x00
    ldi   temp4, 0x00
    ldi   cnt, 24               ; Schleifenzähler laden
Ausgabe:
    mov   temp1, temp2
    rcall Schiebe               ; Daten schieben
    mov   temp1, temp3
    rcall Schiebe               ; Daten schieben
    mov   temp1, temp4
    rcall Schiebe               ; Daten schieben
    rcall SchiebeOut            ; Daten in Ausgangsregister übernehmen

dly:
    dec r20                ; von mir geändert
    brne dly               ;
    dec r21                ;
    brne dly               ;
                           ; schieben über drei Byte
    lsl temp2              ;
    rol temp3
    rol temp4
    dec cnt                ; Schleifenzähler verringern
    brne ausgabe
    rjmp Anfang            ; neuer Durchlauf

Autor: Peter Bednarz (pebez)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marcel S. (marcel_74)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.