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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.