Ansteuerung eines CD4094-Shiftregisters

OP #1492426
Lesenswert?

Hallo!
Ich möchte mehrere CD4094-Shiftregister kaskadieren und mit einem ATmega 
8 ansteuern.
Dazu möchte ich diese Schaltung hernehmen (natürlich ohne COM-Port und 
Zener-Dioden, dafür mit ATmega): 
http://www.skilltronics.de/versuch/elektronik_pc/4094.html
Dann müsste ich doch mit der folgenden Schleife (werde ich dann noch in 
(effektiveren) C-Quellcode übersetzen, wenn das Prizip stimmt) die 
Shiftregister ansteuern können, oder?
1
1. Anzahl der Ausgänge in Variable n speichern
2
2. Bit für Ausgang n an Data anlegen
3
3. Clock auf 1 setzen
4
4. Clock auf 0 setzen
5
5. n dekrementieren
6
6. Wenn n ungleich 0: Zu 2. springen; Sonst: Zu 7. springen
7
7. Strobe auf 1 setzen
8
8. Strobe auf 0 setzen
OP #1493321
Lesenswert?

mb_: Vielen Dank für deinen Code, aber ich neige normalerweise dazu, das 
Rad für jede veränderte Speiche neu zu erfinden und werde das wohl auch 
hier tun (z.B. zwecks Lerneffekt und besserer Eingliederung in mein 
Programm).
Würde meine Methode im ersten Post also funktionieren?
#1493355
Lesenswert?

Nils S. schrieb:
> Würde meine Methode im ersten Post also funktionieren?

Naja, ich wuerde den Strobe puls anders machen (so wie in meinem code). 
Mit deinem Code aendern sich die Ausgaenge des Schieberegisters waehrend 
des Schiebens. Wenn du es stattdessen wie in meinem Beispiel machst, 
werden die Ausgaenge atomisch am Ende auf den Registerinhalt 
aufgefrischt. Ausserdem ist die Strobe Logik umgekehrt. Schau einfach 
ins Beispiel.
Gast #1493435
Lesenswert?

Warum einfach wenns umständlich geht :-) ohne Strobe sieht es so aus.
1
void SendByte (uint8_t myByte)
2
{
3
    uint8_t n = 8;                        // Sende 8 BIT
4

5
    do  {
6
        DATA = LOW;
7
        if (myByte & 0x80) DATA = HIGH;   // Daten an 4094 ausgeben
8
        DisplayCharOut <<=1;              // MSB first
9
        CLOCK = LOW;                      // Ausgabe Schiebetakt, CLOCK = 0
10

11
        // CLOCK = 1, positive Taktflanke an 4094
12
        CLOCK = HIGH;
13
                     
14
    } while (--n);
15
}
OP #1496867
Lesenswert?

Michael Buesch schrieb:
> Naja, ich wuerde den Strobe puls anders machen (so wie in meinem code).

Du meinst also folgendermaßen, oder?
(Im Ausgangszustand ist Strobe 1 und Clock 0;
Output Enable ist wie im Schaltplan mit + verbunden)
1
1. Anzahl der Ausgänge in Variable n speichern
2
2. Bit für Ausgang n an Data anlegen
3
3. Clock auf 1 setzen
4
4. Clock auf 0 setzen
5
5. n dekrementieren
6
6. Wenn n ungleich 0: Zu 2. springen; Sonst: Zu 7. springen
7
7. Strobe auf 0 setzen
8
8. Strobe auf 1 setzen

Ach ja: Wann sollte man zum Kaskadieren Pin 9 und wann Pin 10 nehmen?
OP #1498074
Lesenswert?

Mit SPI wird das wahrscheinlich nicht funktionieren, weil das Signal am 
Ausgang durch einen Transistor invertiert wird und ich eigentlich nicht 
noch einen Transistor dazuschalten möchte, um das Signal nochmal zu 
invertieren.
Außerdem möchte ich das wie gesagt selber implementieren - aber dazu 
müsste ich halt wissen, ob mein letzter Pseudocode funktionieren würde 
und welchen Pin (9 oder 10) ich als "Uplink" hernehmen soll.
OP #1498750
Lesenswert?

Ich weiß auch ohne nachzuschauen, dass der ATmega8 SPI kann (auch wenn 
ich gerade erst gesehen habe, dass man die Polarität der Clock-Leitung 
einstellen kann).
Das alles ändert nichts daran, dass ich die Datenübertragung selber 
programmieren möchte und dazu wissen muss, ob ich noch irgendeinen 
Fehler in meinem Pseudocode habe und über welchen Anschluss man die 
Shiftregister unter welchen Umständen kaskadieren sollte.
#1499556
Lesenswert?

Nils S. schrieb:
> Das alles ändert nichts daran, dass ich die Datenübertragung selber
> programmieren möchte und dazu wissen muss, ob ich noch irgendeinen
> Fehler in meinem Pseudocode habe

Finds selber heraus.
Das Interesse, sich den 1000-en Versuch eines SW-SPI anzuschauen, dürfte 
gegen 0 gehen. Man ist ja nicht Dein Lehrer, der Deine Klausur 
korrigieren muß.
Es gibt schon reichlich fertigen HW/SW-SPI Code.


> und über welchen Anschluss man die
> Shiftregister unter welchen Umständen kaskadieren sollte.

Steht doch im Datenblatt, ist frequenzabhängig.
Die CD4xxx sind Hochvolt-CMOS, d.h. bei 5V recht gemächlich (1MHz) und 
auch treiberschwach (1mA). Deshalb nimmt man üblicher Weise den 74HC595.


Peter

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren