7seg und shift register

OP #4964969
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
Angehängte Dateien:
OP #4965205
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
}
Moderator (Firma: Titel) Persönliche Seite #4965224
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...
Moderator (Firma: Titel) Persönliche Seite #4965240
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...
OP #4965252
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
        ...
Moderator (Firma: Titel) Persönliche Seite #4965266
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);
OP #4965304
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);
OP #4965370
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 ...
#4966504
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 :-(

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