Forum: Mikrocontroller und Digitale Elektronik Ansteuerung eines CD4094-Shiftregisters


von Nils ‫. (n-regen)


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

von Michael B. (mb_)


Angehängte Dateien:

Lesenswert?

Beispielcode

Edit: Warum kann ich die .h Datei nicht anhaengen??

von Michael B. (mb_)


Angehängte Dateien:

Lesenswert?

Hier ist der header

von Nils ‫. (n-regen)


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?

von Michael B. (mb_)


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.

von Bernd (Gast)


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
}

von Bernd (Gast)


Lesenswert?

Cut & Paste Teufel
DisplayCharOut = myByte

Ich verwende es fürs Display.

von Nils ‫. (n-regen)


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?

von Ollz (Gast)


Lesenswert?

Ich würde mir mal die SPI-Funktion des Atmega 8 ansehen.

von Nils ‫. (n-regen)


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.

von Ollz (Gast)


Lesenswert?

Ach je, immer diese Weigerungen sich erst mal anzusehen, was der 
Mikrocontroller kann, aber Schlussfolgerungen ziehen.

von Nils ‫. (n-regen)


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.

von Peter D. (peda)


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

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.