Forum: Mikrocontroller und Digitale Elektronik 74HCT165 Eingänge gehen nicht


von Alex (Gast)


Angehängte Dateien:

Lesenswert?

Hallo, ich habe mir eine Platine gebastelt. (S.Anhang) Für Diese 
Eingangsplatine habe ich folgenden Code. S.unten.
Ich bin erst mit einer Platine angefangen, insgesamt sollen mal neun 
Stück in Betrieb gehen!

Brücken sind gesteckt auf:
Jumper3: 2 und 3
Junper4: 1 und 2

jetzt funktionieren nur die ersten 8Bits, sprich der erste 74HCT165, 
nicht aber der Zweite! Kann mir einer sagen wodran das liegen 
könnte?!?!?

1
#define EPL_Anzahl 1                // Anzahl der Eingangsplatinen
2
3
void Eingaenge_abfragen ()
4
{
5
    PORTC |= (1<<PC4);
6
7
    // Mit PL alle Eingänge in das Register schieben.
8
9
    // PL auf High
10
    PORTC |= (1<<PC5);
11
    // PL auf Low
12
    PORTC &= ~(1<<PC5);
13
    // PL auf High
14
    PORTC |= (1<<PC5);
15
16
    int i=0; 
17
      //Abfragen welches Registerbit gesetzt -> mit clock weiter schieben
18
    for(i=(EPL_Anzahl * 16)-1;i>=0;i--)
19
    {
20
          
21
      if (PINA & (1<<PINA0)) 
22
      { // Logisch 0 wenn Schalter nicht gedrückt da Pullup an
23
      Eingang[i] = 0;     
24
      
25
            if      (i<= 7) StatusEingangByte1 &= ~(1 << i);
26
      else if (i<=15) StatusEingangByte2 &= ~(1 << i);
27
      
28
      else if (i<=23) StatusEingangByte3 &= ~(1 << i);
29
      else if (i<=31) StatusEingangByte4 &= ~(1 << i);
30
      
31
      else if (i<=47) StatusEingangByte5 &= ~(1 << i);
32
      else if (i<=55) StatusEingangByte6 &= ~(1 << i);
33
      
34
      else if (i<=63) StatusEingangByte7 &= ~(1 << i);
35
      else if (i<=71) StatusEingangByte8 &= ~(1 << i);
36
      
37
      else if (i<=79) StatusEingangByte9 &= ~(1 << i);
38
      else if (i<=87) StatusEingangByte10 &= ~(1 << i);
39
      
40
      else if (i<=95) StatusEingangByte11 &= ~(1 << i);
41
      else if (i<=103) StatusEingangByte12 &= ~(1 << i);
42
      
43
      else if (i<=111) StatusEingangByte13 &= ~(1 << i);
44
      else if (i<=119) StatusEingangByte14 &= ~(1 << i);
45
      
46
      else if (i<=127) StatusEingangByte15 &= ~(1 << i);
47
      else if (i<=135) StatusEingangByte16 &= ~(1 << i);
48
      
49
      else if (i<=143) StatusEingangByte17 &= ~(1 << i);
50
      else if (i<=151) StatusEingangByte18 &= ~(1 << i);
51
      
52
      } 
53
      else 
54
      {
55
      Eingang[i] = 1;  
56
      
57
      if      (i<= 7)  StatusEingangByte1 |= ( 1 << i );
58
      else if (i<= 15) StatusEingangByte2 |= ( 1 << i );
59
      
60
      else if (i<= 23) StatusEingangByte3 |= ( 1 << i );
61
      else if (i<= 31) StatusEingangByte4 |= ( 1 << i );
62
    
63
      else if (i<= 47) StatusEingangByte5 |= ( 1 << i );  
64
      else if (i<= 55) StatusEingangByte6 |= ( 1 << i );
65
      
66
      else if (i<= 63) StatusEingangByte7 |= ( 1 << i );
67
      else if (i<= 71) StatusEingangByte8 |= ( 1 << i );
68
      
69
      else if (i<= 79) StatusEingangByte9 |= ( 1 << i );
70
      else if (i<= 87) StatusEingangByte10 |= ( 1 << i );
71
      
72
      else if (i<= 95) StatusEingangByte11 |= ( 1 << i );
73
      else if (i<= 103) StatusEingangByte12 |= ( 1 << i );
74
      
75
      else if (i<= 111) StatusEingangByte13 |= ( 1 << i );
76
      else if (i<= 119) StatusEingangByte14 |= ( 1 << i );
77
      
78
      else if (i<= 127) StatusEingangByte15 |= ( 1 << i );
79
      else if (i<= 135) StatusEingangByte16 |= ( 1 << i );
80
      
81
      else if (i<= 143) StatusEingangByte17 |= ( 1 << i );
82
      else if (i<= 151) StatusEingangByte18 |= ( 1 << i );
83
      }        
84
      
85
      
86
      //Änderung feststellen      
87
      if ((memmEingangByte1 != StatusEingangByte1) || 
88
        (memmEingangByte2 != StatusEingangByte2) || 
89
        (memmEingangByte3 != StatusEingangByte3) || 
90
        (memmEingangByte4 != StatusEingangByte4) || 
91
        (memmEingangByte5 != StatusEingangByte5) || 
92
        (memmEingangByte6 != StatusEingangByte6) ||         
93
        (memmEingangByte7 != StatusEingangByte7) ||
94
        (memmEingangByte8 != StatusEingangByte8) ||
95
        (memmEingangByte9 != StatusEingangByte9) ||
96
        (memmEingangByte10 != StatusEingangByte10) ||
97
        (memmEingangByte11 != StatusEingangByte11) ||
98
        (memmEingangByte12 != StatusEingangByte12) ||
99
        (memmEingangByte13 != StatusEingangByte13) ||
100
        (memmEingangByte14 != StatusEingangByte14) ||
101
        (memmEingangByte15 != StatusEingangByte15) ||
102
        (memmEingangByte16 != StatusEingangByte16) ||
103
        (memmEingangByte17 != StatusEingangByte17) ||        
104
        (memmEingangByte18 != StatusEingangByte18))
105
        {      
106
        //Status bei Änderung neu zur Visu übertragen
107
        usart_writePC("84|01|01|%1i\r",StatusEingangByte1); //Satus Eingang byte
108
        usart_writePC("84|01|02|%1i\r",StatusEingangByte2); //Satus Eingang byte
109
        usart_writePC("84|01|03|%1i\r",StatusEingangByte3); //Satus Eingang byte
110
        usart_writePC("84|01|04|%1i\r",StatusEingangByte4); //Satus Eingang byte
111
        usart_writePC("84|01|05|%1i\r",StatusEingangByte5); //Satus Eingang byte
112
        usart_writePC("84|01|06|%1i\r",StatusEingangByte6); //Satus Eingang byte
113
        usart_writePC("84|01|07|%1i\r",StatusEingangByte7); //Satus Eingang byte
114
        usart_writePC("84|01|08|%1i\r",StatusEingangByte8); //Satus Eingang byte        
115
        usart_writePC("84|01|09|%1i\r",StatusEingangByte9); //Satus Eingang byte
116
        usart_writePC("84|01|10|%1i\r",StatusEingangByte10); //Satus Eingang byte
117
        usart_writePC("84|01|11|%1i\r",StatusEingangByte11); //Satus Eingang byte
118
        usart_writePC("84|01|12|%1i\r",StatusEingangByte12); //Satus Eingang byte        
119
        usart_writePC("84|01|13|%1i\r",StatusEingangByte13); //Satus Eingang byte
120
        usart_writePC("84|01|14|%1i\r",StatusEingangByte14); //Satus Eingang byte
121
        usart_writePC("84|01|15|%1i\r",StatusEingangByte15); //Satus Eingang byte
122
        usart_writePC("84|01|16|%1i\r",StatusEingangByte16); //Satus Eingang byte        
123
        usart_writePC("84|01|17|%1i\r",StatusEingangByte17); //Satus Eingang byte
124
        usart_writePC("84|01|18|%1i\r",StatusEingangByte18); //Satus Eingang byte          
125
        
126
      
127
        //Memm Variablen wieder gleich setzen
128
        memmEingangByte1 = StatusEingangByte1;      
129
        memmEingangByte2 = StatusEingangByte2;      
130
        memmEingangByte3 = StatusEingangByte3;    
131
        memmEingangByte4 = StatusEingangByte4;      
132
        memmEingangByte5 = StatusEingangByte5;    
133
        memmEingangByte6 = StatusEingangByte6;  
134
        memmEingangByte7 = StatusEingangByte7;      
135
        memmEingangByte8 = StatusEingangByte8;      
136
        memmEingangByte9 = StatusEingangByte9;    
137
        memmEingangByte10 = StatusEingangByte10;      
138
        memmEingangByte11 = StatusEingangByte11;    
139
        memmEingangByte12 = StatusEingangByte12;  
140
        memmEingangByte13 = StatusEingangByte13;      
141
        memmEingangByte14 = StatusEingangByte14;      
142
        memmEingangByte15 = StatusEingangByte15;    
143
        memmEingangByte16 = StatusEingangByte16;      
144
        memmEingangByte17 = StatusEingangByte17;    
145
        memmEingangByte18 = StatusEingangByte18;      
146
        }      
147
              
148
              
149
      // Mit Clock weiterschieben
150
151
      // Clock auf High
152
      PORTC |= (1<<PC4);
153
      // Clock auf Low
154
      PORTC &= ~(1<<PC4);
155
      // Clock auf High
156
      PORTC |= (1<<PC4);    
157
    }  // For Ende    
158
}

von Alex (Gast)


Angehängte Dateien:

Lesenswert?

und der Schaltplan noch...

von bko (Gast)


Lesenswert?

übersehe ich nur etwas, oder wo ist der Gnd in dem Layout?

von Alex (Gast)


Lesenswert?

Em...ja der ist als Polygon ausgeführt. Auf dem Screenshot ist nur der 
gestrichelte Rand zu sehen! Aber gehen wir mal davon aus, dass er 
überall zu Verfügung steht! Später lade ich mal mit kompletter 
Massefläche hoch!

von Mike (Gast)


Lesenswert?

Alex schrieb:
> 1.jpg
> 957,2 KB

Alex schrieb:
> 2.jpg
> 221,3 KB

Den Hinweis zu Bildformaten beim Upload hast du gelesen und inhaltlich 
verstanden?

Mit dem JPG-Format verkommt jede noch so scharfe Linienzeichnung zu 
einem weichgezeichneten Pixelbrei. Und die Gitternetzlinien 
interessieren niemand. Warum tust du uns das an???
PNG wurde extra für verlustlose Kompression von Grafiken mit wenig 
Farben und scharfen Linien erfunden.

von Alex (Gast)


Lesenswert?

Man kann aber so auch alles erkennen, wenn man nur will!

von Falk B. (falk)


Lesenswert?

@Alex (Gast)

>    1.jpg
>    957,2 KB, 33 Downloads

Kleiner Tip: Bildformate, auch wenn man alles erkennen kann.


>Hallo, ich habe mir eine Platine gebastelt. (S.Anhang) Für Diese
>Eingangsplatine habe ich folgenden Code. S.unten.

Dein Programmierstil ist, ähhh, ausbaufähig. Schon mal was von Array und 
Schleifen gehört?

>jetzt funktionieren nur die ersten 8Bits, sprich der erste 74HCT165,
>nicht aber der Zweite! Kann mir einer sagen wodran das liegen
>könnte?!?!?

Der Schaltplan sieht OK aus, dein Programm, wenn gleich arg 
gewöhnungsbedürftig soweit auch.

Prüfe, ob deine Verbindungen auf der Platine stimmen. Zur 
Fehlersuche kann man nach jedem Portzugriff eine _delay_ms(1000) 
einfügen, dann kann man das Klappern der Bits mit ein paar LEDs in den 
Signalleitungen verfolgen, auch ohne Oszi.

von Alex (Gast)


Lesenswert?

Danke für die Antwort, ja mit Arrays hast du recht! Oszi hätte ich zur 
Hand, aber nur ein altes mit zwei Kanälen.
Also meinst du auch der Fehler müsste irgendwo auf der Platine 
liegen...ist auch meine Vermutung, da das erste 74HCT165 ja geht...

von Falk B. (falk)


Lesenswert?

@ Alex (Gast)

>Danke für die Antwort, ja mit Arrays hast du recht! Oszi hätte ich zur
>Hand,

Dann nutze es!

> aber nur ein altes mit zwei Kanälen.

Reicht das nicht?

http://www.mikrocontroller.net/articles/Fehlersuche#Tips_zum_Hardwaredebugging

von Alex (Gast)


Angehängte Dateien:

Lesenswert?

Ja, das mit dem delay war ein guter Tip, sonst bringt mir das Osi 
irgendwie nicht viel. Kann nicht super damit umgehen. Nur für ein 
Phasenanschnitt habe ich es gebrauchen können.
Ich habe jetzt nochmal 4 andere Platinen zum Testen verwendet und alle 
hatten die gleichen Symptome. Es ging immer nur das erste 
Schieberegister.
Im Anhang noch einmal mit Massefläche, evtl. seht ihr irgendwo nen 
fehelendes GND oder so... ich weiss es nicht. Werde mal das messen 
machen...Danke

von Falk B. (falk)


Lesenswert?

@ Alex (Gast)

>Ja, das mit dem delay war ein guter Tip, sonst bringt mir das Osi
>irgendwie nicht viel.

Aua!

> Kann nicht super damit umgehen.

Dann lerne es! Ein Oszi ist ein SEHR leistungsfähiges Messmittel!

> Nur für ein
>Phasenanschnitt habe ich es gebrauchen können.

"Viele Vorgänge in Mikrocontrollerschaltungen sind nicht periodisch. Um 
sie zu messen braucht man meist ein Digitaloszilloskop. Hat man sowas 
nicht zur Verfügung, muss man versuchen, die Vorgänge periodisch zu 
machen, indem man z.B. eine Datenausgabe per UART oder SPI in einer 
Schleife immer wieder ausführt. Damit kann man sie auch mit einem 
Analogoszilloskop darstellen."

Kanal 1 an PL, dort wird auch getriggert. Mit dem 2. Kanal kann man 
wunderschön alle Signale prüfen und hat IMMER den richtigen Zeitbezug.

von Falk B. (falk)


Lesenswert?

@Alex (Gast)

>    1.png
>    48,8 KB, 0 Downloads

Was sollen die Schlangenlinien? Längenausgleich? Nicht bei den 
Taktfrequenzen ;-)
Masseflächen sind zwar hipp, hier aber nicht wirklich nötig. Ausserdem 
viel zu zerschnitten, um wirklich wirksam zu sein.

http://www.mikrocontroller.net/articles/Richtiges_Designen_von_Platinenlayouts#Vorgehen_bei_der_Layouterstellung

von Peter D. (peda)


Lesenswert?

Dieses Codemonster mag sich keiner ansehen, das ist die pure Folter für 
das Auge eines jeden Programmierers.

Du mußt modular denken und programieren.

Schreib erstmal eine Funktion, die ein Byte einliest.
Die ruft man dann 2-mal auf und schon hast Du 16Bit.
Die kannst Du nun bitweise auswerten.
Dazu schreibt man keine kryptischen if-else Monster, denn die versagen, 
sobald 2 Tasten gedrückt sind.
Man prüft sie also richtig bitweise.
Am einfachsten rotiert man sie in einer Schleife, so das jedes Bit mal 
Bit 1 ist und das testet man dann.

Und man schreibt auch keine 100 Ausgaben, sondern eine einzige, die die 
geänderten Werte als Variable ausgibt.

Und welchen Sinn hat es, aus 16 Bits 36 Byte zu machen?

von Alex (Gast)


Lesenswert?

Danke Peter für deine Antwort:

Also ich habe die Funktion gekürzt und Sie funktioniert augenscheinlich:

Jetzt will ich noch am einfachsten das geänderte Bit an die Serielle 
übergeben, und in eine 8Bit große Variable abspeichern. Sei ersteinmal 
egal wofür man das gebrauchen kann... Kannst Du mir bitte sagen wie ich 
das am schönsten machen kann?
1
void Eingaenge_abfragen ()
2
{
3
4
    PORTC |= (1<<PC4);
5
6
    // Mit PL alle Eingänge in das Register schieben.
7
8
    // PL auf High
9
    PORTC |= (1<<PC5);
10
    // PL auf Low
11
    PORTC &= ~(1<<PC5);
12
    // PL auf High
13
    PORTC |= (1<<PC5);
14
15
    int i; 
16
      //Abfragen welches Registerbit gesetzt -> mit clock weiter schieben
17
    for(i=16-1;i>=0;i--)
18
    {
19
          
20
      if (PINA & (1<<PINA0)) 
21
      { // Logisch 0 wenn Schalter nicht gedrückt da Pullup an
22
      Eingang[i] = 0;     
23
24
      }
25
      else 
26
      {
27
      Eingang[i] = 1;  
28
      }        
29
30
              
31
      // Mit Clock weiterschieben
32
33
      // Clock auf High
34
      PORTC |= (1<<PC4);
35
      // Clock auf Low
36
      PORTC &= ~(1<<PC4);
37
      // Clock auf High
38
      PORTC |= (1<<PC4);    
39
    }  // For Ende    
40
}

von Dietrich L. (dietrichl)


Lesenswert?

Alex schrieb:
> Kannst Du mir bitte sagen wie ich
> das am schönsten machen kann?

Vorschlag:
Nimm statt dem Array "Eingang[]" gleich eine 16-Bit Variable. Dann setze 
in der Schleife das Bit PINA0 auf das Bit 0 der Variablen und schiebe 
die Variable 1x nach links.
Zum Schluss hast Du dann alle Bits schön aufgereiht in der Variablen und 
kannst das Low-Byte und das High-Byte an die serielle Schnittstelle 
übergeben.

Gruß Dietrich

von 6A66 (Gast)


Lesenswert?

Alex schrieb:
> Brücken sind gesteckt auf:
> Jumper3: 2 und 3
> Junper4: 1 und 2

Sollte das nicht anders sein??? Zumindest nach Schaltplan?

rgds

von Alex (Gast)


Lesenswert?

Dietrich L. schrieb:
> Alex schrieb:
>> Kannst Du mir bitte sagen wie ich
>> das am schönsten machen kann?
>
> Vorschlag:
> Nimm statt dem Array "Eingang[]" gleich eine 16-Bit Variable. Dann setze
> in der Schleife das Bit PINA0 auf das Bit 0 der Variablen und schiebe
> die Variable 1x nach links.
> Zum Schluss hast Du dann alle Bits schön aufgereiht in der Variablen und
> kannst das Low-Byte und das High-Byte an die serielle Schnittstelle
> übergeben.
>
> Gruß Dietrich

Jou so versuche ich's mal...

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.