mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Arduino Problem beim Variablen initialisieren


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Stefan H. (stefan_h143)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich hätte da mal eine Frage:

Momentan baue ich mir eine Uhr mit Vfd Röhren und die ist soweit 
eigentlich auch fertig.

allerdings funktioniert eine Kleinigkeit nicht.

Ich habe zwei Pins zur Bedienung. Dazu habe ich unter anderem eine 
Funktion geschrieben um die Uhrzeit und die Beleuchtung der Röhren 
einzustellen.

Nun funktioniert das ganze aber nicht wie gewünscht. Wenn ich die 
aktuelle Farbe mit 0 initialisiere kann ich die Farben nicht weiter 
schalten. Initialisiere ich sie allerdings mit 1, dann funktioniert das 
schon.
Woran liegt denn das? Ich komm nicht drauf...

Was mir noch aufgefallen ist.
Wenn ich Serial.begin mit drin habe und etwas auslesen will, dann 
verhält sich das ganze auch wieder anders... woran liegt denn dasß=

Vielen Dank schon mal für eure Hilfe!!


// Zeiten und Variablen für die Drückzeitabfrage
static unsigned long startzeit2;
static unsigned long vergangenezeit2;
static bool gestartet2;

//Global: Variable für die aktuell einzustellende Stelle
// static int aktstelle = 0;
// ist global: static bool uhrstellenaktiv = 0;
//variablen für flanke weiterPin
static bool flweiter;
static bool weiteralt;
//variablen für flanke uhrzeitPin
static bool fleinstellen;
static bool einstellenalt;
// aktuelle Farbe__________________________________hier habe ich das Problem
static int aktFarbe = 0;

void ZeitStellen ()
{
  //Variablen für die Pins
  bool einstellen = digitalRead (uhrzeitPin);
  bool weiter = digitalRead (weiterPin);

  //Flanke vom weiter Pin abfragen
  if (weiter == 0 && weiteralt == 1)
  {
    flweiter = 1;
  } else
  {
    flweiter = 0;
  }
  weiteralt = weiter;

  //Flanke vom uhrzeitPin abfragen
  if (einstellen == 0 && einstellenalt == 1)
  {
    fleinstellen = 1;
  } else
  {
    fleinstellen = 0;
  }
  einstellenalt = einstellen;

  // Wenn der uhrzeitPin auf 0 geht, wird die Startzeit gesetzt
  if (gestartet2 == 0 && einstellen == 0 )
  {
    gestartet2 = 1;
    startzeit2 = millis();
  }
  // Geht der uhrzeitPin wieder auf 1, rücksetzten der zeiten
  if (einstellen == 1)
  {
    startzeit2 = 0;
    gestartet2 = 0;
    vergangenezeit2 = 0;
  }
  // Wurde die Startzeit gesetzt und die Vergangene Zeit ist zu groß, wird wird das stellen aktiv
  if (einstellen == 0 && gestartet2 == 1 )
  {
    vergangenezeit2 = millis() - startzeit2;
  }
  // Wenn die Vergangene zeit zu groß ist, dann uhrzeitstellen aktiv
  if (vergangenezeit2 > 2000)
  {
    uhrstellenaktiv = 1; // uhrzeitstellen wird aktiv, solange bis alle stellen durch sind
  }


  // Farbe ändern

  if (flweiter == 1 && uhrstellenaktiv == 0)
  {
    if (aktFarbe < 5)
    {
      aktFarbe++;
    }
    else
    {
      aktFarbe = 0;
    }
 
    switch (aktFarbe)
    {
      case 0:
        rot = 1;
        blau = 1;
        gruen = 1;
        break;
      case 1:
        rot = 0;
        blau = 1;
        gruen = 1;
        break;
      case 2:
        blau = 0;
        rot = 1;
        gruen = 1;
        break;
      case 3:
        gruen = 0;
        rot = 1;
        blau = 1;
        break;
      case 4:
        rot = 0;
        blau = 0;
        gruen = 1;
        break;
      case 5:
        rot = 0;
        gruen = 0;
        blau = 1;
        break;
      default:
        aktFarbe = 0;
        break;
    }
  }



  //Wenn Uhrstellen aktiv ist, dann ablauf
  if (uhrstellenaktiv == 1)
  {
    switch (aktstelle)
    {
      case 0:
        fleinstellen = 0;
        aktstelle = 1;
        break;
      case 1:
        if (flweiter == 1 && EinerMinuten == 9)
        {
          EinerMinuten = -1;
        }
        if (flweiter == 1 && EinerMinuten < 9)
        {
          EinerMinuten++;
        }
        if (fleinstellen == 1)
        {
          aktstelle = 2;
        }
        break;
      case 2:
        if (flweiter == 1 && ZehnerMinuten == 5)
        {
          ZehnerMinuten = -1;
        }
        if (flweiter == 1 && EinerMinuten < 5)
        {
          ZehnerMinuten++;
        }
        if (fleinstellen == 1)
        {
          aktstelle = 3;
        }
        break;
      case 3:
        if (flweiter == 1 && EinerStunden == 9 || (ZehnerStunden == 2 && EinerStunden == 4))
        {
          EinerStunden = -1;
        }
        if (flweiter == 1 && EinerStunden < 9)
        {
          EinerStunden++;
        }
        if (fleinstellen == 1)
        {
          aktstelle = 4;
        }
        break;
      case 4:
        if (flweiter == 1 && ZehnerStunden == 2)
        {
          ZehnerStunden = -1;
        }
        if (flweiter == 1 && ZehnerStunden < 2)
        {
          ZehnerStunden++;
        }
        if (fleinstellen == 1)
        {
          // nach letzter zahl wieder zurück zum anfang und alles wieder auf default
          aktstelle = 0;
          uhrstellenaktiv = 0;
          gestartet2 = 0;
          startzeit2 = 0;
          vergangenezeit2 = 0;
          zeiten_generieren();
        }
        break;
    }
  }

}




: Bearbeitet durch User
Autor: Stefan H. (stefan_h143)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay... irgendwie funktioniert vieles im Programm nicht mehr, wenn ich 
Serial.begin nicht mit drin habe...
hattet ihr das schon mal?

Autor: Hubert G. (hubertg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist doch nur ein Teil des Programms.
Wenn du Hilfe willst, dann das ganze.

Autor: Stefan H. (stefan_h143)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hubert G. schrieb:
> Wenn du Hilfe willst, dann das ganze.

Gerne, als zip dann?

Autor: Hubert G. (hubertg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie dir gefällt.

Autor: Stefan H. (stefan_h143)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Okay :)

Autor: my2ct (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan H. schrieb:
> Okay... irgendwie funktioniert vieles im Programm nicht mehr, wenn ich
> Serial.begin nicht mit drin habe...
> hattet ihr das schon mal?

Ohne die Funktionen setup() und loop() geht beim Arduino gar nichts.

Autor: Stefan H. (stefan_h143)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
my2ct schrieb:

> Ohne die Funktionen setup() und loop() geht beim Arduino gar nichts.

was meinst du? Es funktioniert ja eigentlich, aber wenn ich Serial.begin 
raus nehme und eben die eine Variable mit 0 initialisiere geht das 
Uhrzeit-einstellen und der Farbwechsel nicht mehr. eben beides in der 
Funktion die ich in meinem ersten Betrag rein kopiert hab. Da macht er 
dann lauter schmarrn..

Ich versteh nur irgendwie nicht wie das zusammen hängt.

Autor: Hubert G. (hubertg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was für einen Arduino verwendest du?
Ist etwas unübersichtlich.

Autor: Stefan H. (stefan_h143)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hubert G. schrieb:
> Was für einen Arduino verwendest du?
> Ist etwas unübersichtlich.

Einen nano v3.

Ja.... Das stimmt wohl.
Ich bin halt noch am üben :)

Autor: Stefan H. (stefan_h143)
Datum:
Angehängte Dateien:
  • preview image for d.jpg
    d.jpg
    62,9 KB, 245 Downloads

Bewertung
0 lesenswert
nicht lesenswert
Schaut halt momentan so aus.
Eine Röhre ist mir leider zu bruch gegangen, daher fehlt die noch und 
ist im programm auskommentiert.

Autor: Hubert G. (hubertg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie du es mir geschickt hast,lässt sich das Programm nicht kompilieren.

Autor: Stefan H. (stefan_h143)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du wirst wahrscheinlich die library für das Zeitmodul nicht haben oder? 
Ist die einzige die ich verwendet hab.
Könnt sie dir noch schicken, bin allerdings nicht mehr zuhause.

Hier gäbe es das ganze zum runter laden, da ist die dabei.
https://www.elegoo.com/tutorial/Elegoo%20The%20Most%20Complete%20Starter%20Kit%20for%20UNO%20V1.0.2018.12.24.zip

Ansonsten schick ich die einfach morgen :)

Danke für deine Hilfe schon mal :)

Autor: Ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wiso ist den momentan der Dauertrend Nixi/VFD Anzeigen mit blauen LEDs 
zu beleuchten? Die Röhren leuchten doch solbst schön? Abgesehen davon 
wenn eine Vakuum Röhre blau innerlich leuchtet ist diese meistens Kaputt 
und hatt nur noch ein schlechtes Vakuum...

Autor: Stefan H. (stefan_h143)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich schrieb:
> Wiso ist den momentan der Dauertrend Nixi/VFD Anzeigen mit blauen LEDs
> zu beleuchten? Die Röhren leuchten doch solbst schön? Abgesehen davon
> wenn eine Vakuum Röhre blau innerlich leuchtet ist diese meistens Kaputt
> und hatt nur noch ein schlechtes Vakuum...

Keine Ahnung... Ich hatte Platz und hab halt rgb leds drunter gemacht.
Aber stimmt schon, ohne ist es fast schöner :)

Autor: Stefan H. (stefan_h143)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier nochmal die Library die ich für das Zeitmodul verwendet hab.

Autor: Hubert G. (hubertg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beide Dateien mit im gleichen Ordner, DS3231.h wird trotzdem nicht 
gefunden. Muss erst mal schauen wo da der Fehler liegt.

Autor: Monster (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan H. schrieb:
> my2ct schrieb:
>
>> Ohne die Funktionen setup() und loop() geht beim Arduino gar nichts.
>
> was meinst du? Es funktioniert ja eigentlich, aber wenn ich Serial.begin
> raus nehme und eben die eine Variable mit 0 initialisiere geht das
> Uhrzeit-einstellen und der Farbwechsel nicht mehr. eben beides in der
> Funktion die ich in meinem ersten Betrag rein kopiert hab. Da macht er
> dann lauter schmarrn..
>
> Ich versteh nur irgendwie nicht wie das zusammen hängt.

Wenn sich solche Fehler zeigen, und kein logischer Fehler erkennbar ist, 
dann würde ich als erstes untersuchen, ob sich Variablenbereich und 
Stackbereich in die Quere kommen. Wenn die sich gegenseitig 
überschreiben können, dann kann es zu den seltsamsten Fehlern kommen. 
Vom Programmabsturz bis zu unerklärlichem Verhalten.

Autor: Stefan H. (stefan_h143)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Monster schrieb:
>, ob sich Variablenbereich und
> Stackbereich in die Quere kommen. Wenn die sich gegenseitig
> überschreiben können, dann kann es zu den seltsamsten Fehlern kommen.
> Vom Programmabsturz bis zu unerklärlichem Verhalten.

Hm okay... Du meinst quasi heap und stack oder?
Wie geht man dem dann aus dem Weg? Bzw wie kann man erkennen ob die zwei 
kollidieren?

Autor: Hubert G. (hubertg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das wäre auch mein erster Ansatz gewesen, aber das kompilieren 
funktioniert immer noch nicht.
Nach dem kompilieren steht am unteren Rand die größe des Programms und 
wieviel Speicher fest belegt ist.

Autor: Stefan H. (stefan_h143)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was bringt er bei dir für Fehler beim kompilieren?

Autor: Hubert G. (hubertg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fehler sind jetzt weg, es fehlte noch wire.h.
Ich komme allerdings mit deiner Formatierung nicht richtig klar. Ist 
etwas mühevoll den richtigen Ordner zu finden wenn man z.B. ZeitStellen 
sucht.

Autor: Stefan H. (stefan_h143)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay, bin immer für Tipps offen wie mans besser macht!
Aber ist dir was aufgefallen, an was das liegen könnte?

Autor: Stefan H. (stefan_h143)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay... Ich bin drauf gekommen...
ich habe über ein Array hinaus geschrieben und so wirklich andere Daten 
kaputt gemacht.
Vielen Dank für eure Hilfe :)


Hubert G. schrieb:
> Ich komme allerdings mit deiner Formatierung nicht richtig klar.

Was würdest du denn anders machen? :)

Autor: Hubert G. (hubertg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf jeden Fall die Namen zielführender vergeben.
Wie ich schon geschrieben habe, z.B. "ZeitStellen", finde ich das in 
"Setze_Zeit" oder in "Zahlen_stzen" oder in "Uhrzeit_Farben_einstellen".
Du wirst es wissen, für einen aussenstehenden eine Sucherei.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.