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