Go Down

Topic: Funduino MEGA2560 Charlieplexer Lauflicht verhält sich merkwürdig (Read 534 times) previous topic - next topic

firefist235

Danke Leute, aber vergessen wirs fürs erste. Ich fang einfach nochmal von vorne an und versuche alles ein bisschen strukturierter zu schreiben.

beeblebrox

Übrigens, nur mal eine Anmerkung : Eine LED auf Daueran zu schalten ist kein Beweis dafür das das Programm
läuft ! Der entsprechende Pin bleibt auch auf HIGH wenn das Programm schon lange abgesemmelt ist.
Ich benutze für so was immer eine "Heartbeatled" also eine die langsam vor sich hin blinkt.
Das Blinken steuer ich aus der Loop. Blinkt es wird zumindest die Loop noch komplett durchlaufen.

Ulli


agmue

Wenn Du offen bist für Alternativen:
  • Schieberegister vom Typ 595
  • MCP23017
  • APA102 / WS2812 gibt es als Streifen oder als 5 mm LED (siehe mein Avatar), da geht auch bunt. Am Arduino benötigst Du zwei oder einen Pin.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

firefist235

Danke agmue, aber dass ich zusätzliche ICs ordnungsgemäß einsetzen kann, bin ich noch ein Stück entfernt ;)

Habs aber halbwegs hinbekommen. Die eigentliche Ansteuerung der LEDs habe ich in eine eigene Funktion verlegt. Die Funktion wird mit einem Int entsprechend der LED-Nr und den zu verwendenden Pins aufgerufen. Die Ansteuerung für das Lauflicht liegt ebenfalls jetzt in einer eigenen Funktion. Funktioniert gut, wenn ich das Lauflicht nur in eine Richtung laufen lassen will und am Ende wieder von 0 starte. Wenn ich das Lauflicht hoch und wieder runterlaufen lassen will, scheint es als ob das Programm am Anfang oder am Ende manchmal "hängen" bleibt. Der "Timer" gibt einen Takt für die Schritte vom Lauflicht vor.

Deklarationen über Loop
Code: [Select]
bool takt = false;
int lauflichtSchritt = 1;
int schritt = 1;
unsigned long alteMillis = 0L;
unsigned int intervall = 75;


In Loop
Code: [Select]
  // Timer
  if (millis() - alteMillis >= intervall)
  {
    alteMillis = millis();
    takt = true;
  }
  else
  {
    takt = false;
  }

 // Schritt für Lauflicht setzen
  if (takt == true)
    lauflichtSchritt = lauflichtSchritt + schritt;
  if ((lauflichtSchritt > 10) || (lauflichtSchritt < 1))
//    schritt = -schritt; // VERURSACHT "AUSSETZER"
      lauflichtSchritt = 0; // FUNKTIONIERT


Lauflicht Funktion
Code: [Select]
void Lauflicht()
{
  switch (lauflichtSchritt)
  {
    case 0:
      LED[1] = true;
      LED[2] = false;
      LED[3] = false;
      LED[4] = false;
      LED[5] = false;
      LED[6] = false;
      LED[7] = true;
      LED[8] = false;
      LED[9] = false;
      LED[10] = false;
      LED[11] = false;
      LED[12] = false;
      LED[13] = true;
      LED[14] = false;
      LED[15] = false;
      LED[16] = false;
      LED[17] = false;
      LED[18] = false;
      LED[19] = false;
      LED[20] = false;
      break;

    case 1:
      LED[2] = true;
      LED[8] = true;
      LED[14] = true;

      LED[3] = false;
      LED[9] = false;
      LED[15] = false;
      break;

    case 2:
      LED[3] = true;
      LED[9] = true;
      LED[15] = true;

      LED[4] = false;
      LED[16] = false;
      break;

    case 3:
      LED[4] = true;
      LED[16] = true;

      LED[10] = false;
      break;

    case 4:
      LED[10] = true;

      LED[17] = false;
      break;

    case 5:
      LED[17] = true;

      LED[5] = false;
      LED[11] = false;
      break;

    case 6:
      LED[5] = true;
      LED[11] = true;

      LED[6] = false;
      LED[18] = false;
      break;

    case 7:
      LED[6] = true;
      LED[18] = true;

      LED[12] = false;
      break;

    case 8:
      LED[12] = true;

      LED[19] = false;
      break;

    case 9:
      LED[19] = true;

      LED[20] = false;
      break;

    case 10:
      LED[20] = true;
      break;
  }

}

firefist235

Habs gefunden. Wenn es vorkommt dass lauflichtSchritt über die Grenze hinausgeht, wird dauerhaft das Vorzeichen von schritt geändert, der Wert in lauflichtSchritt ändert sich also nicht bzw. unkontrolliert.
Habs jetzt anders gelöst
Code: [Select]
if (lauflichtSchritt > 10)
     schritt = -1;
    if (lauflichtSchritt < 1)
      schritt = 1;

Go Up