INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Hilfe bei einem Schieberegister
20.02.2015, 16:36
Beitrag #1
Hilfe bei einem Schieberegister
Hallo ArduinoForum,

ich möchte eine Led über ein Schieberegister (74HC595) blinke lassen und weiß leider nich wie das geht.
Also wie der Beispiel Sketch "Blink", nur über ein Schieberegister.

Wäre nett wenn jemand eine Lösung für mein Problem hätte.

Gruß Max
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.02.2015, 17:02
Beitrag #2
RE: Hilfe bei einem Schieberegister
Hallo,

ich hab' vor geraumer Zeit mal damit herumgebastelt. Allerdings habe ich mit demselben Programm sowohl 4 Siebensegmentanzeigen (mit 4 Schieberegistern in Serie) als auch einzelne LED's angesteuert. Daher kann ich Dir jetzt nicht mehr genau sagen welcher Programmteil zu welcher Funktion gehört.
Das Ganze war in einem Programm drin, das die Uhrzeit auf der Siebensegmentanzeige ausgegeben hat und für die weiteren Ausgänge war geplant einen Summer anzuschliessen.
Habe dan dann verworfen weil es bei Spannungsausfall / - wiederkehr Effekte gab, dass der Summer dann (nach Murphy's Law mitten in der Nacht) plötzlich auf dauerhupen gegangen wäre.

Hier jetzt die Programmteile mit denen Du die gewünschte Funktion hinbekommen müsstest:
Code:
#include <AH_74HC595.h>
    
// Ausgänge    Siebensegmentmodul 4x Anzeige mit 3 Steuerleitungen (jeweils QH' > Ser)
    #define SRCLK_Pin_7SegModul                    23                                    //Schieberegister Takt
    #define RCLK_Pin_7SegModul                    27                                    //Register Takt (Übergabe an Ausgabe)
    #define DATA_Pin_7SegModul                    25                                    //Serieller Dateneingang

// Ausgänge    Porterweiterung über Schieberegister
    #define SRCLK_Pin_Porterweiterung            42                                    //Schieberegister Takt
    #define RCLK_Pin_Porterweiterung            44                                    //Register Takt (Übergabe an Ausgabe)
    #define DATA_Pin_Porterweiterung            46                                    //Serieller Dateneingang

    
//Ausgänge Siebensehmentanzeige einzelne Modulansteuerung über Library
    #define SRCLK_Pin                    35                //Shift register clock
    #define RCLK_Pin                    36                //Register clock
    #define SER_Pin                        37                //Serial data input
    
//Initialisation
AH_74HC595 seven_segment1(SER_Pin, RCLK_Pin, SRCLK_Pin);             // benötigt für jede 7-Segmentanzeige die 3 Ports
// AH_74HC595 seven_segment1(4, 3, 2);
// AH_74HC595 seven_segment2(28, 27, 26);
    
    /*
    #define siebensement_digit1        23                                            // Zehnerstelle Stunde
    #define siebensement_digit2        25                                            // Einerstelle Stunde
    #define siebensement_digit3        27                                            // Zehnerstelle Minute
    #define siebensement_digit4        29                                            // Einerstelle Minute
    */

// LCD-Keypad-Shield
    int lcd_key_in  = 0;                                                        // Analogwert der gedrueckten Keypad-Taste
    int brightness = 100;                                                        // Displayhelligkeit

// 7-Segmentanzeige                                                                // Zuordnung Segmente der Anzeige
                //             _________
                //             |     a     |
                //            f|         |b
                //             |         |
                //             _________
                //             |     g     |
                //            e|         |c
                //             |         |
                //             _________    
                //                 d

// Bytemuster der 7-Segmentanzeige                                                // Zuordnung welche Segmente leuchten
                    //     abcdefg.            bei Wert        Anzeige von
    byte segmente[22]= {B11111100,            //  0                0
                        B01100000,            //  1                1
                        B11011010,            //  2                2
                        B11110010,            //  3                3
                        B01100110,            //  4                4
                        B10110110,            //  5                5
                        B10111110,            //  6                6
                        B11100000,            //  7                7
                        B11111110,            //  8                8
                        B11110110,            //  9                9
                        B11111101,            // 10                0.
                        B01100001,            // 11                1.
                        B11011011,            // 12                2.
                        B11110011,            // 13                3.
                        B01100111,            // 14                4.
                        B10110111,            // 15                5.
                        B10111111,            // 16                6.
                        B11100001,            // 17                7.
                        B11111111,            // 18                8.
                        B11110111,            // 19                9.
                        B00000001,            // 20                 .                        
                        B00000000};            // 21                ist aus (nix)

// Ausgänge    der (Daten-)Leitungen der 7-Segmentanzeige                            // Anschlüsse der (Daten-)Leitungen
    //int pinArray[] = {53,51,49,47,45,43,41,39};
                    // .  g  f  e  d  c  b  a                                    // Zuordnung Segment zu Pin


void setup()
{
    pinMode(SRCLK_Pin_7SegModul, OUTPUT);                                                        // Schieberegister SRCLK_Pin (Schiebetakt)
    pinMode(RCLK_Pin_7SegModul, OUTPUT);                                                        // Schieberegister RCLK_Pin (Freigabe Ausgabe)
    pinMode(DATA_Pin_7SegModul, OUTPUT);                                                        // Schieberegister SER_Pin (Dateneingang)
    pinMode(SRCLK_Pin, OUTPUT);                                                        // Schieberegister SRCLK_Pin
    pinMode(RCLK_Pin, OUTPUT);                                                        // Schieberegister RCLK_Pin
    pinMode(SER_Pin, OUTPUT);                                                        // Schieberegister SER_Pin

    
// Siebensegmentanzeige
    //seven_segment1.clear();
    //seven_segment2.clear();
    
    /*                                                                            
    for (int i=0;i<10;i++){                                                        // Siebensegmentanzeige läuft einmal von 0 - 9 durch
        seven_segment2.showNumber(i);
        seven_segment1.showNumber(i);
        delay(200);  
    }  
    seven_segment1.clear();
    seven_segment2.clear();
    */


}

void loop() {

}

// Ausgabe der Uhrzeit
void digitalClock7Segment() {
    // write_sevensegmentbits_to_shiftregister(second_one);                            // Sekundenwert für die hinterste 7-Segmentanzeige
    // write_sevensegmentbits_to_shiftregister(second_ten);                            // Zehnsekundenwert für die nächste 7-Segmentanzeige
    write_sevensegmentbits_to_shiftregister(minute_one);                            // Minutenwert für die nächste 7-Segmentanzeige
    write_sevensegmentbits_to_shiftregister(minute_ten);                            // Zehnminutenwert für die nächste 7-Segmentanzeige
    if (second_one == 0 || second_one == 2 || second_one == 4 ||                     // wenn Sekundenwert gerade Zahl...
                            second_one == 6 || second_one == 8)
        write_sevensegmentbits_to_shiftregister(hour_one +10);                        // ... Stundenwert für die nächste 7-Segmentanzeige incl. Dezimalpunkt)
    else
        write_sevensegmentbits_to_shiftregister(hour_one);                            // ... Stundenwert für die nächste 7-Segmentanzeige ohne Dezimalpunkt)
    write_sevensegmentbits_to_shiftregister(hour_ten);                                // Zehnstundenwert für die vorderste 7-Segmentanzeige
    set_sevensegment_data_active();                                                    // Ausgabe auf Siebensegmentanzeige aktiv schalten
}

// Ausgabe eines Wertes auf eine Siebensegmentanzeige; je 7-Segmentanzeige 3 Steuerleitungen notwendig
void digitalClock7Segment_1Segment() {
    seven_segment1.showNumber(minute_one);
    if (second_one == 0 || second_one == 2 || second_one == 4 || second_one == 6 || second_one == 8)
        seven_segment1.setPoint(true);
    else
        seven_segment1.setPoint(false);
    Serial.print("Sekunde: ");
    Serial.println(second());
    Serial.println(second_one);
    delay (500);
}



// Ausgabe Bitmuster für 7-Segmentanzeige auf Schieberegister
void write_sevensegmentbits_to_shiftregister(int arrayzeile) {
    
    for(int j = 0; j < 8; j++){                                                // Segment a, b, c, d, e, f, g, .   auf
            //        liest aus                zeile   spalte
            digitalWrite(DATA_Pin_7SegModul, bitRead(segmente[arrayzeile], j));        // Segmentausgänge seriell auf Data-Pin
            //                                   |   |
            //                                   |   ------------------>    // Spalte des Array ( > Zeiger auf Ausgang)
            //                                   ---------------------->    // Zeile des Array
            digitalWrite(SRCLK_Pin_7SegModul, HIGH);                                    // Daten in Schieberegister übernehmen ...
            digitalWrite(SRCLK_Pin_7SegModul, LOW);                                    // ... und wieder "bereit machen"
        }
}

// Bitmuster das im Schieberegister steht aktiv setzen (anzeigen)
void set_sevensegment_data_active() {
    digitalWrite(RCLK_Pin_7SegModul, HIGH);
    digitalWrite(RCLK_Pin_7SegModul, LOW);
}

// Ausgabe Bitmuster für 7-Segmentanzeige auf Schieberegister
void write_portextensionbits_to_shiftregister() {
    
    int out = 0;
    if (out0 == 1)
        out = out + 1;
    if (out1 == 1)
        out = out + 2;
    if (out2 == 1)
        out = out + 4;
    if (out3 == 1)
        out = out + 8;
    if (out4 == 1)
        out = out + 16;
    if (out5 == 1)
        out = out + 32;
    if (out6 == 1)
        out = out + 64;
    if (out7 == 1)
        out = out + 128;
    
    shiftOut(DATA_Pin_Porterweiterung, SRCLK_Pin_Porterweiterung, MSBFIRST, out);        // Segmentausgänge seriell auf Data-Pin
    
}

// Bitmuster das im Schieberegister steht aktiv setzen (anzeigen)
void set_portextension_data_active() {
    digitalWrite(RCLK_Pin_Porterweiterung, HIGH);
    digitalWrite(RCLK_Pin_Porterweiterung, LOW);
}

// für direkte Ansteuerung 7-Segmentanzeige
/* void anzeige(int wert) {
    byte stunden_einer, stunden_zehner, minuten_einer, minuten_zehner;
    //zehner = int (wert/10);                                                        // Ziffer Zehnerstelle berechnen
    //einer = wert - zehner*10;                                                    // Ziffer Einerstelle brechnen
    digitalWrite(siebensement_digit1, HIGH);                                    // Zehnerstelle Stunden aktiv
    digitalWrite(siebensement_digit2, LOW);
    digitalWrite(siebensement_digit3, LOW);
    digitalWrite(siebensement_digit4, LOW);
    ansteuerung_siebensegment(hours_tens);                                        // Ansteuerung mit Werteübergabe
    digitalWrite(siebensement_digit1, LOW);                                    // Zehnerstelle Stunden aktiv
    digitalWrite(siebensement_digit2, HIGH);
    digitalWrite(siebensement_digit3, LOW);
    digitalWrite(siebensement_digit4, LOW);
    ansteuerung_siebensegment(hours_ones);                                        // Ansteuerung mit Werteübergabe
    digitalWrite(siebensement_digit1, LOW);                                    // Zehnerstelle Stunden aktiv
    digitalWrite(siebensement_digit2, LOW);
    digitalWrite(siebensement_digit3, HIGH);
    digitalWrite(siebensement_digit4, LOW);
    ansteuerung_siebensegment(minutes_tens);                                        // Ansteuerung mit Werteübergabe
    digitalWrite(siebensement_digit1, LOW);                                    // Zehnerstelle Stunden aktiv
    digitalWrite(siebensement_digit2, LOW);
    digitalWrite(siebensement_digit3, LOW);
    digitalWrite(siebensement_digit4, HIGH);
    ansteuerung_siebensegment(minutes_ones);                                        // Ansteuerung mit Werteübergabe
} */

// für direkte Ansteuerung 7-Segmentanzeige
/* void ansteuerung_siebensegment(int arrayzeile) {
    
    for(int j = 7; j >= 0; j--){                                                // Segment a, b, c, d, e, f, g, .   auf
            //                Ausgang                zeile   spalte
            digitalWrite(pinArray[j], bitRead(segmente[arrayzeile], j) == 1?HIGH:LOW);    // Segmentausgänge ausgeben; 1=High-Pegel
            //                    |                    |   |
            //                    |                    |   ------------------>    // Spalte des Array ( > Zeiger auf Ausgang)
            //                    |                    ---------------------->    // Zeile des Array
            //                    ------------------------------------------->    // Ausgang de jeweiligen Segmentes der Siebensegmentanzeige
        }
    delay(5);                                                                    // notwendige Pause für Transistor
} */

Viel Erfolg
Ralf
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.02.2015, 18:09
Beitrag #3
RE: Hilfe bei einem Schieberegister
(20.02.2015 16:36)Max32 schrieb:  ich möchte eine Led über ein Schieberegister (74HC595) blinke lassen und weiß leider nich wie das geht.
Also wie der Beispiel Sketch "Blink", nur über ein Schieberegister.
Hi,
eine einzelne LED ist etwas seltsam, da Du für die eigentlich nur einen Pin brauchst. Für ein Schieberegister brauchst Du mindestens drei. Ich gehe daher davon aus, dass Du im Endeffekt mal mehr machen willst und Deine Frage sozusagen nur ein erster Schritt darstellen soll.
Meiner Meinung nach macht man das am "saubersten" so: Definiere eine globale Variable mit Datentyp byte (oder uint8_t, das ist dasselbe). Dann bastle Dir eine Funktion, analog zu digitalWrite. Zum Beispiel "shiftRegWrite(pin, level)". Die Funktion setzt dann das entsprechende Bit in der Zustands-Variable. Dann schiebt sie das ganze Byte ins Schieberegister und gibt einen Puls auf die Register-Clock.
Diese Funktion kannst Du dann genauso verwenden wie vorher digitalWrite.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.02.2015, 22:33
Beitrag #4
RE: Hilfe bei einem Schieberegister
Ach ja, ein paar Anmerkungen noch zur "Porterweiterung":
- Du hast damit natürlich keine so schnelle Reaktionszeit wie wenn Du einen direkten Ausgang benutzt (was bei einer leuchtenden LED sicher nicht schlimm ist).
- beim Reset des Prozessors bleiben die Ausgänge gesetzt, d. h. obwohl das Programm gar nicht mehr läuft hast Du noch immer "Ausgabewerte"
- es ist ein höherer Aufwand in der Software nötig um die Ausgänge anzusteuern
- es ist ein höherer Aufwand in der Hardwarebeschaltung nötig

Da es die Arduino Mega in China zwischen 10 und 20 EUR gibt (die brauchen aber teilweise 4 Wochen Transportzeit) solltest Du dir überlegen, ob Du dir nicht so einen besorgst. Dann hast Du 54 E/A s, mehr RAM, einen schnelleren Prozessor mehr Schnittstellen usw.
Wenn Du natürlich eine schnelle Lösung oder mehr als 54 E/A s brauchst ist das keine Lösung ;-)

Gruss Ralf
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.02.2015, 11:44
Beitrag #5
RE: Hilfe bei einem Schieberegister
Vielen Dank für die Antworten,

Thorsten könntest du deinen Ansatz noch etwas genauer erklären, da ich momentan nich verstehe wie ich das in einen Code umsetztn soll.

Gruß Max
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.02.2015, 12:36
Beitrag #6
RE: Hilfe bei einem Schieberegister
Hi Max,
tja, jetzt ist halt schwierig zu erraten, welchen Teil Du nicht verstanden hast. Nehmen wir mal an so ziemlich alles...
In dem Fall arbeite erstmal das hier durch: http://arduino.cc/en/tutorial/ShiftOut. Nicht nur lesen, sondern tatsächlich mal machen.
Danach dann das hier: http://arduino.cc/en/pmwiki.php?n=Refere...eclaration
Vielleicht klärt das manches.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.02.2015, 10:13
Beitrag #7
RE: Hilfe bei einem Schieberegister
(21.02.2015 12:36)Thorsten Pferdekämper schrieb:  Hi Max,
tja, jetzt ist halt schwierig zu erraten, welchen Teil Du nicht verstanden hast. Nehmen wir mal an so ziemlich alles...
In dem Fall arbeite erstmal das hier durch: http://arduino.cc/en/tutorial/ShiftOut. Nicht nur lesen, sondern tatsächlich mal machen.
Danach dann das hier: http://arduino.cc/en/pmwiki.php?n=Refere...eclaration
Vielleicht klärt das manches.
Gruß,
Thorsten

Also wie ich eine LED über ein Schieberegister ansteuer ist mir klar.
Nur die von dir vorgeschlagene Lösung verstehe ich auch nach durcharbeiten der beiden Links nicht so wirklich.


Gruß Max
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.02.2015, 10:26
Beitrag #8
RE: Hilfe bei einem Schieberegister
Hi,
dann kopiere mal Dein Coding zum Ansteuern einer LED hier rein. Mal sehen, was wir daraus machen können.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Hilfe: IR Remote Steuerung, MSGEQ7 + RGB-LED Streifen dastob 1 116 14.10.2016 21:40
Letzter Beitrag: hotsystems
Sad Ich brauche Hilfe Prosac 4 230 09.10.2016 18:39
Letzter Beitrag: Prosac
  A4988 Driver mit einem Nema 17 Hangloose 3 140 04.09.2016 21:49
Letzter Beitrag: Hangloose
  at24c256 Hilfe Gandalf 6 247 29.08.2016 18:59
Letzter Beitrag: MKc
Smile Progammier Neuling Codeschloss bittet um Hilfe Donalonso 2 284 27.08.2016 18:23
Letzter Beitrag: Binatone
  Hilfe gesucht. Webserver Statsiche und Dynamische HTMl Seite b3ta 11 447 22.08.2016 08:07
Letzter Beitrag: b3ta
  Hilfe: Mega2560 - ENC 28J60 - MYSQL Gandalf 1 178 28.07.2016 16:30
Letzter Beitrag: Gandalf
  Selbstfahrender Roboter Programm änderung hilfe ? arekklone 11 536 06.07.2016 14:59
Letzter Beitrag: Binatone
  Hilfe beim Arduino Shield reimundko 6 453 05.06.2016 11:28
Letzter Beitrag: rpt007
  Brauche etwas Hilfe bei der Umsetzung einer Idee raspido 3 526 23.04.2016 10:26
Letzter Beitrag: rkuehle

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste