Forum: Mikrocontroller und Digitale Elektronik 74HC595 und ATtiny13 Lauflicht


von Carsten B. (corvulus)


Angehängte Dateien:

Lesenswert?

Hallo!

Ich habe eine Schaltung mit einem ATtiny13, 2x 74HC595, zwei Darlington 
Arrays und 16LEDs aufgebaut. Die LEDs sollen als Lauflicht fungieren.
Mein einziges Problem ist, dass immer wenn das erste Bit im 
Schieberegister leuchten soll (Ausgang Q0 bzw. QA (je nach hersteller)), 
dann leuchten alle LEDs an diesem Schieberegister.
Die Software sollte in Ordung sein. Ich habe zur Fehlereingrenzung 
einfach statt vorher nun einem nun ein zweites Schieberegister 
verwendet, da ich dachte, ich hätte einen Fehler in der 
Schleifenbedingung (oder dergleichen), denke aber, dass ich dies nun 
ausgrenzen kann, da auch das mittlere (also 9.) Bit den gleichen Fehler 
beim zweiten Schieberegister hervorruft.

Hier der QT:
1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
void my_delay(uint16_t ms)
5
{
6
  for(uint16_t t=0; t<=ms; t++)
7
    _delay_ms(1);
8
}
9
10
void setPin(int pin, uint16_t state)
11
{
12
  if(state)
13
  {
14
    PORTB |= (1<<pin); 
15
  }
16
  else
17
  {
18
    PORTB &= ~(1<<pin);
19
  }
20
}
21
 
22
int main (void)
23
{
24
  DDRB  = 0b11111111;
25
  PORTB = 0x00;
26
27
  while(1)
28
  {
29
    for(uint16_t i=0; i<=15; i++)
30
    {
31
      for(uint16_t k=0; k<=15; k++)
32
      {
33
        setPin(PB0, (k==i ? 1 : 0) );
34
        setPin(PB1, 1);
35
        setPin(PB1, 0); //shift
36
      }
37
      setPin(PB2, 1);
38
      setPin(PB2, 0); //save
39
40
      my_delay(300);
41
    }
42
  //  my_delay(2000);
43
  }
44
  return 0;
45
}

Youtube Video: http://www.youtube.com/watch?v=E2uuzhIYU1Q

Ich hoffe, ich habe alle nötigen Informationen mitgegeben.
Dake schoneinmal für eure Mühen.

Grüße Carsten

von Tom M. (tomm) Benutzerseite


Lesenswert?

Takst du richtig? Werden die Daten bei steigender oder fallender Flanke 
übernommen?

Schaltplan wär auch nett.

Siehe auch AVR-Tutorial: Schieberegister

von Carsten B. (corvulus)


Lesenswert?

Es funktioniert doch wie gewünscht, daher nehme ich an, dass die taktung 
stimmen muss. Die Beschaltung ist genauso, wie in dem verlinkten 
Tutorial.
Übernommen wird bei ansteigender Flanke.
Das einzige Problem ist halt, dass wenn das 1. Bit des Registers 
leuchtet, alle LEDs an dem Register leuchten.
Einen genauen Schaltplan kann ich frühestens morgen geben, da ich nicht 
zu Hause bin.
Was soltle beim takten denn falsch gemacht werden? Ich takte doch so 
oder si mit beiden Flanken ein Mal an gleicher Stelle...

von chris (Gast)


Lesenswert?

Vermutung: Du hast Leitungen vertauscht, eventuell Save und 
Datenleitung.

von Carsten B. (corvulus)


Lesenswert?

Und warum funktioniert es dann sonst richtig? Das wäre dann doch ein 
sehr großer Zufall, den ich mir auch, wenn ich mir den QT ansehe nicht 
im geringsten erklären kann. Immerhin müsste sich in dem Fall auch nur 
eine Veränderung alle 16*200ms, also 3,2s einstellen. 14 von 16 LEDs 
leuchten ja zur richtigen Zeit am richtigen Ort... grübel

von chris (Gast)


Lesenswert?

Schreibe Dein Programm so um, dass 2 LEDs durchlaufen. Dann wirst Du es 
sehen.

von Carsten B. (corvulus)


Lesenswert?

Hmm. Klingt nach einer guten Idee. Werde ich morgen einmal testen.
Hat sonst noch jemand weitere Debuggingvorschläge?

von chris (Gast)


Lesenswert?

Zuerst mit Durchgangsprüfer die Verbindungen prüfen.

Viel Erfolg,
chris

von chris (Gast)


Lesenswert?

Hallo Carsten,

wie geht's dem Lauflicht?

von Carsten B. (corvulus)


Lesenswert?

Sodele. Das ERgebnis ist: Die beiden Darlington Arrays waren falsch 
herum eingesteckt... GND lag an Q0/QA an. Faszinierend, dass sie dennoch 
so gut funktionierten... Die Schaltung funktioniert nun vollständig und 
korrekt.
Es konnte eigentlich nurnoch an diesen beiden liegen, da die Beschaltung 
der restlichen Hardware und die Software richtig sein mussten 
(Überprüfung der Geschwindigkeit mit der Delay-Zeit usw.).
Vielen Dank für die Hilfen und Mühen!

Grüße Carsten

von chris (Gast)


Lesenswert?

Erstaunlich, dass sich daraus der oben genannte Effekt ergab. Wie bist 
Du auf die Lösung gekommen?

von Carsten B. (corvulus)


Lesenswert?

Nachdenken. ;-) Dem Fehler logisch auf die Schliche kommen. Das 
Schieberegister hat ja soweit funktioniert, dass hätte es auf keinen 
Fall, wenn eine Leitung vertauscht gewesen wäre. Ich habe dann einfach 
noch einmal das Datenblatt vom Darlington-Array genommen und auf Anhieb 
den Fehler festgestellt.
Der Effekt ergibt sich dadurch, dass, wenn Qo=0 ist, der Ausgang auf GND 
liegt und der Array dadurch "normal" beschaltet ist. Wenn er nun High 
wird, dann liegt die Masse vom Array auf +5V an. Scheinbar schalten dann 
alle Transistoren irgendwie durch... Müsste man sich näher mal ansehen, 
aber nun werde ich ersteinmal lieber den ATTiny13 durch den ATTiny2313 
ersetzen und dann möchte ich eine serielle Schnittstelle und 4 PWM 
Ausgänge zum Laufen bekommen. ;-)

von chris (Gast)


Lesenswert?

Nachdenken kann man, hilft aber oft nicht weiter, weil sich die Fehler 
manchmal außerhalb des Gedankenmodells befinden.

Deshalb empfehle ich probieren+nachdenken.

von Carsten B. (corvulus)


Lesenswert?

So habe ich es ja gemacht. ;-)

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.