Frage zum Portexpander 74HCT165

OP #2265139
Lesenswert?

Hallo,
ich habe folgende Schaltung (Anhang) verdrahtet und den Code (unten) 
benutzt, doch leider wird auf der Seriellen immer nur "11111111" 
ausgegeben auch wenn ich den Schalter drücke. Hat jemand eine Idee was 
ich falsch gemacht haben könnte?

Kleiner Nachtrag: Nachdem ersten übertragen ist das stopbit ja false und 
er schreibt "00000100" auf die serielle schnittstelle. Wenn ich dann 
nochmal schreiben lasse indem ich das stopbit zurücksetze wird immer nur 
"11111111" geschrieben, egal wie der Schalter steht.
1
DDRA    = 0x00000000;
2
PORTA   = 0x11111111; // 1 Pull up aktiv = Eingang 
3

4
DDRC    = 0x11111111:
1
  while(1)
2
  {
3

4
if (stopbit == false)
5
  {
6
  
7
  // Clock im Ruhezustand auf 1 
8
  PORTC |= (1<<PC4);
9

10
  // An PL mal stroben...
11

12
  // PL auf High
13
  PORTC |= (1<<PC5);
14
  // PL auf Low
15
  PORTC &= ~(1<<PC5);
16
  // PL auf High
17
  PORTC |= (1<<PC5);
18

19
  unsigned int m;
20

21
  for(m=1;m<=8;++m)
22
  {
23
  if (PINA & (1<<PINA0)) { // Logisch 1 wenn Schalter nicht gedrückt da Pullup an
24
    usart_write_str("0");
25
  } 
26
  else 
27
  {
28
    usart_write_str("1");
29
  }
30

31

32
  // An Clock mal stroben...
33

34
  // Clock auf High
35
  PORTC |= (1<<PC4);
36
  // Clock auf Low
37
  PORTC &= ~(1<<PC4);
38
  // Clock auf High
39
  PORTC |= (1<<PC4);
40
  }
41

42
 stopbit = true;
43
  }


Das stopbit setze ich dann über die serielle zurück, damit er mir nicht 
zyklisch was auf die Schnittstelle schreibt, sondern nur 1mal.
Angehängte Dateien:
Gast #2265557
Lesenswert?

Markus P. schrieb:
> DDRA    = 0x00000000;
> PORTA   = 0x11111111; // 1 Pull up aktiv = Eingang
>
> DDRC    = 0x11111111:

Das ist schonmal ziemlich daneben, das kommt so nie durch den Compiler.
1. Binärformat fängt mit 0b an, 0x ist hexadezimal.
2. : statt ;
Deine Portkonfiguration stimmt also nicht. Zumindest PC5/PL ist bei Dir 
ein Eingang statt Ausgang.
Das setzen von DDRA kannst Du Dir eigentllich auch sparen, das ist nach 
einem Reset sowieso 0.

Am Taster/Pin13 fehlt ein PullUp. Die restlichen Eingänge floaten auch, 
ebenfalls keine so gute Idee. Leg die auf definierte Pegel.
OP #2265602
Lesenswert?

> Das ist schonmal ziemlich daneben, das kommt so nie durch den Compiler.
> 1. Binärformat fängt mit 0b an, 0x ist hexadezimal.

Stimmt, das war ein Schreibfehler kahm so durch den Compiler 
(Programmers Notepad)

> 2. : statt ;

Nur nen Kopierfehler hier ins Forum, sorry

> Deine Portkonfiguration stimmt also nicht. Zumindest PC5/PL ist bei Dir
> ein Eingang statt Ausgang.

Jetzt sieht es ja so aus:

  DDRC = 0b11111111;

Somit ist  der ganze PortC, also auch PL, ein Ausgang.


> Das setzen von DDRA kannst Du Dir eigentllich auch sparen, das ist nach
> einem Reset sowieso 0.
>
> Am Taster/Pin13 fehlt ein PullUp. Die restlichen Eingänge floaten auch,
> ebenfalls keine so gute Idee. Leg die auf definierte Pegel.


Ich benutze doch die internen PullUps, aktiviert durch
PORTA   = 0b11111111; // 1 Pull up aktiv = Eingang

und halte mich an das Beispiel(s.Anhang) ist das trotzdem falsch ?
Angehängte Dateien:
Gast #2265609
Lesenswert?

Hi,

Pullup daher:

Du hast generell den Eingang als PullUp gezeichnet und ohne 
Tasterbetätigung = High im AVR hinterlegt. Möchtest du aber den Zustand 
wechseln (Taster gedrückt!) so mußt du einen "sauberen" Low-Pegel mit 
10k gegen Masse legen.

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