INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Die int-Variable verliert ihren Inhalt
01.11.2017, 11:40
Beitrag #9
RE: Die int-Variable verliert ihren Inhalt
Hallo,
hier noch der Sketch im CodeTag
mit ca 400 Zeilen doch relativ lang.
Gruß Christian

Code:
#include <Wire.h>
#include <EEPROM.h>
#include <avr/wdt.h>
#define RTC_I2C_ADDRESS 0x68 // I2C Adresse des RTC  DS3231 (0x68 = 104)
boolean Blinken, Uberwachung,b,Rollade[17],Fenster[17];
boolean x1,x2,x3,x4,x5,x6,x7,x8,Schalter_Hz,Schalter_Sb,Schalter_Kl,Brunnenpumpe;
boolean AutoAus,Automatic[17],Taste[17],AA_aktiv,Nacht=false,Nacht_alt=false,Sonne;
int jahr,monat,tag,stunde,minute,sekunde,x,y,Karte=201,IIC_lesen,Timer,Helligkeit;
int Anzahl_BrPu, Laufzeit_BrPu,Anzeige_alt=0;
int RS232[20],Zeit, Zeit_alt,addr, Test=0, Befehl1, Befehl2,TagNr,warten=40;
int Fenster1,Fenster2,Rollade1,BP10,Tasten;
unsigned long Millis_alt = 0,Millis10 = 0;
const int Version=2;            
void setup() {
     wdt_enable(WDTO_2S);                                    //Watchdog auf 2 Sek
     pinMode(4, OUTPUT);
     pinMode(5, OUTPUT);
     pinMode(6, OUTPUT);
     pinMode(7, OUTPUT);
     pinMode(8, OUTPUT);
     pinMode(9, OUTPUT);                                     //für Synchronisation Hz
     pinMode(11, INPUT);                                     //AA_aktiv
     pinMode(13, OUTPUT);                                    
     Wire.begin();      
     Serial.begin(9600);
     warten=EEPROM.read(8);
     rtcReadTime();  
     Serial.println("Start");                                  
}
void Jede_6_Minuten() {
     Timer=0;                                //für Anzeige
     Dachsensor();    
     Zeit_alt=Zeit;
     Automatic_einlesen();
     Rollade_nach_Zeit();
     Statistik();
     Anzeige_alt=255;                        //Anzeige Eingang aktualisieren
}
void Jede_Minute(){
    
     Zeit=stunde*10+(minute/6);
     if (Zeit_alt!=Zeit) {Jede_6_Minuten();}
     rtcReadTime();      
}
void Jede_Sekunde(){
     Blinken= not Blinken;
     digitalWrite(13, Blinken);
     digitalWrite(9, true);             //Synchronisations-Impuls
     delay(5);
     digitalWrite(9, false);
  //if (Anzeige_alt>500) {x=0;}              //ohne diese Zeile geht Wert "Anzeige_alt" verloren
     Anzeige_Eingang();    
     if (Brunnenpumpe) {Laufzeit_BrPu++;}                        
     sekunde++;
     if (sekunde>59) {
        Jede_Minute();
        if (sekunde>59) {sekunde=0;}
     }  
    // Flurlicht();
    
}
void Sekunde5() {
     Timer++;                                 //für Anzeige Küche
     PCF_Module_lesen();
     Anzeige_Kueche();
     Uberwachung = not Uberwachung;
     if (Serial.available()>0) {Com_lesen();}
     AA_aktiv=not digitalRead(11);
     Kuche_auswerten();
     Statistik_Brunnen_Pumpe();
}
void loop() {
     unsigned long currentMillis = millis();
     if (currentMillis - Millis_alt >= 998) {
        Millis_alt = currentMillis;
        Jede_Sekunde();
     }
     if (currentMillis - Millis10 >= 198) {
        Millis10 = currentMillis;
        Sekunde5();
     }  
     wdt_reset();                                                //Watchdog auf 0
}
//===============================Funktionen=======================================​==============
void Com_lesen() {
     Befehl1=Serial.read();
     delay(warten);
     Befehl2=Serial.read();
     delay(warten);
    
     if (Befehl1==200) {Befehl1=Karte;}
     if (Befehl1!=Karte) {Befehl2=0;}
     switch (Befehl2) {
            case 0:
                 break;    
            case 77:
                 Test=Serial.read();
                 Dachsensor();
                 break;  
            case 101:                                                        // ein Byte in EEPROM
                 x=Serial.read();
                 y=Serial.read();                                            
                 EEPROM.write(x,y);
                 Serial.print(64);
                 break;
            case 102:                                                       // Byte 3 - 30 auslesen
              
                 break;
            case 110:                                                       // n Byte auslesen
            
                 x=Serial.read();
                 delay(warten);
                 y=Serial.read();                            
                 break;
            case 130:
                 x=Serial.read();
                 RolladenStatus(x);
                 break;
            case 147:
                 Serial.write(Fenster1);
                 Serial.write(Fenster2);
                 Serial.write(EEPROM.read(15));                            //Automatic
                 Serial.write(EEPROM.read(16));  
                 Serial.write(Helligkeit);
                 Serial.write(analogRead(A1)/4);                           //Sonne
                 Serial.write(7);
                 Serial.write(8);
                 break;
            case 190:                                                      //Zeit senden
                 Serial.write(200);
                 Serial.write(191);

                 break;
     }
     if (Befehl1!=Karte) {Serial.flush();}
}
void Dachsensor() {                                  // Tag/Nacht berechnen, Sonne erkennen
     //----Tag/Nacht  ----Helligkeit----
     Helligkeit=255-analogRead(A0)/4;                // durch 4, damit als Byte speichern
     int Referenz=EEPROM.read(11);                
     if ((Helligkeit>Referenz) and (Zeit>=EEPROM.read(12))) {Nacht=false;}                      
     if ((Helligkeit<Referenz) or (Zeit>=EEPROM.read(13))) {Nacht=true;}
     if ((Nacht) and (Nacht !=Nacht_alt) and (Zeit<120)) {Nacht=false;}     //nicht vor 12 Uhr auf Nacht schalten
     if (Nacht_alt != Nacht) {Rollade_bei_Nacht();}
     Nacht_alt=Nacht;
}
/*void Flurlicht() {
     b=Nacht;
     if (AA_aktiv) {b= not b;}                 //Alarmanl. ein - invertieren
     digitalWrite(4, b);                      //Relais Nachtlampe
}*/
void Automatic_einlesen() {
     x=EEPROM.read(48);  
     y=EEPROM.read(49);
     for (int i=0;i<8;i++) {Automatic[i+1]=bitRead(x,i);}
     for (int i=0;i<4;i++) {Automatic[i+9]=bitRead(y,i);}
}
void Statistik() {
     x=Laufzeit_BrPu+Anzahl_BrPu*64;
     EEPROM.write(Zeit+250,x);
     Laufzeit_BrPu=0;
     Anzahl_BrPu=0;
}
void rtcReadTime(){                                            //Uhrzeit aus RTC auslesen  
  Wire.beginTransmission(RTC_I2C_ADDRESS); //Aufbau der Verbindung zur Adresse 0x68
  Wire.write(0);
  Wire.endTransmission();
  Wire.requestFrom(RTC_I2C_ADDRESS, 7);  
  x          = bcdToDec(Wire.read() & 0x7f);
  if (x < 61) {
     sekunde=x;
     minute     = bcdToDec(Wire.read());
     stunde     = bcdToDec(Wire.read() & 0x3f);
     bcdToDec(Wire.read());  // wochentag
     tag        = bcdToDec(Wire.read());
     monat      = bcdToDec(Wire.read());
     jahr       = bcdToDec(Wire.read())+2000;
     TagNr=(monat-1)*31+tag;    
     }
}
void Anzeige_Eingang() {
     //----Meldung an Eingang u. Heizung--------
     x2=not Fenster[7];                                            //Küche für Heizung
     x3=not (Fenster[1] and Fenster[12]);                          //Christina
     x4=not Fenster[2];                                            //Susanne
     x5=not (Fenster[9] and Fenster[10] and Fenster[11]);          //Wohnz
     x1=x5;                                                        //für Heizung
     x6=not Fenster[13];                                           //Bad o
     x7=not Fenster[4];                                            //Susanne
     x8=not (Fenster[1] and Fenster[12]);                          //Christina
     y=Bits_in_Byte();  
     x1=not Fenster[7];                                            //Küche
     x2=not Fenster[5];                                            //Comp
     x4=not Fenster[6];                                            //Schlafz
     x3=not Fenster[4];                                            //Bad u
     x6=not Fenster[14];
     x5=not Fenster[3];                                            //WC unten
     x7=false;
     x8=false;
     x=Bits_in_Byte();
     y=8;
     x=7;
     /*if (Anzeige_alt != (y+x)) {                                   //Daten nur bei Änderung senden
         Serial.write(200);
         Serial.write(97);
         Serial.write(y);
         Serial.write(x);            
     }*/
     Serial.print("Zeile 209 Anzeige_alt=");
     Serial.print(Anzeige_alt);
     Serial.print(";");                                            
     Anzeige_alt=y+x;
     Serial.print(" Soll=");
     Serial.println(Anzeige_alt);
}
void Statistik_Brunnen_Pumpe() {
     bool PortD12=not digitalRead(12);  
     if ((PortD12) and (not Brunnenpumpe)) {Anzahl_BrPu++;}      
     Brunnenpumpe=PortD12;
}
void PCF_Module_lesen() {                                   //Eingänge Platine Keller
     Fenster1=IIC_lese(57);                                 //BP12 Fenster 1-8
     Fenster2=IIC_lese(59);                                 //BP14 Fenster 9-15
     for (int i=1;i<9;i++) {
         Fenster[i]=bitRead(Fenster1,i-1);
         Fenster[i+8]=bitRead(Fenster2,i-1);
     }
     Byte_in_bit(IIC_lese(58));                             //BP13 Rollade 1 - 8
     Rollade[1]=x1;
     Rollade[7]=not x7;
     Rollade[8]=not x8;
}
void Anzeige_Kueche() {  
//-------------Adr 8 lesen & schreiben    
     x1=Uberwachung;                                //Störung / Ausfallüberwachung von Heizung
     x2=true;   //Störung Hz
     x3=true;   //LED Schalter Heizung
     x4=true;   //Schalter Springbr
     x5=true;   // Klingel
     x6=true;   //Waschmaschine  
     x7=true;   //Trochner
     x8=not Brunnenpumpe;
     x=Bits_in_Byte();
  //   IIC_sende(39,x);                              //BP10 Küche schreiben
     delay(10);
     BP10=(255-IIC_lese(39));
     Byte_in_bit(BP10);                            //BP10 Küche lesen
     Schalter_Hz= not x3;                          //Schalter Heizung
     Schalter_Sb= not x4;                          //Schalter Springbr
     Schalter_Kl= x5;                              //Schalter Klingel
     AutoAus=true;
     if (Timer <100) {AutoAus=false;}              //Abschaltung LEDs Automatic nach ca 20s Min
//------------Anzeige1------BP3------
         x=143;                                   //Tasten auf 1 und LED0 auf 1, x1 bis x4 auf 1
         bitWrite(x,4,Auto_Aus(Automatic[1]));    //Automatic
         bitWrite(x,6,Fenster[1]);                     //Fenster
         bitWrite(x,5,not Rollade[1]);                     //Rollade
       //  IIC_sende(32,x);                         //Daten senden
//------------Anzeige7------BP9------    
         x1=true;                      
         x2=true;
         x3=true;
         x4=Fenster[12];                                     //Dachfenster Christina
         x5=Fenster[13];                                     //Dachfenster Bad
         x6=Fenster[14];                                     //Kellertür
         x7=Fenster[15];                                     //Garage
         x8=true;                              
         x=Bits_in_Byte();
      //   IIC_sende(38,x);
//------------Tasten lesen--------Adr 32-38-
     Byte_in_bit(255-IIC_lese(32));
     Taste[13]=not x2;
     Taste[14]=not x3;
     Taste[15]=not x4;
     Taste[1]=not x8;
Byte_in_bit(255-IIC_lese(38));
     Taste[16]=not x1;
     Taste[17]=not x2;
     Taste[18]=not x3;
     b=false;
     for (int i=1;i<9;i++) {
         if (Taste[i]) {b=true;}
     }
     if (b) {Timer=0;}                         //für abschaltung LEDs Automatik
}
void Kuche_auswerten() {                             //
     digitalWrite(8,Schalter_Sb);                          //Schalter Springbr
     digitalWrite(6,Schalter_Kl);
     if (Taste[15]) {Meldung_an_Rollade(0);}
     if (Taste[16]) {Meldung_an_Rollade(2);}
     if (Taste[17]) {Meldung_an_Rollade(3);}
}
void Rollade_bei_Nacht() {    
     for (int i=0;i<10;i++) {
         int Rol=EEPROM.read(51+i*5);
         int Opt=EEPROM.read(52+i*5);
         int zeit=EEPROM.read(53+i*5);
         int Pos=Opt & 3;
         if ((bitRead(Opt,4)) and (Rol>0)) {
             if ((Nacht) and (Pos>0)) Sende_an_Rollade(i);
             if ((not Nacht) and (Pos==0)) Sende_an_Rollade(i);}                  
     }
}
void Rollade_nach_Zeit() {
    for (int i=0;i<10;i++) {
         int Rol=EEPROM.read(51+i*5);
         int Opt=EEPROM.read(52+i*5);
         int zeit=EEPROM.read(53+i*5);
         if (bitRead(Opt,2)) {                                          
            if (Zeit==zeit) {Sende_an_Rollade(i);}                    
         }
     }
}
void RolladenStatus(int Rol_Status) {}
void Sende_an_Rollade(int Nr) {          //Zeitsteuerung
     if ((Zeit>50) and (Zeit<230)){
        int Rol=EEPROM.read(51+Nr*5);
        int Pos=(EEPROM.read(52+Nr*5) & 3);
        Serial.write(204);
        Serial.write(120);
        Serial.write(Rol);
        Serial.write(Pos);
        delay(20);
     }
}
void Meldung_an_Rollade(int Pos) {    //wenn Taste betätigt wurde
     x1=Taste[11];                    //Wohnz
     x2=Taste[9];                     //Essz2
     x3=Taste[10];                    //Essz1
     x4=Taste[5];                     //Comp
     x5=Taste[3];                     //WC
     x6=Taste[1];                     //Christina
     x7=Taste[2];                     //Susanne
     x8=false;                            //frei für Bad
     int Rol=Bits_in_Byte();
     if ((Rol>0) and (Tasten!=Rol)) {        
        Serial.write(204);
        Serial.write(120);
        Serial.write(Rol);
        Serial.write(Pos);
        delay(20);
     }
     Tasten=Rol;
}
//=============================UnterFunktionen====================================​======
int IIC_lese(int nummer) {                                   //ein Byte vom PCF8574-Modul lesen  - R�ckgabewert in IIC_lesen
}
byte bcdToDec(byte val){
     return ( (val/16*10) + (val%16) );
}
boolean Auto_Aus(boolean b1) {
         b1=not b1;
         if (AutoAus) {b1=true;}
         return b1;
}
void Byte_in_bit(int x0) {
     x1=bitRead(x0,0);
     x2=bitRead(x0,1);
     x3=bitRead(x0,2);
     x4=bitRead(x0,3);
     x5=bitRead(x0,4);
     x6=bitRead(x0,5);
     x7=bitRead(x0,6);
     x8=bitRead(x0,7);
}
int  Bits_in_Byte() {
     int i=0;
     bitWrite(i,0,x1);
     bitWrite(i,1,x2);
     bitWrite(i,2,x3);
     bitWrite(i,3,x4);
     bitWrite(i,4,x5);
     bitWrite(i,5,x6);
     bitWrite(i,6,x7);
     bitWrite(i,7,x8);
     return i;
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.11.2017, 13:27
Beitrag #10
RE: Die int-Variable verliert ihren Inhalt
Hallo,
also solange ich eine Software entwickle würde ich den Watchdog mal außen vor lassen...der kann einem auch in die Suppe spucken - da bin ich ein gebranntes Kind.
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.11.2017, 13:38
Beitrag #11
RE: Die int-Variable verliert ihren Inhalt
Hallo,
auch ohne Watchdog bleibt das Problem

Gruß Christian
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.11.2017, 13:59
Beitrag #12
RE: Die int-Variable verliert ihren Inhalt
Dann gib doch mal x und y immer mit aus, wenn Du die Zuweisung Anzeige_alt=y+x; machst.
Du musst jetzt das Problem durch gezielte Serielle Ausgaben eingrenzen, das kann keiner für Dich machen.

Deine serielle Leseroutine kommt mir auch etwas merkwürdig vor.
Du fragst nach Serial.available() > 0 --> Das könnte 1 sein. Dann liest Du 2 Byte mit serial.read(), ohne diese auf -1 (=nichts da) auszuwerten.
Die delay() sind da auch nicht das Wahre.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.11.2017, 14:56
Beitrag #13
RE: Die int-Variable verliert ihren Inhalt
Hallo Tommy,
die Werte x u. y habe ich schon mal seriell ausgegeben. dort ist kein Problem erkennbar.
Beim Abfragen der Seriellen Schnittstelle wir schon -1 ausgewertet. Ich arbeite umgekehrt, es werden nur bestimmte Werte zugelassen.
Die delay() haben schon einen Sinn, ohne diese ist die Kommunikation mit meinem PC nicht gewährleistet (PC ist zu langsam).

Den Sketch habe ich mit eingestellt. Den kann jeder herunterladen und auf einem Arduino testen. weitere Hardware ist nicht erforderlich.

Gruß Christian
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.11.2017, 15:01
Beitrag #14
RE: Die int-Variable verliert ihren Inhalt
Du hast x und y aber nur unter bestimmten Bedingungen ausgegeben.

Wie soll ich das jetzt verstehen? Du hast keine Lust mehr, eine Lösung zu finden oder wartest Du darauf, dass jemand Deinen Sketch debugt, um Deinen Fehler zu finden?

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.11.2017, 15:48 (Dieser Beitrag wurde zuletzt bearbeitet: 01.11.2017 16:17 von Christian54.)
Beitrag #15
RE: Die int-Variable verliert ihren Inhalt
Hallo Tommy,
ich sitze vor dem PC und teste - ohne Erfolg. Ich würde mich freuen, wenn jemand meinen Sketch debugt. Mir fehlt noch die Erfahrung.

Die Variable x muss keine globale Variable sein. Ich habe versucht, sie in locale umzusetzen. Leider auch ohne Erfolg. Ich suche weiter.

Gruß Christian

Hallo,
Vielen Dank an alle
Habe den Fehler gefunden. Die Variable Taste[17] ist falsch deklariert. Richtig ist Taste[18]


Gruß Christian
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.11.2017, 16:29 (Dieser Beitrag wurde zuletzt bearbeitet: 01.11.2017 16:30 von Tommy56.)
Beitrag #16
RE: Die int-Variable verliert ihren Inhalt
Schön, dass Du es gefunden hast.

Ich erhalte für Anzeige_alt immer den initialwert 0, der wird also nicht anders gesetzt.

Code:
Zeile 209 Anzeige_alt=0 ; X: 7 ; Y: 8 Soll=15
Zeile 209 Anzeige_alt=0 ; X: 7 ; Y: 8 Soll=15
Zeile 209 Anzeige_alt=0 ; X: 7 ; Y: 8 Soll=15
Zeile 209 Anzeige_alt=0 ; X: 7 ; Y: 8 Soll=15

Also irgendwie ist Deine ursprüngliche Beschreibung nicht gerade zielführend.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  8 Bit als Variable Parallel einlesen Holzauge 2 257 13.08.2019 21:51
Letzter Beitrag: Holzauge
  Char in Int variable wandeln Rockman 5 577 06.03.2019 23:22
Letzter Beitrag: Tommy56
  Variable auf zwei Bytes aufteilen ? huber5093 4 629 05.03.2019 20:17
Letzter Beitrag: Tommy56
  Lokale Variable an loop zurück - Fehler Haukini 3 534 26.02.2019 22:33
Letzter Beitrag: Haukini
  Zahl aus txt-Datei als globale Variable einlesen Lance101 17 1.090 16.02.2019 14:38
Letzter Beitrag: Tommy56
  Textdatei von SDKarte mit Arduiono lesen und als Variable abspeichern Christian_Moba-Arduino 2 673 25.08.2018 17:19
Letzter Beitrag: Tommy56
  Textdatei von SDKarte mit Arduiono lesen und als Variable abspeichern Christian_Moba-Arduino 0 535 25.08.2018 11:18
Letzter Beitrag: Christian_Moba-Arduino
  32-Bit Variable beschreiben mb817 18 2.769 10.04.2018 20:04
Letzter Beitrag: Mathias
  HC-12 verschiede Variable übertragen Harry 27 4.788 23.03.2018 23:41
Letzter Beitrag: Tommy56
  Keyboard.h soll variable "schreiben" Fizzo61 4 1.313 16.02.2018 16:06
Letzter Beitrag: MicroBahner

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste