Hallo vielleicht kann mir jemand helfen,

ich möchte meine Verbrauchs-Zaehler (Gas, Wasser und Strom) über den AVR erfassen und über Fhem auslesen. Klappt auch soweit mit einer Abfrage des ADC in der ISR. Sobald ich aber die anderen Eingänge in der ISR abfrage( siehe Code), startet die CPU neu und alle Werte sind wieder auf Initialwert. Habe schon versucht den Watchdog auszuschalten oder die Zeit hochzusetzten, brachte aber keine Veränderung.
Wäre super jemand  eine Idee hätte was hier verkehrt ist ??

Code in Control6

static int wasserflag=0;
static int stromflag=0;
static int gasflag=0;

CONTROL_START
        ECMD_GLOBAL(counter_gas_tot, 0, uint32_t);
        ECMD_GLOBAL(counter_gas_1h, 0, uint32_t);
        ECMD_GLOBAL(counter_gas_day, 0, uint32_t);
        ECMD_GLOBAL(counter_gas_month, 0, uint32_t);

ECMD_GLOBAL(gas_h, 650,uint16_t); // oberer Grenze für Signalerkennung ECMD_GLOBAL(gas_l, 550,uint16_t); // untere Grenze für Signalerkennung
        ECMD_GLOBAL(gas_wert, 0, uint16_t);  // Analogwert


//-------------------------------------------------------------------------------------------

        ECMD_GLOBAL(counter_wasser_tot, 0, uint32_t);
        ECMD_GLOBAL(counter_wasser_1h, 0, uint32_t);
        ECMD_GLOBAL(counter_wasser_day, 0, uint32_t);
        ECMD_GLOBAL(counter_wasser_month, 0, uint32_t);

ECMD_GLOBAL(wasser_h, 650,uint16_t); // oberer Grenze für Signalerkennung ECMD_GLOBAL(wasser_l, 550,uint16_t); // untere Grenze für Signalerkennung
        ECMD_GLOBAL(wasser_wert, 0, uint16_t);  // Analogwert

//-------------------------------------------------------------------------------------------

        ECMD_GLOBAL(counter_strom_tot, 0, uint32_t);
        ECMD_GLOBAL(counter_strom_5min, 0, uint32_t);
        ECMD_GLOBAL(counter_strom_1h, 0, uint32_t);
        ECMD_GLOBAL(counter_strom_day, 0, uint32_t);
        ECMD_GLOBAL(counter_strom_month, 0, uint32_t);

ECMD_GLOBAL(strom_h, 650,uint16_t); // oberer Grenze für Signalerkennung ECMD_GLOBAL(strom_l, 550,uint16_t); // untere Grenze für Signalerkennung
        ECMD_GLOBAL(strom_wert, 0, uint16_t);  // Analogwert

//-------------------------------------------------------------------------------------------

        ECMD_GLOBAL(m, 30000,uint16_t);        //PCI-Verzoegerung
        ECMD_GLOBAL(n, 0,uint16_t);
        ECMD_GLOBAL(a, 35000,uint16_t);     //Ext. Inerrupt-Verzögerung
        ECMD_GLOBAL(b, 0,uint16_t);


//-------------------------------------------------------------------------------------------

   ON STARTUP DO

           WDTCSR |=    (1 << WDCE) | (1 << WDE);
WDTCSR |= (1 << WDE) | (1 << WDP3) | (1 << WDP0); // Watchdog Zeit 8s
           WDTCSR |=    (1 << WDCE) | (1 << WDE);
           WDTCSR &=   ~(1 << WDE); // Watchdog deaktiviren


// aktiviere den Pin Change Interrupt für PA7 / ADC7, PA6 / ADC6, PA5 /ADC5, PA4 /ADC4 PCMSK0 |= (1 << PCINT7); // Pin Change Enable Mask PA7 // Wasser aktiv PCMSK0 |= (1 << PCINT6); // Pin Change Enable Mask PA6 // Gas PCMSK0 |= (1 << PCINT5); // Pin Change Enable Mask PA5 // Strom PCMSK0 |= (1 << PCINT4); // Pin Change Enable Mask PA4 // reserve PCMSK0 &= ~(1 << PCINT3); // Pin Change Disable Mask PA3 PCMSK0 &= ~(1 << PCINT2); // Pin Change Disable Mask PA2 PCMSK0 &= ~(1 << PCINT1); // Pin Change Disable Mask PA1 PCMSK0 &= ~(1 << PCINT0); // Pin Change Disable Mask PA0

PCICR |= (1 << PCIE0); // PCICR(PCIE0) = 1 Pin Change Interrupt Enable 0

//enable Pullup Widerstand für PA7 / ADC7 (Wasser) PA6 / ADC6 und PA5 /ADC5
DDRA &= ~(1 << PA7); // DDRA(PA7) = 0 PA7 as Input DDRA &= ~(1 << PA6); // DDRA(PA6) = 0 PA6 as Input DDRA &= ~(1 << PA5); // DDRA(PA5) = 0 PA5 as Input DDRA &= ~(1 << PA4); // DDRA(PA4) = 0 PA4 as Input DDRA &= ~(1 << PA3); // DDRA(PA3) = 0 PA3 as Input DDRA &= ~(1 << PA2); // DDRA(PA2) = 0 PA2 as Input DDRA &= ~(1 << PA1); // DDRA(PA1) = 0 PA1 as Input DDRA &= ~(1 << PA0); // DDRA(PA0) = 0 PA0 as Input


PORTA |= (1 << PA7); // PORTA(PA7) = 1 enable pullup at PA7 PORTA |= (1 << PA6); // PORTA(PA6) = 1 enable pullup at PA6 PORTA |= (1 << PA5); // PORTA(PA5) = 1 enable pullup at PA5 PORTA |= (1 << PA4); // PORTA(PA4) = 1 enable pullup at PA4 PORTA |= (1 << PA3); // PORTA(PA3) = 1 enable pullup at PA3 PORTA |= (1 << PA2); // PORTA(PA2) = 1 enable pullup at PA2 PORTA |= (1 << PA1); // PORTA(PA1) = 1 enable pullup at PA1 PORTA |= (1 << PA0); // PORTA(PA0) = 1 enable pullup at PA0



// aktiviere Pullup
MCUCR &= ~(1 << PUD); // MCUCR(PUD) = 0 Pull-up Disable = 0

   END
CONTROL_END

// -------------------------------PinChange-Interruptverarbeitung---------------------------------------

ISR(PCINT0_vect)
{


 while (n <= m)
        {

          n++;
        }
  n=0;



//-------------------------Wasser------------------------------------------------------------

     wasser_wert = ADC_GET(7);
      if ((wasser_wert > wasser_h) && (wasserflag==0))
       {
         counter_wasser_tot ++;
         counter_wasser_1h ++;
         counter_wasser_day ++;
         counter_wasser_month ++;
         wasserflag=1;
       }
     else if ((wasser_wert < wasser_l) && (wasserflag==1))
       {
         wasserflag=0;
       }


//-------------------------Gas---------------------------------------------------------------

     gas_wert = ADC_GET(6);
     if ((gas_wert > gas_h) && (gasflag==0))
       {
         counter_gas_tot ++;
         counter_gas_1h ++;
         counter_gas_day ++;
         counter_gas_month ++;
         gasflag=1;
        }
     else if ((gas_wert < gas_l) && (gasflag==1))
       {
         gasflag=0;
        }

//-------------------------Strom-------------------------------------------------------------


     strom_wert = ADC_GET(5);
     if ((strom_wert > strom_h) && (stromflag==0))
       {
         counter_strom_tot ++;
         counter_strom_5min ++;
         counter_strom_1h ++;
         counter_strom_day ++;
         counter_strom_month ++;
         stromflag=1;
        }
     else if ((strom_wert < strom_l) && (stromflag==1))
       {
         stromflag=0;
        }

//---------------------------------Interrupt zurücksetzten-----------------------------------



PCIFR   &=      ~(1 << PCIF0);          // PCIFR(PCIF0) = 0

}


//-------------------------------------------------------------------------------------------



_______________________________________________
Ethersex-devel mailing list
Ethersex-devel@list.zerties.org
https://list.zerties.org/cgi-bin/mailman/listinfo/ethersex-devel

Antwort per Email an