Forum: Mikrocontroller und Digitale Elektronik 74HC595 Flackern nicht gesetzter Pins


von Stefan S. (sschultewolter)


Lesenswert?

Hallo, ich verwende die Bibiothek von Frank Link für 74HC595 
Schieberegister

http://www.mikrocontroller.net/articles/Porterweiterungen#Porterweiterung_.C3.BCber_74HC595_.28Ausgang.29_3
1
    static uint32_t last_millis;
2
    if(millis() - last_millis >= 100)
3
    {
4
      last_millis = millis();
5
      com74hc595_setPort(0, 16);
6
      com74hc595_out();
7
    }

Ich habe die Schaltung soweit wie hier aufgebaut mit 2 Registern
http://ba.protostack.com/2010/05/shift_register_07_lrg.jpg

Zusätzlich habe ich den ICs noch jeweils einen Kerko 0µ1 verpasst. 
Sobald ich ein Bit oder auch ein ganzes Byte setze, flackern alle nicht 
gesetzen Pins etwas (alle 100ms wie in der Funktion).

Was ist die Ursache? Mit und ohne /OE Schaltung habe ich es schon 
versucht. Diese kann nach meinen Kenntnissstand damit nichts zu tun 
haben.

von Karl H. (kbuchegg)


Lesenswert?

Keine Blockkondensatoren?

Das ist immer schlecht.
Jedes digital-IC, kriegt an JEDEM seiner Versorungsspanungsanschlüsse 
(ja, auch an denen die scheinbar nicht benutzt werden, also auch an 
AVcc) einen 100nF Kerko zwischen Vcc und GND spendiert. Und zwar so 
dicht wie möglich an den jeweiligen Pins.

Und ja, das beinhaltet den Mega (der kriegt 2, an Vcc-GND und an 
AVcc-GND) und auch jeden der beiden 595.


> Was ist die Ursache?
Da die SW soweit in Ordnung ist, wird dein µC wohl bei jedem 
Einachaltvorgang der LED abstürzen und das Programm wieder von vorne 
ausführen. Woraufhin er wieder abstürzt, usw. usw.

: Bearbeitet durch User
von Stefan S. (sschultewolter)


Lesenswert?

>Zusätzlich habe ich den ICs noch jeweils einen Kerko 0µ1 verpasst.
>Sobald ich ein Bit oder auch ein ganzes Byte setze, flackern alle nicht
>gesetzen Pins etwas (alle 100ms wie in der Funktion).

Ich habe zwischen VCC und GND sowohl am Attiny als auch an den 74HC595 
jeweils 1 Abblockkondensator gesetzt wie oben auch geschrieben.

Die Abblockkondensatoren sitzten am 74HC595 direkt an VCC.

Absturz würde nicht passen. Ich hab schon ein paar Szenarien 
durchgespielt, ua.
1
    if(millis() - last_millis >= 500)
2
    {
3
      last_millis = millis();
4
      
5
      com74hc595_unsetall();
6
      if(i < 16) com74hc595_setBit(i);
7
      else i = 0;
8
      com74hc595_out();
9
      i++;
10
    }

Mit einem Abblockkondensator von GND nach den einzelnen Pins halte ich 
die Probleme unter Kontrolle, aber ich kann ja schlecht bei 16 Pins 
zusätzliche 16 Kerkos einbauen.

Die Leds werden mit 1K8 an 3V3 mit etwa 1mA betrieben.

: Bearbeitet durch User
von Stefan S. (sschultewolter)


Angehängte Dateien:

Lesenswert?

Komisches Verhalten, die 74HC595 erhalten Ihren Massepunkt(GND) bei 
getrennten GND über DS.

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

Stefan S. schrieb:
> die 74HC595 erhalten Ihren Massepunkt(GND) bei getrennten GND
> über DS.

...nimmst du Drogen?

von Stefan S. (sschultewolter)


Lesenswert?

Nein ;)

Ich habe nun testweise beim Stecken die GND Verbindung zur Sammelschiene 
entfernt. Die Leds leuchten dann minimal schwächer, aber die Register 
arbeiten noch.

Erst wenn ich die Zuleitung vom MCU (DS) entferne, gehen die Register 
aus. ST_CP und SH_CP sind zu dem Zeitpunkt schon abgehangen.

Falls hilfreich,

das ist der einzige Teil, der aus der Lib angepasst wurde.
1
// Numbers of 74HC595
2
#define com74hc595_SIZE 2
3
4
// PORTS
5
#define PORT_com74hc595 PORTB
6
#define PORT_SER     PINB0    //74HC595 PIN 14
7
#define PORT_SCK     PINB1    //74HC595 PIN 12
8
#define PORT_RCK     PINB2    //74HC595 PIN 11
9
10
#define DDR_com74hc595  DDRB
11
#define DDR_SER     DDRB0  //74HC595 PIN 14
12
#define DDR_SCK     DDRB1  //74HC595 PIN 12
13
#define DDR_RCK     DDRB2  //74HC595 PIN 11

: Bearbeitet durch User
von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Stefan S. schrieb:
> Die Leds werden mit 1K8 an 3V3 mit etwa 1mA betrieben.
 Wenn du mit 3V3 und 8MHz arbeitest, würde ich dir raten, NOP zwischen
 CLK_LOW und CLK_HIGH zu setzen.

: Bearbeitet durch User
von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Stefan S. schrieb:
> Falls hilfreich,
>
> das ist der einzige Teil, der aus der Lib angepasst wurde.

 Und OE ?

von Stefan S. (sschultewolter)


Lesenswert?

OE wird nicht genutzt
1
// use with /OE
2
//#define WITH_OE

Ob 5V oder 3V3 macht kein Unterschied. Ob es an den 8MHz liegt, kann ich 
nicht sagen. Werde gleich mal andere Pins wählen, damit ich an PB0 und 
PB1 einen externen 16MHz Quarz mit Lastkondensatoren anschließen kann.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Stefan S. schrieb:
> Ob 5V oder 3V3 macht kein Unterschied. Ob es an den 8MHz liegt, kann ich

 Es macht sehr wohl einen Unterschied, nämlich in den Mindestzeiten für
 Low an Clockleitungen. Mit 8MHz bist du so ziemlich an der Grenze und
 mit 16MHz sogar darunter. Und wenn es ein Tinyx41 ist, wird es mit
 16MHz und 3V3 sowieso nichts.
 Ob das aber die Ursache ist, kann ich nicht sagen.

Stefan S. schrieb:
> Mit einem Abblockkondensator von GND nach den einzelnen Pins halte ich
> die Probleme unter Kontrolle, aber ich kann ja schlecht bei 16 Pins
> zusätzliche 16 Kerkos einbauen.

 Das heißt nur, dass der Kondensator deine Umschaltpausen überbrückt,
 da würde ich an deiner Stelle mal ansetzen.

: Bearbeitet durch User
von Stefan S. (sschultewolter)


Lesenswert?

> Es macht sehr wohl einen Unterschied, nämlich in den Mindestzeiten für
> Low an Clockleitungen. Mit 8MHz bist du so ziemlich an der Grenze und
> mit 16MHz sogar darunter. Und wenn es ein Tinyx41 ist, wird es mit
> 16MHz und 3V3 sowieso nichts.
> Ob das aber die Ursache ist, kann ich nicht sagen.

Ich kenne es vom Mega328, dass dieser laut Datenblatt keine 16MHz mit 
3V3 schafft. Habe vorhin die Fuse falsch geflasht.
EXTLCK anstatt EXTXOSC. Kommte aber gerade nicht mehr an dern 
Controller. Da muss ich morgen mal nachschauen, ob ich den ohne 
HV-Progger wieder hinbekomme. Wenn nicht, es warten noch 98 weitere 
Attiny841 darauf, verlötet zu werden.

Dass 8MHz bei 3V3 nicht funktioniert, kann ich mir ehrlich gesagt nicht 
vorstellenen. Ansich sollte es beim HC595 (ohne T) keine Probleme bei 
3V3 geben. Zumal er ja die Register immer passend setzt, nur ist halt 
ein kleine "Pieks" auf der Leitung, der alle anderen Leds zum 
Schaltpunkt einmal ganz schwach aufblinken lässt.

von anonymous (Gast)


Lesenswert?

Off Topic:

Stefan S. schrieb:
> Da muss ich morgen mal nachschauen, ob ich den ohne
> HV-Progger wieder hinbekomme. Wenn nicht, es warten noch 98 weitere
> Attiny841 darauf, verlötet zu werden.

Nimm einen von den 98 weiteren µCs, programmiere ihn so, dass ein Pin 
toggelt und verwende ihn als clock für den verfusten. Dann die Fuses 
richtig setzen und schon hast du wieder 99 zur Verfügung.

Funktioniert ganz gut, wenn man keinen eigenständigen Oszillator als 
Retter zur Verfügung hat, ist aber halt etwas Aufwand.

von Stefan S. (sschultewolter)


Lesenswert?

Im Atmel Studio wird über "Mouse-Over" nicht angeben, wie die Taktrate 
der Ext Clock ist. Kann mir die wer veraten? Den Rest bekomme ich mit 
einem anderen Gerät schon hin. ;)

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Stefan S. schrieb:
> Dass 8MHz bei 3V3 nicht funktioniert, kann ich mir ehrlich gesagt nicht
> vorstellenen.
 Das habe ich auch nicht gesagt, nur dass es bei 16MHz nicht geht.

Stefan S. schrieb:
> Ansich sollte es beim HC595 (ohne T) keine Probleme bei
> 3V3 geben. Zumal er ja die Register immer passend setzt, nur ist halt
> ein kleine "Pieks" auf der Leitung, der alle anderen Leds zum
> Schaltpunkt einmal ganz schwach aufblinken lässt.
 Und mit Kondensator nicht, ist das richtig ?
 Wenn ja, heisst das für mich dass der HC595 eine (ziemliche) Pause
 beim Umschalten hat. Und zwar gehen deine LEDs von AUS auf HIGH-Z. Da
 es sich um LC LEDs handelt, reicht das, um die LEDs schwach aufleuchten
 zu lassen. Mit Kondensator nicht, weil der das schluckt.

von Wolfgang A. (Gast)


Lesenswert?

Stefan S. schrieb:
> #define PORT_SCK     PINB1    //74HC595 PIN 12
> #define PORT_RCK     PINB2    //74HC595 PIN 11

Falls die Kommentare stimmen, scheinen Pin11 und 12 vertauscht zu sein. 
Lt. Programmcode wird PORT_SCK für den Shift-Takt und PORT_RCK für den 
Datenübernahme-Takt verwendet. Prüfe die mal mit dem Oszi.

von Stefan S. (sschultewolter)


Lesenswert?

Marc Vesely schrieb:
>  Und mit Kondensator nicht, ist das richtig ?
>  Wenn ja, heisst das für mich dass der HC595 eine (ziemliche) Pause
>  beim Umschalten hat. Und zwar gehen deine LEDs von AUS auf HIGH-Z. Da
>  es sich um LC LEDs handelt, reicht das, um die LEDs schwach aufleuchten
>  zu lassen. Mit Kondensator nicht, weil der das schluckt.

Problem leider nicht gelöst, werde nun erstmal feste Lötverbindungen 
versuchen.
Habe es nun mit

Attiny841 int. OSC (3V3, 8MHz)
Attiny841 int. OSC (5V, 8MHz)
Attiny841 ext. Quarz (5V, 16MHz)

Atmega328P ext. Quarz (5V, 16MHz)

probiert. Somit wird es wohl an der Verbindungen zu den 595 liegen, ich 
werde weitere Testen und mal einen Logic Analyser anstecken.

von Thomas (kosmos)


Lesenswert?

Ich hatte damals ein 8faches Widerstandsnetzwerk mit 10k an die Eingänge 
gesetzt. Musste aber auch mit den internen des microControllers gehen.

von Stefan S. (sschultewolter)


Lesenswert?

Versteh nicht worauf du hinaus möchtest, Thomas.

Ich hab mal die Logik Auswertung an den Ausgängen gehangen. Dort sind 
kleine sehr kurze Spitzen beim Schalten der Ausgänge zu sehen. 
Zeittechnisch leider mit dem Teil nicht zu messen.

https://www.dropbox.com/s/7jff7rinxong9rc/Screenshot%202014-09-28%2016.35.19.png?dl=0

von Bernhard K. (kraftb)


Lesenswert?

Hallo,

Also ich hab mal so Module gebastelt wo vorne eine einzelne 7-Segment 
LED Ziffer dran war und hinten ein SMD 74HC-weissichnimma shift 
register. Damit die LEDs beim durchschieben nicht flackern muss man OE 
während dem durchschieben deaktivieren. So wie ich das sehe ist !OE. Das 
heißt du musst während dem durchschieben OE auf Vdd legen.

Da mein 74HC-weissichnimma damals kein OE hatte hab ich stattdessen den 
common pol der LEDs (auf der einen seite hängen die ja alles am shift 
register und auf der anderen Seite gemeinsam "common" auf VDD bzw. VSS) 
über einen transistor vorübergehend deaktiviert.


Ursache: Unser Auge kann nichts wahrnehmen, dass kürzer als ca. 1/25 
Sekunde ist. Ich bin mir nicht ganz sicher (Biologen gefragt) aber ich 
glaube das betrifft nur "Aussetzer". Also wenn eine LED 1/25 einer 
Sekunde abgeschalten ist wird dir das nicht auffallen. Ein kurzer 
Lichtblitzer einer eigentlich abgeschalteten LED jedoch fällt einem 
durchaus auf. Wie gesagt: bin mir bezüglich der Ursache nicht ganz so 
sicher - nachleuchten tun so LEDs sicher nicht, sonst wäre ja eine IR 
Fernbedienung oder SPDIF undenkbar. Aber ich glaube das Auge erkennt den 
kurzen Lichtblitz selbst wenn er nur 1/1000 Sekunde lang ist.

von Holger L. (max5v)


Lesenswert?

Mit was für einem Takt läuft denn der Timer, bzw. sind noch andere ISR 
Aufrufe vorhanden, die evtl. beim schieben stören könnten (cli, sei)?

von Stefan S. (sschultewolter)


Lesenswert?

1
ISR(TIMER0_COMPA_vect)
2
{
3
  time_millis++;
4
  
5
  if(++time_millisecond >= 1000)
6
  {
7
    time_millisecond = 0;
8
    if(++time_second >= 60)
9
    {
10
      time_second = 0;
11
      if(++time_minute >= 60) { time_minute = 0; time_hour++;  }
12
    }
13
  }
14
}
15
16
17
void time_init(void)
18
{
19
  // Globale Interrupts sperren
20
  cli();
21
  
22
  // Timer0 konfigurieren
23
  TCCR0A = (1 << WGM01);          // CTC Modus
24
  TCCR0B |= (1 << CS01) | (1 << CS00);  // Prescaler 64
25
  #if (F_CPU == 16000000UL)
26
  OCR0A = 249;              // (F_CPU/PRESCALER)/1000-1
27
  #elif (F_CPU == 8000000UL)
28
  OCR0A = 124;
29
  #endif
30
  
31
  // Compare Interrupt erlauben
32
  TIMSK0 |= (1 << OCIE0A);
33
  
34
  // Globale Interrupts erlauben
35
  sei();
36
}

Ist aber nicht die Ursache, habe auch bereits die Timer-funktion 
komplett aus dem Programm genommen und meine Dauerschleife mit 
_delay_ms(100); ersetzt. Gleiches Problem.

von Stefan S. (sschultewolter)


Lesenswert?

1
void com74hc595_out()
2
{
3
  unsigned char anz = com74hc595_SIZE;
4
  unsigned char* serp = com74hc595 + com74hc595_SIZE;
5
6
  HC595_PORT |= (1 << HC595_OE);  //OE HIGH
7
8
  do
9
  {
10
    unsigned char bits;
11
    unsigned char data = *--serp;
12
13
    /* 8 Bits per Byte to 74HC595 */
14
    for (bits = 8; bits > 0; bits--)
15
    {
16
      HC595_PORT &= ~(1 << HC595_SER);
17
      if (data & 0x80)
18
      {
19
        HC595_PORT |= (1<<HC595_SER);
20
      };
21
22
      data <<= 1;
23
      /* Strobe on SCK to shift the bit into 74HC595  */
24
      HC595_PORT &= ~(1<<HC595_SCK);
25
      HC595_PORT |= (1<<HC595_SCK);
26
    }
27
  }
28
  while (--anz > 0);
29
30
  /* Strobe on RCK for out on 74HC595 */
31
  HC595_PORT &= ~(1 << HC595_OE);    //OE LOW
32
  HC595_PORT &= ~(1 << HC595_RCK);
33
  HC595_PORT |= (1 << HC595_RCK);
34
}

Habe in der com74hc595_out() OE ein bis ausgeschaltet, so geht es. Die 
anderne Leds flimmern nicht mehr.

von Thomas (kosmos)


Lesenswert?

Wenn die Eingänge nicht auf low oder high gezogen werden dann fangen die 
sich sehr leicht was ein also Pullups oder Pulldowns verwenden und das 
flackern ist weg unabhängig was OE macht.

http://www.reichelt.de/SIL-9-8-10K/3/index.html?&ACTION=3&LA=446&ARTICLE=18019&artnr=SIL+9-8+10K&SEARCH=Widerstand+9-8

: Bearbeitet durch User
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.