74HC165 auslesen C

OP #1413751
Lesenswert?
• ▲
▼
Hallo..

ich stehe gerade etwas auf dem Schlauch, so schweer kann es ja 
eigendlich nicht sein einen HC165 auszulesen.

AVR = mega8

Pinbelegung:

Pin1(-PL) = PB6
Pin2(CP) = PB5(SCK)
Pin9(Q7) = PB4(MISO)
Pin10 und 15 fest auf GND

Ich finde gerade keinen Ansatzt das Teil auszulesen in C.
in Value_HC165 soll der eingelesene Wert stehen.

Hätte von euch einer einen Code für mich ?


Vielen Dank, Markus
#1413797
Lesenswert?
• ▲
▼
Markus C. schrieb:
> Hallo..
>
> ich stehe gerade etwas auf dem Schlauch, so schweer kann es ja
> eigendlich nicht sein einen HC165 auszulesen.

An welcher Stelle hast du Schwierigkeiten?

Hier steht eigentlich ganz gut, was du alles machen musst.
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Schieberegister#Porterweiterung_f.C3.BCr_Eing.C3.A4nge


  PL einmal kurz 0/1 toggeln. Dabei sollte CLK auf 1 stehen

Damit sind die Daten im Schieberegister.

Danach mit 8 Clock-Pulsen die Bits rausschieben. (Clock Enable nicht 
vergessen). Vom Pin-Register im µC den jeweils nächsten Wert auslesen 
und mit einer << Operationen und einmaskieren und zu einem Byte 
zusammensetzen. Das macht man sinnvollerweise in einer Schleife.

Fertig.
Also: Wobei hast du Probleme?
OP #1413838
Lesenswert?
• ▲
▼
Hi.

hier mein Code ausschnitt:
1
void read_HC165(char* pBytes, char num_bytes)
2
{
3
  PORTB |= (1<<PB5);    //SCK = 0;
4
  PORTB |= (1<<PB6);    // PB6 = 0;
5
  PORTB &= ~(1<<PB6);    // PB6 = 1;
6
  
7
  for (char i=0; i<num_bytes; ++i)
8
  {
9
  *pBytes = 0;
10
  DDRB &= ~(1<<PB4);    // PB4 als Eingang
11
  PORTB &= ~(1<<PB4);    // Pullup aus
12
    
13
  for (char j=0; j<8; ++j)
14
  {
15
      *pBytes |= PINB4;
16
      if (j<7) *pBytes<<=1;
17
      PORTB &= ~(1<<PB5);  //SCK = 1;
18
      PORTB |= (1<<PB5);  //SCK = 0;
19
  }
20
  ++pBytes;
21
  }
22
}

lg, markus
#1413876
Lesenswert?
• ▲
▼
Codebegugger2 schrieb:
> und überprüfe dein Aufruf:
>
>
1
read_HC165(value_165,8);
;

Und wenn du das dann korregiert hast, solltest du dir die Frage stellen, 
was wohl passiert, wenn du ab der Startadresse eines unsigned int 8 
Bytes schreiben lässt.

Das
1
  for (char j=0; j<8; ++j)
2
  {
3
      *pBytes |= PINB4;
4
      if (j<7) *pBytes<<=1;
5
      PORTB &= ~(1<<PB5);  //SCK = 1;
6
      PORTB |= (1<<PB5);  //SCK = 0;
7
  }

sieht auch nicht richtig aus
1
  for (char j=0; j<8; ++j)
2
  {
3
      *pBytes <<= 1;
4
      if( PINB & ( 1 << PB4 ) )
5
        *pBytes |= 0x01;
6
      PORTB &= ~(1<<PB5);  //SCK = 1;
7
      PORTB |= (1<<PB5);  //SCK = 0;
8
  }

Hmm. Ich weiss jetzt nicht auswändig, ob der Clock Puls vor oder nach 
dem Abfragen des Pins kommen muss.
#1413881
Lesenswert?
• ▲
▼
Markus C. schrieb:
> hmm, sehe da gerade nix. Außer das value_HC165 als unsigned int gesetzt
> ist. auch wenn ich es als char mach geht es nicht.

Deine Funktion will die Adresse(!) haben, ab der sie das Gelesene 
ablegen soll. Du gibst ihr den Inhalt von value_165

Wieviele Schieberegister hast du da eigentlich kaskadiert? Wenn es nur 
eines ist, dann kann man die Funktion auch einfacher schreiben mit der 
Signatur
1
unsigned char read_HC165(void)
2
{
3
  unsigned char result;
4

5
  ...
6

7
  return result;
8
}

und dann
1
  value_165 = read_HC165();
OP #1413915
Lesenswert?
• ▲
▼
Karl heinz Buchegger schrieb:

> Hmm. Ich weiss jetzt nicht auswändig, ob der Clock Puls vor oder nach
> dem Abfragen des Pins kommen muss.

>Danach. Das ist im Code schon richtig so. (Bis auf die Kommentare. Die
>sind definitiv falsch)


jetzt komme ich total durcheinander.


lg, markus
#1413917
Lesenswert?
• ▲
▼
Markus C. schrieb:
> Karl heinz Buchegger schrieb:
>
>> Hmm. Ich weiss jetzt nicht auswändig, ob der Clock Puls vor oder nach
>> dem Abfragen des Pins kommen muss.
>
>>Danach. Das ist im Code schon richtig so. (Bis auf die Kommentare. Die
>>sind definitiv falsch)
>
>
> jetzt komme ich total durcheinander.

Sieh dir den Code an

  PORTB |= (1<<PB5);  //SCK = 0;

Das setzt doch nicht den Pin auf 0!
Das setzt ihn auf 1!

Also muss irgendetwas falsch sein. Entweder der Code oder der Kommentar.
#1413929
Lesenswert?
• ▲
▼
Markus C. schrieb:

> so hatte ich mir das vorgestellt nur finde mich da nicht so richtig
> zurecht gerade.

Red doch nicht um den heissen Brei herum :-) Ich bin nicht so dämlich, 
wie mein Getippe aussieht :-)

1
unsigned char read_HC165( void )
2
{
3
  unsigned char result = 0;
4

5
  // Clock auf 1 halten
6
  PORTB |= (1<<PB5);
7

8
  // ein 0/1 Puls auf der PL Leitung. Der 165 übernimmt die
9
  // externen Datenleitungen ins SR
10
  PORTB &= ~(1<<PB6);
11
  PORTB |= (1<<PB6);
12
  
13
  // Datenleitung auf Eingang, Pullup aus
14
  DDRB &= ~(1<<PB4);
15
  PORTB &= ~(1<<PB4);
16

17
  // und die 8 Bit abholen    
18
  for( unsigned char j = 0; j < 8; ++j )
19
  {
20
    result <<= 1;
21
    if( PINB & ( 1 << PB4 ) )
22
      result |= 0x01;
23

24
    // nächstes Bit aus dem SR mit einem 0/1 Puls raustakten
25
    PORTB &= ~(1<<PB5);
26
    PORTB |= (1<<PB5);
27
  }
28

29
  return result;
30
}


Versuch wenigstens jetzt zu verstehen wie das funktioniert und 
vergleiche mit dem Datenblatt des 165, wie sich der Hersteller die 
Benutzung vorgestellt hat.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.