Forum: Mikrocontroller und Digitale Elektronik Schieberegister TPIC6B595N geht nicht


von Matthias S. (dameti98)


Lesenswert?

Hallo
Ich suche schon seit Tagen den Fehler an meinem Schieberegister 
TPIC6B595N. Bei der Pinbelegung bin ich mir ziemlich sicher, dass sie 
richtig ist(habe bis jetzt nur am Drain4 eine LED angehängt). Beim Code 
bin ich mir nicht sicher, ob er richtig ist:

main:

1
 
2
         DDRB=0xFF;
3
          PORTB=0x00;
4
  
5
  
6
  int CLEAR = 4;
7
  int SCK = 2;
8
  int RCK = 1;
9
  int OE = 3;
10
  int SER = 5;
11
  
12
  
13
  PORTB |= (1 << CLEAR);
14
  
15
  
16
  
17
  PORTB |= (0 << SER);
18
  
19
  PORTB |= (1 << SCK);
20
  
21
  PORTB &= ~(1 << SCK);
22
  
23
  
24
  
25
  PORTB |= (0 << SER);
26
  
27
  PORTB |= (1 << SCK);
28
  
29
  PORTB &= ~(1 << SCK);
30
  
31
  
32
  
33
  PORTB |= (0 << SER);
34
  
35
  PORTB |= (1 << SCK);
36
  
37
  PORTB &= ~(1 << SCK);
38
  
39
  
40
  
41
  PORTB |= (1 << SER);
42
  
43
  PORTB |= (1 << SCK);
44
  
45
  PORTB &= ~(1 << SCK);
46
  
47
  
48
  
49
  PORTB |= (0 << SER);
50
  
51
  PORTB |= (1 << SCK);
52
  
53
  PORTB &= ~(1 << SCK);
54
  
55
  
56
  
57
  
58
  PORTB |= (0 << SER);
59
  
60
  PORTB |= (1 << SCK);
61
  
62
  PORTB &= ~(1 << SCK);
63
  
64
  
65
  
66
  PORTB |= (0 << SER);
67
  
68
  PORTB |= (1 << SCK);
69
  
70
  PORTB &= ~(1 << SCK);
71
  
72
  
73
  PORTB |= (0 << SER);
74
  
75
  PORTB |= (1 << SCK);
76
  
77
  PORTB &= ~(1 << SCK);
78
  
79
  
80
  PORTB |= (1 << RCK);
81
  PORTB &= ~(1 << RCK);
82
  
83
  
84
  
85
  while(1);




Bitte um Hilfe!!

von Karl H. (kbuchegg)


Lesenswert?

Sowas
1
  PORTB |= (0 << SER);
ist Unsinn.
Man kann ein Bit zwar mit einem Oder auf 1 zwingen, aber man kriegt es 
nicht mit einer Oder-Operation wieder auf 0.

Hier
1
  PORTB &= ~(1 << SCK);
hast du es richtig gemacht.

von Karl H. (kbuchegg)


Lesenswert?

Schreib das ganze doch mal als vernünftige Funktion und nicht so als 
Copy&Paste Orgie. Da muss man sonst jede einzelne Zeile kontrollieren, 
ob du irgendwo einen Tippfehler versteckt hast
1
#include <avr/io.h>
2
3
#define CLEAR   4
4
#define SCK     2
5
#define RCK     1
6
#define OE      3
7
#define SER     5
8
9
void output( uint8_t byte )
10
{
11
  uint8_t i;
12
13
  for( i = 0; i < 8; i++ )
14
  {
15
    if( byte & 0x80 )
16
      PORTB |= (1<<SER);
17
    else
18
      PORTB &= ~(1<<SER);
19
20
    byte <<= 1;
21
22
    PORTB |= (1<<SCK);
23
    PORTB &= ~(1<<SCK);
24
  }
25
26
  PORTB |= (1<<RCK);
27
  PORTB &= ~(1<<RCK);
28
}
29
30
int main()
31
{
32
  DDRB = 0xFF;
33
34
  PORTB = 0x00;
35
  PORTB |= (1<<CLEAR);
36
37
  output( 0xAA );  // abwechselnd ein 0 und ein 1 Bit
38
39
  while( 1 )
40
    ;
41
}

Wenns dann immer noch nicht klappt, dann hängst du ein paar LED an die 
Steuerpins vom 595, fügst ein paar ordentliche delay in die 
Ausgabefunktion nach jeder Port-Manipulation ein und siehst den LED zu, 
um rauszufinden, in welcher Reihenfolge welche Leitung auf High oder Low 
geht und wo du dich bei der Verdrahtung vertan hast.

: Bearbeitet durch User
von Matthias S. (dameti98)


Lesenswert?

Danke, funktioniert aber leider trotzdem noch nicht.

von Karl H. (kbuchegg)


Lesenswert?

Matthias Schaider schrieb:
> Danke, funktioniert aber leider trotzdem noch nicht.

Dann Plan B.
Wie der funktioniert, hab ich ja schon skizziert.

von Matthias S. (dameti98)


Lesenswert?

Ich habe jetzt überall eine LED zwischengeschlaten, jedoch leuchtet 
keine einzige. Um den Atmega zu testen habe ich alle LEDs zum GND 
gschalten und sie funktionieren. Die Pinbelegung habe ich jetzt schon 
zig mal überprüft und keinen Fehler entdeckt.

von Mike (Gast)


Lesenswert?

Matthias Schaider schrieb:
> Ich habe jetzt überall eine LED zwischengeschlaten, jedoch leuchtet
> keine einzige. Um den Atmega zu testen habe ich alle LEDs zum GND
> gschalten und sie funktionieren.

Polarität der LED und Vorwiderstand hast du beachtet?

von Klaus R. (klaus2)


Lesenswert?

...könnte sich doch gleich die Frage anschließen, wie man diesen 
berechnet?

Klaus.

von John Wayne sein Garagennachbar (Gast)


Lesenswert?

Klaus R. schrieb:
> ...könnte sich doch gleich die Frage anschließen, wie man diesen
> berechnet?

Och, das muß man doch nun wirklich nicht hier kären. Mach doch einen
eigenen Thread dafür auf.

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.