Forum: Mikrocontroller und Digitale Elektronik 7seg und shift register


von Ray M. (ray_m)


Angehängte Dateien:

Lesenswert?

hi,

ich versuche mich gerade an einem 7seg display und bin mir nicht sicher
warum es nicht funktionieren will ;)

liegt es an der soft- oder hardware ?

deshalb die frage ob der angehängte plan so funkitionieren sollte

danke fürs drüber schauen

von Michael B. (laberkopp)


Lesenswert?

CLOCK bei SER_IN ?

von MagIO (Gast)


Lesenswert?

Problem ist ja schon gelöst. Aber ein Hinweis noch ... die Transistoren 
für die PWM hättest du auch sparen können. Die PWM einfach auf /G gelegt 
hätte das gleiche Ergebnis.

von Ray M. (ray_m)


Angehängte Dateien:

Lesenswert?

danke für die hinweise,
ich hoffe ich hab es jetzt ???

von Ray M. (ray_m)


Lesenswert?

mit dem testcode hier tut sich da leider garnix ;(
1
#define _DATA           4
2
#define _LATCH          5
3
#define _CLOCK          6
4
5
byte data;
6
byte dataArray[10];
7
8
void shiftOut(byte dataOut) {
9
    int i=0;
10
    int pinState;
11
    pinMode(_CLOCK, OUTPUT);
12
    pinMode(_DATA, OUTPUT);
13
    digitalWrite(_DATA, LOW);
14
    digitalWrite(_CLOCK, LOW);
15
    for (i=7; i>=0; i--)  {
16
        digitalWrite(_CLOCK, LOW);
17
        if ( dataOut & (1<<i) ) {
18
            pinState = 1;
19
        } else {
20
            pinState = 0;
21
        }
22
        Serial.print(pinState);
23
        digitalWrite(_DATA, pinState);
24
        digitalWrite(_CLOCK, HIGH);
25
        digitalWrite(_DATA, LOW);
26
    }
27
    Serial.println();
28
    digitalWrite(_CLOCK, LOW);
29
}
30
31
void setup() {
32
    pinMode(LED_BUILTIN, OUTPUT);
33
    digitalWrite(LED_BUILTIN, LOW);
34
35
    pinMode(_DATA, OUTPUT);
36
    pinMode(_LATCH, OUTPUT);
37
    pinMode(_CLOCK, OUTPUT);
38
    digitalWrite(_DATA, LOW);
39
    digitalWrite(_LATCH, LOW);
40
    digitalWrite(_CLOCK, LOW);
41
42
    dataArray[0] = 0xFF; //0b11111111
43
    dataArray[1] = 0xFE; //0b11111110
44
    dataArray[2] = 0xFC; //0b11111100
45
    dataArray[3] = 0xF8; //0b11111000
46
    dataArray[4] = 0xF0; //0b11110000
47
    dataArray[5] = 0xE0; //0b11100000
48
    dataArray[6] = 0xC0; //0b11000000
49
    dataArray[7] = 0x80; //0b10000000
50
    dataArray[8] = 0x00; //0b00000000
51
    dataArray[9] = 0xE0; //0b11100000
52
}
53
54
void loop() {
55
    for (int j = 0; j < 10; j++) {
56
        digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
57
        data = dataArray[j];
58
        digitalWrite(_LATCH, LOW);
59
        shiftOut(data);
60
        digitalWrite(_LATCH, HIGH);
61
        delay(500);
62
    }
63
}

von Erich (Gast)


Lesenswert?

Ray M. schrieb:
> mit dem testcode hier tut sich da leider garnix ;(

Du solltest ein Scope anschliessen.

Gruss

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Ray M. schrieb:
> mit dem testcode hier tut sich da leider garnix ;(
Gar nix? Nicht mal die LED blinkt?

Ein Mehrkanaloszi (min. 2) ist zur Inbetriebnahme von solchen seriellen 
Schnittstellen eigentlich unumgänglich.

: Bearbeitet durch Moderator
von Ray M. (ray_m)


Lesenswert?

Erich schrieb:
> Ray M. schrieb:
>> mit dem testcode hier tut sich da leider garnix ;(
>
> Du solltest ein Scope anschliessen.

hab ich nicht ...

von Ray M. (ray_m)


Lesenswert?

Lothar M. schrieb:
> Ray M. schrieb:
>> mit dem testcode hier tut sich da leider garnix ;(
> Gar nix? Nicht mal die LED blinkt?

genau ...

wenn ich mit nem multimeter die ausgänge vom tpic messe kommt da auch 
nix raus ;(

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Ray M. schrieb:
>> Du solltest ein Scope anschliessen.
> hab ich nicht ...
Wünsch dir eines zu Ostern. Oder kauf dir einen billigen 
Logikanalyzer-Clone in der Bucht. Du wirst damit sehen, ob was 
passiert und zudem auch noch was passiert.

Ray M. schrieb:
>> Nicht mal die LED blinkt?
> genau ...
Dann solltest du zuerst mal die LED zum Blinken bringen...

> wenn ich mit nem multimeter die ausgänge vom tpic messe kommt da auch
> nix raus ;(
Die Ausgänge sind uninteressant. Das ist, wie wenn du eine 
Wasserversorgung baust, dann den Hana aufdrehst und nichts kommt.
Viel interessanter wäre doch, ob die Quelle Wasser hat, ob die Pumpe 
läuft, ob die Leitungen dicht sind und alle Schieber auf Durchgang 
stehen. Das erkannst du nicht am Wasserhahn.

Fazit: miss zuerst an den µC-Pins. Dort wirkt dein Programm. Wenn du 
kein geeignetes Messgerät hast, dann beschaff dir eines. Sonst kommst du 
nicht weiter...

: Bearbeitet durch Moderator
von Ray M. (ray_m)


Lesenswert?

was soll ich mit einem gerät was ich nicht bedienen kann, nicht 
verstehe,
was soll mir das bringen

ein schiftregister und einige led's in einer 7seg-anzeige sind doch 
keine
raumfahrttechnik

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Ray M. schrieb:
> was soll ich mit einem gerät was ich nicht bedienen kann, nicht verstehe,
Kennst du das Wort "lernen"?

> was soll mir das bringen
DU willst das doch zum Laufen bringen.

> ein schiftregister und einige led's in einer 7seg-anzeige sind doch
> keine raumfahrttechnik
Du sagst es. Aber trotzdem nicht so simpel, dass es einfach so geht...

von Ray M. (ray_m)


Lesenswert?

das ist schon richtig, aber wenn ich z.b. für 10sec
einen port des registers an schalte, müsste ich am ausgang
auch mit einem multimeter was messen können
1
void loop() {
2
    for (int j = 0; j < 10; j++) {
3
        ...
4
        ...
5
        ...
6
        delay(10000);
7
    }
8
}

stellt sich mir die frage ob eventuell das rumgeshifte auf einem
32bit arm falsch ist ???
denn verdrahtet ist es ja nun anscheinend richtig ...
1
        ...
2
        ...
3
        if ( dataOut & (1<<i) ) {
4
        ...
5
        ...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Ray M. schrieb:
> aber wenn ich z.b. für 10sec einen port des registers an schalte,
> müsste ich am ausgang auch mit einem multimeter was messen können
Richtig.
Du solltest zuerst mal das zum Laufen bekommen:
1
void loop() {
2
    for (int j = 0; j < 10; j++) {
3
        digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
4
//        data = dataArray[j];
5
//        digitalWrite(_LATCH, LOW);
6
//        shiftOut(data);
7
//        digitalWrite(_LATCH, HIGH);
8
        delay(10000);
9
    }
10
}
Und wenn das geht, dann kannst du nach dem Rest schauen...

BTW: die Zeile kann je nach Beschaltung des Ports durchaus in die Hose 
gehen:
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
Ich würde da sowas schreiben
digitalWrite(LED_BUILTIN, j&1);

von Ray M. (ray_m)


Lesenswert?

Lothar M. schrieb:
> Ray M. schrieb:
>> aber wenn ich z.b. für 10sec einen port des registers an schalte,
>> müsste ich am ausgang auch mit einem multimeter was messen können
> Richtig.
> Du solltest zuerst mal das zum Laufen bekommen:
>
1
> void loop() {
2
>     for (int j = 0; j < 10; j++) {
3
>         digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
4
> //        data = dataArray[j];
5
> //        digitalWrite(_LATCH, LOW);
6
> //        shiftOut(data);
7
> //        digitalWrite(_LATCH, HIGH);
8
>         delay(10000);
9
>     }
10
> }
11
>
> Und wenn das geht, dann kannst du nach dem Rest schauen...

ich verstehe nicht was du mir sagen willst ...

aktuell bekomme im register keinen port angeschaltet und weis nicht
warum ?

> BTW: die Zeile kann je nach Beschaltung des Ports durchaus in die Hose
> gehen:

joop, aber da ist aktuell nix dran ;)

> digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
> Ich würde da sowas schreiben
> digitalWrite(LED_BUILTIN, j&1);

von Dietrich L. (dietrichl)


Lesenswert?

Ray M. schrieb:
> ich hoffe ich hab es jetzt ???

Da ist immer noch was vertauscht: CLOCK und LATCH
- CLOCK muss an SRCK (Serial Register Clock)
- LATCH muss an RCK  (Register Clock)

Ich habe jetzt nicht geschaut, wie das Programm die Leitungen bedient 
und ob eventuell nur die Namen falsch sind.

von Ray M. (ray_m)


Angehängte Dateien:

Lesenswert?

ok ...

ich hab das aktuell so


pin4 --> SER_IN
pin5 --> RCK
pin6 --> SRCK

also müssten das folgende passen ???

#define _DATA           4
#define _LATCH          5
#define _CLOCK          6


richtig ?

: Bearbeitet durch User
von Ray M. (ray_m)


Lesenswert?

ohh jee ...

ich hab auf meiner platine ja noch die transistoren für pwm,
das sollte man schon anschalten ...

    analogWriteResolution(12);
    pinMode(_PWM_OUT, OUTPUT);
    analogWrite(_PWM_OUT, 500);

das wirkt echt wunder ;)

danke für die klärung zum thema clock/latch/data und wo das
dran gehört ...

jetzt macht es bunt, zwar noch falsch aber krieg ich hin


danke für eure hilfe ...

von Erdowahn (Gast)


Lesenswert?

Abblockkondensatoren fehlen.

von W.S. (Gast)


Lesenswert?

Lothar M. schrieb:
> Ein Mehrkanaloszi (min. 2) ist zur Inbetriebnahme von solchen seriellen
> Schnittstellen eigentlich unumgänglich.

Ja sag mal!

Für so ein simples Schiebeegister brauchst du einen Mehrkanal-Oszi?

W.S.

von Ray M. (ray_m)


Lesenswert?

Erdowahn schrieb:
> Abblockkondensatoren fehlen.

wo ?

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Ray M. schrieb:
> Erdowahn schrieb:
>> Abblockkondensatoren fehlen.
>
> wo ?

Ich sehe auch nicht, wo Da Einer fehlt ;)

... sorry ...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

W.S. schrieb:
> Für so ein simples Schiebeegister brauchst du einen Mehrkanal-Oszi?
Einmal gekauft und nie bereut... ?
Auf jeden Fall hätte ich damit den Fehler hier nach spätestens 10 
Minuten gehabt. Inklusive der PWM-Geschichte.

: Bearbeitet durch Moderator
von Peter D. (peda)


Lesenswert?

Lothar M. schrieb:
> Auf jeden Fall hätte ich damit den Fehler hier nach spätestens 10
> Minuten gehabt. Inklusive der PWM-Geschichte.

Da reicht auch ein simples Multimeter völlig aus. Oder notfals ne LED 
mit Vorwiderstand.

Das Hauptproblem ist aber, daß hier immer nur kleine Codeschnipselchen 
gepostet werden und nie ein compilierbarer Code. Sonst wäre auch ganz 
ohne Meßmittel jemandem die fehlende PWM aufgefallen.
Ist es denn wirklich so unsäglich schwer, ein *.c auf "Dateianhang" zu 
droppen :-(

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.