Forum: Mikrocontroller und Digitale Elektronik ATMega32 vs. Input-Portexpander 74xx165


von Stefan R. (quark48) Benutzerseite


Lesenswert?

Hallo Leute!

Ich hab einen ATMega32, den programmiere ich mit C im AVR Studio.
An dem Mega32 hängt mit drei Pins (/PL, Clock & DIn) ein einzger 
Input-Portexpander 74HCT165 (Wie hier in dem Schieberegister-Tuturial).

Soweit so gut.
Der /PL hängt am PortB 6 (Out)
Der Clk hängt am PortB 5 (Out)
Der DIn hängt am PortB 4 (In)

Ich melke das Schieberegister und gebe die Daten auf nem LCD aus.

Es rührt sich auch was, nur wenn ich einen Port am Schieberegister 
anspreche, leuchten acht 1er am LCD auf. Eigentlich sollte es ja nur 
einer sein.

Guckt euch mal den Schnipsel an, der den 165er melkt! Wisst ihr 
vielleicht wo das Problem liegen könnte?
1
while(1)
2
{
3
   // Im Display in die zweite Zeile gehen!
4
  set_cursor(0,2);
5
6
  // Clock im Ruhezustand auf 1 (Wie im Tutorial!)
7
  PORTB |= (1<<PB5);
8
9
  unsigned int i;
10
  for(i=1;i<=8;++i)
11
  {
12
  // An PL mal stroben...
13
14
  // PL auf High
15
  PORTB |= (1<<PB6);
16
  // PL auf Low
17
  PORTB &= ~(1<<PB6);
18
  // PL auf High
19
  PORTB |= (1<<PB6);
20
21
22
  if (PINB & (1<<PINB4)) { 
23
    lcd_data('1');
24
  } else {
25
    lcd_data('0');
26
  }
27
28
29
  // An Clock mal stroben...
30
31
  // Clock auf High
32
  PORTB |= (1<<PB5);
33
  // Clock auf Low
34
  PORTB &= ~(1<<PB5);
35
  // Clock auf High
36
  PORTB |= (1<<PB5);
37
  }
38
}

Dankeschön schonmal für eure Antworten! :-)

von Jörg G. (joergderxte)


Lesenswert?

Ist \PL nicht dazu da, die Eingänge einmal in das Schieberegister zu 
laden, das dann anschließend rausgetaktet wird? (Du hast die Hardware, 
du liest das  Datenblatt).
Zieh mal den \PL-Strobe vor die Schleife.

rtfm, Jörg

von Stefan R. (quark48) Benutzerseite


Lesenswert?

Hallo!

Stimmt, ich Depp gnnnnnn!

/PL muss nur am Anfang mal getatktet werden.
Also vor der Schleife!
Danke! :-)

Der Code klappt jetzt:
1
while(1)
2
{
3
   // Im Display in die zweite Zeile gehen!
4
  set_cursor(0,2);
5
6
  // Clock im Ruhezustand auf 1 (Wie im Tutorial!)
7
  PORTB |= (1<<PB5);
8
9
  // An PL mal stroben...
10
11
  // PL auf High
12
  PORTB |= (1<<PB6);
13
  // PL auf Low
14
  PORTB &= ~(1<<PB6);
15
  // PL auf High
16
  PORTB |= (1<<PB6);
17
18
  unsigned int i;
19
20
  for(i=1;i<=8;++i)
21
  {
22
  if (PINB & (1<<PINB4)) { 
23
    lcd_data('1');
24
  } else {
25
    lcd_data('0');
26
  }
27
28
29
  // An Clock mal stroben...
30
31
  // Clock auf High
32
  PORTB |= (1<<PB5);
33
  // Clock auf Low
34
  PORTB &= ~(1<<PB5);
35
  // Clock auf High
36
  PORTB |= (1<<PB5);
37
  }
38
}

von Markus P. (sebastianwurst)


Lesenswert?

Wo findet mann denn das Forum für diesen Portexpander ? In C.
Danke

von Markus P. (sebastianwurst)


Lesenswert?

Weiss einer evtl auf welches Tut er sich hier bezieht? Das was ich hier 
finde ist nur für Assembler.... Danke

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.