74HC595 Flackern nicht gesetzter Pins

OP #3818793
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.
#3818808
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.
OP #3818814
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.
OP #3818912
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
(Firma: Vescomp) #3818962
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.
OP #3819117
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.
Gast #3819120
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.
(Firma: Vescomp) #3819229
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.
Gast #3819248
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.
OP #3820459
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.
#3820542
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.
OP #3820599
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.
OP #3820656
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.

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