Forum: Mikrocontroller und Digitale Elektronik Arduino Problem beim Variablen initialisieren


von Stefan H. (stefan_h143)


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!!

1
// Zeiten und Variablen für die Drückzeitabfrage
2
static unsigned long startzeit2;
3
static unsigned long vergangenezeit2;
4
static bool gestartet2;
5
6
//Global: Variable für die aktuell einzustellende Stelle
7
// static int aktstelle = 0;
8
// ist global: static bool uhrstellenaktiv = 0;
9
//variablen für flanke weiterPin
10
static bool flweiter;
11
static bool weiteralt;
12
//variablen für flanke uhrzeitPin
13
static bool fleinstellen;
14
static bool einstellenalt;
15
// aktuelle Farbe__________________________________hier habe ich das Problem
16
static int aktFarbe = 0;
17
18
void ZeitStellen ()
19
{
20
  //Variablen für die Pins
21
  bool einstellen = digitalRead (uhrzeitPin);
22
  bool weiter = digitalRead (weiterPin);
23
24
  //Flanke vom weiter Pin abfragen
25
  if (weiter == 0 && weiteralt == 1)
26
  {
27
    flweiter = 1;
28
  } else
29
  {
30
    flweiter = 0;
31
  }
32
  weiteralt = weiter;
33
34
  //Flanke vom uhrzeitPin abfragen
35
  if (einstellen == 0 && einstellenalt == 1)
36
  {
37
    fleinstellen = 1;
38
  } else
39
  {
40
    fleinstellen = 0;
41
  }
42
  einstellenalt = einstellen;
43
44
  // Wenn der uhrzeitPin auf 0 geht, wird die Startzeit gesetzt
45
  if (gestartet2 == 0 && einstellen == 0 )
46
  {
47
    gestartet2 = 1;
48
    startzeit2 = millis();
49
  }
50
  // Geht der uhrzeitPin wieder auf 1, rücksetzten der zeiten
51
  if (einstellen == 1)
52
  {
53
    startzeit2 = 0;
54
    gestartet2 = 0;
55
    vergangenezeit2 = 0;
56
  }
57
  // Wurde die Startzeit gesetzt und die Vergangene Zeit ist zu groß, wird wird das stellen aktiv
58
  if (einstellen == 0 && gestartet2 == 1 )
59
  {
60
    vergangenezeit2 = millis() - startzeit2;
61
  }
62
  // Wenn die Vergangene zeit zu groß ist, dann uhrzeitstellen aktiv
63
  if (vergangenezeit2 > 2000)
64
  {
65
    uhrstellenaktiv = 1; // uhrzeitstellen wird aktiv, solange bis alle stellen durch sind
66
  }
67
68
69
  // Farbe ändern
70
71
  if (flweiter == 1 && uhrstellenaktiv == 0)
72
  {
73
    if (aktFarbe < 5)
74
    {
75
      aktFarbe++;
76
    }
77
    else
78
    {
79
      aktFarbe = 0;
80
    }
81
 
82
    switch (aktFarbe)
83
    {
84
      case 0:
85
        rot = 1;
86
        blau = 1;
87
        gruen = 1;
88
        break;
89
      case 1:
90
        rot = 0;
91
        blau = 1;
92
        gruen = 1;
93
        break;
94
      case 2:
95
        blau = 0;
96
        rot = 1;
97
        gruen = 1;
98
        break;
99
      case 3:
100
        gruen = 0;
101
        rot = 1;
102
        blau = 1;
103
        break;
104
      case 4:
105
        rot = 0;
106
        blau = 0;
107
        gruen = 1;
108
        break;
109
      case 5:
110
        rot = 0;
111
        gruen = 0;
112
        blau = 1;
113
        break;
114
      default:
115
        aktFarbe = 0;
116
        break;
117
    }
118
  }
119
120
121
122
  //Wenn Uhrstellen aktiv ist, dann ablauf
123
  if (uhrstellenaktiv == 1)
124
  {
125
    switch (aktstelle)
126
    {
127
      case 0:
128
        fleinstellen = 0;
129
        aktstelle = 1;
130
        break;
131
      case 1:
132
        if (flweiter == 1 && EinerMinuten == 9)
133
        {
134
          EinerMinuten = -1;
135
        }
136
        if (flweiter == 1 && EinerMinuten < 9)
137
        {
138
          EinerMinuten++;
139
        }
140
        if (fleinstellen == 1)
141
        {
142
          aktstelle = 2;
143
        }
144
        break;
145
      case 2:
146
        if (flweiter == 1 && ZehnerMinuten == 5)
147
        {
148
          ZehnerMinuten = -1;
149
        }
150
        if (flweiter == 1 && EinerMinuten < 5)
151
        {
152
          ZehnerMinuten++;
153
        }
154
        if (fleinstellen == 1)
155
        {
156
          aktstelle = 3;
157
        }
158
        break;
159
      case 3:
160
        if (flweiter == 1 && EinerStunden == 9 || (ZehnerStunden == 2 && EinerStunden == 4))
161
        {
162
          EinerStunden = -1;
163
        }
164
        if (flweiter == 1 && EinerStunden < 9)
165
        {
166
          EinerStunden++;
167
        }
168
        if (fleinstellen == 1)
169
        {
170
          aktstelle = 4;
171
        }
172
        break;
173
      case 4:
174
        if (flweiter == 1 && ZehnerStunden == 2)
175
        {
176
          ZehnerStunden = -1;
177
        }
178
        if (flweiter == 1 && ZehnerStunden < 2)
179
        {
180
          ZehnerStunden++;
181
        }
182
        if (fleinstellen == 1)
183
        {
184
          // nach letzter zahl wieder zurück zum anfang und alles wieder auf default
185
          aktstelle = 0;
186
          uhrstellenaktiv = 0;
187
          gestartet2 = 0;
188
          startzeit2 = 0;
189
          vergangenezeit2 = 0;
190
          zeiten_generieren();
191
        }
192
        break;
193
    }
194
  }
195
196
}

: Bearbeitet durch User
von Stefan H. (stefan_h143)


Lesenswert?

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

von Hubert G. (hubertg)


Lesenswert?

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

von Stefan H. (stefan_h143)


Lesenswert?

Hubert G. schrieb:
> Wenn du Hilfe willst, dann das ganze.

Gerne, als zip dann?

von Hubert G. (hubertg)


Lesenswert?

Wie dir gefällt.

von Stefan H. (stefan_h143)


Angehängte Dateien:

Lesenswert?

Okay :)

von my2ct (Gast)


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.

von Stefan H. (stefan_h143)


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.

von Hubert G. (hubertg)


Lesenswert?

Was für einen Arduino verwendest du?
Ist etwas unübersichtlich.

von Stefan H. (stefan_h143)


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 :)

von Stefan H. (stefan_h143)


Angehängte Dateien:

Lesenswert?

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

von Hubert G. (hubertg)


Lesenswert?

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

von Stefan H. (stefan_h143)


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 :)

von Ich (Gast)


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...

von Stefan H. (stefan_h143)


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 :)

von Stefan H. (stefan_h143)


Angehängte Dateien:

Lesenswert?

Hier nochmal die Library die ich für das Zeitmodul verwendet hab.

von Hubert G. (hubertg)


Lesenswert?

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

von Monster (Gast)


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.

von Stefan H. (stefan_h143)


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?

von Hubert G. (hubertg)


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.

von Stefan H. (stefan_h143)


Lesenswert?

Was bringt er bei dir für Fehler beim kompilieren?

von Hubert G. (hubertg)


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.

von Stefan H. (stefan_h143)


Lesenswert?

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

von Stefan H. (stefan_h143)


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? :)

von Hubert G. (hubertg)


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.

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.