mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-23 18:56:38 +00:00
Add async interrupt support
- Add async interrupt support - Add generic GPIO reset
This commit is contained in:
parent
fa7fa51567
commit
8e0400eba1
@ -851,6 +851,7 @@
|
||||
#define D_SENSOR_BL6523_TX "BL6523 Tx"
|
||||
#define D_SENSOR_BL6523_RX "BL6523 Rx"
|
||||
#define D_SENSOR_HEARTBEAT "Heartbeat"
|
||||
#define D_SENSOR_RESET "Reset"
|
||||
#define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK"
|
||||
#define D_GPIO_SHIFT595_RCLK "74x595 RCLK"
|
||||
#define D_GPIO_SHIFT595_OE "74x595 OE"
|
||||
|
@ -851,6 +851,7 @@
|
||||
#define D_SENSOR_BL6523_TX "BL6523 Tx"
|
||||
#define D_SENSOR_BL6523_RX "BL6523 Rx"
|
||||
#define D_SENSOR_HEARTBEAT "Heartbeat"
|
||||
#define D_SENSOR_RESET "Reset"
|
||||
#define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK"
|
||||
#define D_GPIO_SHIFT595_RCLK "74x595 RCLK"
|
||||
#define D_GPIO_SHIFT595_OE "74x595 OE"
|
||||
|
@ -851,6 +851,7 @@
|
||||
#define D_SENSOR_BL6523_TX "BL6523 Tx"
|
||||
#define D_SENSOR_BL6523_RX "BL6523 Rx"
|
||||
#define D_SENSOR_HEARTBEAT "Heartbeat"
|
||||
#define D_SENSOR_RESET "Reset"
|
||||
#define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK"
|
||||
#define D_GPIO_SHIFT595_RCLK "74x595 RCLK"
|
||||
#define D_GPIO_SHIFT595_OE "74x595 OE"
|
||||
|
@ -851,6 +851,7 @@
|
||||
#define D_SENSOR_BL6523_TX "BL6523 Tx"
|
||||
#define D_SENSOR_BL6523_RX "BL6523 Rx"
|
||||
#define D_SENSOR_HEARTBEAT "Herzschlag"
|
||||
#define D_SENSOR_RESET "Reset"
|
||||
#define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK"
|
||||
#define D_GPIO_SHIFT595_RCLK "74x595 RCLK"
|
||||
#define D_GPIO_SHIFT595_OE "74x595 OE"
|
||||
|
@ -851,6 +851,7 @@
|
||||
#define D_SENSOR_BL6523_TX "BL6523 Tx"
|
||||
#define D_SENSOR_BL6523_RX "BL6523 Rx"
|
||||
#define D_SENSOR_HEARTBEAT "Heartbeat"
|
||||
#define D_SENSOR_RESET "Reset"
|
||||
#define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK"
|
||||
#define D_GPIO_SHIFT595_RCLK "74x595 RCLK"
|
||||
#define D_GPIO_SHIFT595_OE "74x595 OE"
|
||||
|
@ -851,6 +851,7 @@
|
||||
#define D_SENSOR_BL6523_TX "BL6523 Tx"
|
||||
#define D_SENSOR_BL6523_RX "BL6523 Rx"
|
||||
#define D_SENSOR_HEARTBEAT "Heartbeat"
|
||||
#define D_SENSOR_RESET "Reset"
|
||||
#define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK"
|
||||
#define D_GPIO_SHIFT595_RCLK "74x595 RCLK"
|
||||
#define D_GPIO_SHIFT595_OE "74x595 OE"
|
||||
|
@ -851,6 +851,7 @@
|
||||
#define D_SENSOR_BL6523_TX "BL6523 Tx"
|
||||
#define D_SENSOR_BL6523_RX "BL6523 Rx"
|
||||
#define D_SENSOR_HEARTBEAT "Heartbeat"
|
||||
#define D_SENSOR_RESET "Reset"
|
||||
#define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK"
|
||||
#define D_GPIO_SHIFT595_RCLK "74x595 RCLK"
|
||||
#define D_GPIO_SHIFT595_OE "74x595 OE"
|
||||
|
@ -851,6 +851,7 @@
|
||||
#define D_SENSOR_BL6523_TX "BL6523 Tx"
|
||||
#define D_SENSOR_BL6523_RX "BL6523 Rx"
|
||||
#define D_SENSOR_HEARTBEAT "Heartbeat"
|
||||
#define D_SENSOR_RESET "Reset"
|
||||
#define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK"
|
||||
#define D_GPIO_SHIFT595_RCLK "74x595 RCLK"
|
||||
#define D_GPIO_SHIFT595_OE "74x595 OE"
|
||||
|
@ -851,6 +851,7 @@
|
||||
#define D_SENSOR_BL6523_TX "BL6523 Tx"
|
||||
#define D_SENSOR_BL6523_RX "BL6523 Rx"
|
||||
#define D_SENSOR_HEARTBEAT "Heartbeat"
|
||||
#define D_SENSOR_RESET "Reset"
|
||||
#define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK"
|
||||
#define D_GPIO_SHIFT595_RCLK "74x595 RCLK"
|
||||
#define D_GPIO_SHIFT595_OE "74x595 OE"
|
||||
|
@ -851,6 +851,7 @@
|
||||
#define D_SENSOR_BL6523_TX "BL6523 Tx"
|
||||
#define D_SENSOR_BL6523_RX "BL6523 Rx"
|
||||
#define D_SENSOR_HEARTBEAT "Heartbeat"
|
||||
#define D_SENSOR_RESET "Reset"
|
||||
#define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK"
|
||||
#define D_GPIO_SHIFT595_RCLK "74x595 RCLK"
|
||||
#define D_GPIO_SHIFT595_OE "74x595 OE"
|
||||
|
@ -851,6 +851,7 @@
|
||||
#define D_SENSOR_BL6523_TX "BL6523 Tx"
|
||||
#define D_SENSOR_BL6523_RX "BL6523 Rx"
|
||||
#define D_SENSOR_HEARTBEAT "Heartbeat"
|
||||
#define D_SENSOR_RESET "Reset"
|
||||
#define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK"
|
||||
#define D_GPIO_SHIFT595_RCLK "74x595 RCLK"
|
||||
#define D_GPIO_SHIFT595_OE "74x595 OE"
|
||||
|
@ -851,6 +851,7 @@
|
||||
#define D_SENSOR_BL6523_TX "BL6523 - TX"
|
||||
#define D_SENSOR_BL6523_RX "BL6523 - RX"
|
||||
#define D_SENSOR_HEARTBEAT "Battito cardiaco"
|
||||
#define D_SENSOR_RESET "Reset"
|
||||
#define D_GPIO_SHIFT595_SRCLK "74x595 - SRCLK"
|
||||
#define D_GPIO_SHIFT595_RCLK "74x595 - RCLK"
|
||||
#define D_GPIO_SHIFT595_OE "74x595 - OE"
|
||||
|
@ -851,6 +851,7 @@
|
||||
#define D_SENSOR_BL6523_TX "BL6523 Tx"
|
||||
#define D_SENSOR_BL6523_RX "BL6523 Rx"
|
||||
#define D_SENSOR_HEARTBEAT "Heartbeat"
|
||||
#define D_SENSOR_RESET "Reset"
|
||||
#define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK"
|
||||
#define D_GPIO_SHIFT595_RCLK "74x595 RCLK"
|
||||
#define D_GPIO_SHIFT595_OE "74x595 OE"
|
||||
|
@ -851,6 +851,7 @@
|
||||
#define D_SENSOR_BL6523_TX "BL6523 Tx"
|
||||
#define D_SENSOR_BL6523_RX "BL6523 Rx"
|
||||
#define D_SENSOR_HEARTBEAT "Heartbeat"
|
||||
#define D_SENSOR_RESET "Reset"
|
||||
#define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK"
|
||||
#define D_GPIO_SHIFT595_RCLK "74x595 RCLK"
|
||||
#define D_GPIO_SHIFT595_OE "74x595 OE"
|
||||
|
@ -851,6 +851,7 @@
|
||||
#define D_SENSOR_BL6523_TX "BL6523 Tx"
|
||||
#define D_SENSOR_BL6523_RX "BL6523 Rx"
|
||||
#define D_SENSOR_HEARTBEAT "Heartbeat"
|
||||
#define D_SENSOR_RESET "Reset"
|
||||
#define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK"
|
||||
#define D_GPIO_SHIFT595_RCLK "74x595 RCLK"
|
||||
#define D_GPIO_SHIFT595_OE "74x595 OE"
|
||||
|
@ -851,6 +851,7 @@
|
||||
#define D_SENSOR_BL6523_TX "BL6523 Tx"
|
||||
#define D_SENSOR_BL6523_RX "BL6523 Rx"
|
||||
#define D_SENSOR_HEARTBEAT "Heartbeat"
|
||||
#define D_SENSOR_RESET "Reset"
|
||||
#define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK"
|
||||
#define D_GPIO_SHIFT595_RCLK "74x595 RCLK"
|
||||
#define D_GPIO_SHIFT595_OE "74x595 OE"
|
||||
|
@ -851,6 +851,7 @@
|
||||
#define D_SENSOR_BL6523_TX "BL6523 Tx"
|
||||
#define D_SENSOR_BL6523_RX "BL6523 Rx"
|
||||
#define D_SENSOR_HEARTBEAT "Heartbeat"
|
||||
#define D_SENSOR_RESET "Reset"
|
||||
#define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK"
|
||||
#define D_GPIO_SHIFT595_RCLK "74x595 RCLK"
|
||||
#define D_GPIO_SHIFT595_OE "74x595 OE"
|
||||
|
@ -851,6 +851,7 @@
|
||||
#define D_SENSOR_BL6523_TX "BL6523 Tx"
|
||||
#define D_SENSOR_BL6523_RX "BL6523 Rx"
|
||||
#define D_SENSOR_HEARTBEAT "Heartbeat"
|
||||
#define D_SENSOR_RESET "Reset"
|
||||
#define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK"
|
||||
#define D_GPIO_SHIFT595_RCLK "74x595 RCLK"
|
||||
#define D_GPIO_SHIFT595_OE "74x595 OE"
|
||||
|
@ -851,6 +851,7 @@
|
||||
#define D_SENSOR_BL6523_TX "BL6523 Tx"
|
||||
#define D_SENSOR_BL6523_RX "BL6523 Rx"
|
||||
#define D_SENSOR_HEARTBEAT "Heartbeat"
|
||||
#define D_SENSOR_RESET "Reset"
|
||||
#define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK"
|
||||
#define D_GPIO_SHIFT595_RCLK "74x595 RCLK"
|
||||
#define D_GPIO_SHIFT595_OE "74x595 OE"
|
||||
|
@ -851,6 +851,7 @@
|
||||
#define D_SENSOR_BL6523_TX "BL6523 Tx"
|
||||
#define D_SENSOR_BL6523_RX "BL6523 Rx"
|
||||
#define D_SENSOR_HEARTBEAT "Heartbeat"
|
||||
#define D_SENSOR_RESET "Reset"
|
||||
#define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK"
|
||||
#define D_GPIO_SHIFT595_RCLK "74x595 RCLK"
|
||||
#define D_GPIO_SHIFT595_OE "74x595 OE"
|
||||
|
@ -851,6 +851,7 @@
|
||||
#define D_SENSOR_BL6523_TX "BL6523 Tx"
|
||||
#define D_SENSOR_BL6523_RX "BL6523 Rx"
|
||||
#define D_SENSOR_HEARTBEAT "Heartbeat"
|
||||
#define D_SENSOR_RESET "Reset"
|
||||
#define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK"
|
||||
#define D_GPIO_SHIFT595_RCLK "74x595 RCLK"
|
||||
#define D_GPIO_SHIFT595_OE "74x595 OE"
|
||||
|
@ -851,6 +851,7 @@
|
||||
#define D_SENSOR_BL6523_TX "BL6523 Tx"
|
||||
#define D_SENSOR_BL6523_RX "BL6523 Rx"
|
||||
#define D_SENSOR_HEARTBEAT "Heartbeat"
|
||||
#define D_SENSOR_RESET "Reset"
|
||||
#define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK"
|
||||
#define D_GPIO_SHIFT595_RCLK "74x595 RCLK"
|
||||
#define D_GPIO_SHIFT595_OE "74x595 OE"
|
||||
|
@ -851,6 +851,7 @@
|
||||
#define D_SENSOR_BL6523_TX "BL6523 Tx"
|
||||
#define D_SENSOR_BL6523_RX "BL6523 Rx"
|
||||
#define D_SENSOR_HEARTBEAT "Heartbeat"
|
||||
#define D_SENSOR_RESET "Reset"
|
||||
#define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK"
|
||||
#define D_GPIO_SHIFT595_RCLK "74x595 RCLK"
|
||||
#define D_GPIO_SHIFT595_OE "74x595 OE"
|
||||
|
@ -851,6 +851,7 @@
|
||||
#define D_SENSOR_BL6523_TX "BL6523 Tx"
|
||||
#define D_SENSOR_BL6523_RX "BL6523 Rx"
|
||||
#define D_SENSOR_HEARTBEAT "Heartbeat"
|
||||
#define D_SENSOR_RESET "Reset"
|
||||
#define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK"
|
||||
#define D_GPIO_SHIFT595_RCLK "74x595 RCLK"
|
||||
#define D_GPIO_SHIFT595_OE "74x595 OE"
|
||||
|
@ -851,6 +851,7 @@
|
||||
#define D_SENSOR_BL6523_TX "BL6523 Tx"
|
||||
#define D_SENSOR_BL6523_RX "BL6523 Rx"
|
||||
#define D_SENSOR_HEARTBEAT "Heartbeat"
|
||||
#define D_SENSOR_RESET "Reset"
|
||||
#define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK"
|
||||
#define D_GPIO_SHIFT595_RCLK "74x595 RCLK"
|
||||
#define D_GPIO_SHIFT595_OE "74x595 OE"
|
||||
|
@ -851,6 +851,7 @@
|
||||
#define D_SENSOR_BL6523_TX "BL6523 Tx"
|
||||
#define D_SENSOR_BL6523_RX "BL6523 Rx"
|
||||
#define D_SENSOR_HEARTBEAT "Heartbeat"
|
||||
#define D_SENSOR_RESET "Reset"
|
||||
#define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK"
|
||||
#define D_GPIO_SHIFT595_RCLK "74x595 RCLK"
|
||||
#define D_GPIO_SHIFT595_OE "74x595 OE"
|
||||
|
@ -921,6 +921,19 @@ void MqttPublishTeleperiodSensor(void) {
|
||||
}
|
||||
}
|
||||
|
||||
void SkipSleep(bool state) {
|
||||
if (state) {
|
||||
TasmotaGlobal.skip_sleep += 2;
|
||||
} else {
|
||||
if (TasmotaGlobal.skip_sleep) {
|
||||
TasmotaGlobal.skip_sleep--;
|
||||
}
|
||||
if (TasmotaGlobal.skip_sleep) {
|
||||
TasmotaGlobal.skip_sleep--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*********************************************************************************************\
|
||||
* State loops
|
||||
\*********************************************************************************************/
|
||||
@ -1045,6 +1058,10 @@ void Every100mSeconds(void)
|
||||
if (!TasmotaGlobal.latching_relay_pulse) SetLatchingRelay(0, 0);
|
||||
}
|
||||
|
||||
if (TasmotaGlobal.skip_sleep) {
|
||||
TasmotaGlobal.skip_sleep--; // Clean up possible residue
|
||||
}
|
||||
|
||||
for (uint32_t i = 0; i < MAX_PULSETIMERS; i++) {
|
||||
if (TasmotaGlobal.pulse_timer[i] != 0L) { // Timer active?
|
||||
if (TimeReached(TasmotaGlobal.pulse_timer[i])) { // Timer finished?
|
||||
|
@ -175,6 +175,7 @@ struct TasmotaGlobal_t {
|
||||
uint8_t latching_relay_pulse; // Latching relay pulse timer
|
||||
uint8_t active_device; // Active device in ExecuteCommandPower
|
||||
uint8_t sleep; // Current copy of Settings->sleep
|
||||
uint8_t skip_sleep; // Abandon sleep and allow loop
|
||||
uint8_t leds_present; // Max number of LED supported
|
||||
uint8_t led_inverted; // LED inverted flag (1 = (0 = On, 1 = Off))
|
||||
uint8_t led_power; // LED power state
|
||||
@ -514,7 +515,7 @@ void BacklogLoop(void) {
|
||||
void SleepDelay(uint32_t mseconds) {
|
||||
if (!TasmotaGlobal.backlog_nodelay && mseconds) {
|
||||
uint32_t wait = millis() + mseconds;
|
||||
while (!TimeReached(wait) && !Serial.available()) { // We need to service serial buffer ASAP as otherwise we get uart buffer overrun
|
||||
while (!TimeReached(wait) && !Serial.available() && !TasmotaGlobal.skip_sleep) { // We need to service serial buffer ASAP as otherwise we get uart buffer overrun
|
||||
delay(1);
|
||||
}
|
||||
} else {
|
||||
|
@ -184,6 +184,7 @@ enum UserSelectablePins {
|
||||
GPIO_CM11_TXD, GPIO_CM11_RXD, // CM11 Serial interface
|
||||
GPIO_BL6523_TX, GPIO_BL6523_RX, // BL6523 based Watt meter Serial interface
|
||||
GPIO_ADE7880_IRQ, // ADE7880 IRQ
|
||||
GPIO_RESET, // Generic reset
|
||||
GPIO_SENSOR_END };
|
||||
|
||||
enum ProgramSelectablePins {
|
||||
@ -407,6 +408,7 @@ const char kSensorNames[] PROGMEM =
|
||||
D_SENSOR_CM11_TX "|" D_SENSOR_CM11_RX "|"
|
||||
D_SENSOR_BL6523_TX "|" D_SENSOR_BL6523_RX "|"
|
||||
D_SENSOR_ADE7880_IRQ "|"
|
||||
D_SENSOR_RESET "|"
|
||||
;
|
||||
|
||||
const char kSensorNamesFixed[] PROGMEM =
|
||||
@ -470,6 +472,7 @@ const uint16_t kGpioNiceList[] PROGMEM = {
|
||||
AGPIO(GPIO_OUTPUT_LO), // Fixed output low
|
||||
AGPIO(GPIO_HEARTBEAT), // Every second pulsed high
|
||||
AGPIO(GPIO_HEARTBEAT_INV), // Every second pulsed low
|
||||
AGPIO(GPIO_RESET), // Generic reset
|
||||
#ifdef USE_FTC532
|
||||
AGPIO(GPIO_FTC532), // FTC532 touch input
|
||||
#endif
|
||||
|
@ -12,7 +12,7 @@
|
||||
/*********************************************************************************************\
|
||||
* ADE7880 - Energy used in Shelly 3EM
|
||||
*
|
||||
* {"NAME":"Shelly 3EM","GPIO":[1,1,544,1,32,8065,0,0,640,8064,608,224,0,0],"FLAG":0,"BASE":18}
|
||||
* {"NAME":"Shelly 3EM","GPIO":[1,1,544,1,32,8065,0,0,640,8064,608,224,8096,0],"FLAG":0,"BASE":18}
|
||||
*
|
||||
* Based on datasheet from https://www.analog.com/en/products/ade7880.html
|
||||
*
|
||||
@ -37,6 +37,7 @@
|
||||
#define ADE7880_APHCAL_INIT 0xD895 // = 55445 (149)
|
||||
#define ADE7880_BPHCAL_INIT 0xD8A9 // = 55456 (169)
|
||||
#define ADE7880_CPHCAL_INIT 0xD89D // = 55453 (157)
|
||||
//#define ADE7880_COMPMODE_FREQ 0x4000 // Connected to networks with fundamental frequencies between 55 Hz and 66 Hz. Default 45 Hz to 55 Hz
|
||||
|
||||
enum Ade7880DspRegisters {
|
||||
ADE7880_AIGAIN = 0x4380, // 0x4380 R/W 24 32 ZPSE S 0x000000 Phase A current gain adjust.
|
||||
@ -332,13 +333,13 @@ bool Ade7880Init(void) {
|
||||
if (bitSet(status1, 15)) { // RSTDONE
|
||||
// Power on or Reset
|
||||
Ade7880WriteVerify(ADE7880_CONFIG2, 0x02); // ADE7880_I2C_LOCK
|
||||
Ade7880WriteVerify(ADE7880_STATUS1, 0x3FFE8930); // Acknowledge RSTDONE
|
||||
Ade7880WriteVerify(ADE7880_STATUS1, 0x3FFE8930); // Acknowledge RSTDONE - Reset IRQ1 line
|
||||
status1 = Ade7880ReadVerify(ADE7880_STATUS1); // 0x01A00007
|
||||
|
||||
uint8_t version = Ade7880ReadVerify(ADE7880_Version); // 0x01
|
||||
}
|
||||
|
||||
delayMicroseconds(240);
|
||||
delayMicroseconds(240); // Grab parameters from flash/filesystem
|
||||
|
||||
Ade7880WriteVerify(ADE7880_Gain, 0x0000); // Gain register set to 1 for current, and voltage
|
||||
Ade7880WriteVerify(ADE7880_APGAIN, ADE7880_APGAIN_INIT);
|
||||
@ -354,20 +355,26 @@ bool Ade7880Init(void) {
|
||||
Ade7880WriteVerify(ADE7880_APHCAL, ADE7880_APHCAL_INIT);
|
||||
Ade7880WriteVerify(ADE7880_BPHCAL, ADE7880_BPHCAL_INIT);
|
||||
Ade7880WriteVerify(ADE7880_CPHCAL, ADE7880_CPHCAL_INIT);
|
||||
#ifdef ADE7880_COMPMODE_FREQ
|
||||
Ade7880WriteVerify(ADE7880_COMPMODE, 0x01FF | ADE7880_COMPMODE_FREQ); // Connected to networks with fundamental frequencies between 55 Hz and 66 Hz. Default is 45 Hz and 55 Hz.
|
||||
#endif
|
||||
bool error = false;
|
||||
if (ADE7880_AVGAIN_INIT != Ade7880ReadVerify(ADE7880_AVGAIN)) { error = true; }
|
||||
if (ADE7880_BVGAIN_INIT != Ade7880ReadVerify(ADE7880_BVGAIN)) { error = true; }
|
||||
if (ADE7880_CVGAIN_INIT != Ade7880ReadVerify(ADE7880_CVGAIN)) { error = true; }
|
||||
if (ADE7880_AIGAIN_INIT != Ade7880ReadVerify(ADE7880_AIGAIN)) { error = true; }
|
||||
if (ADE7880_BIGAIN_INIT != Ade7880ReadVerify(ADE7880_BIGAIN)) { error = true; }
|
||||
if (ADE7880_CIGAIN_INIT != Ade7880ReadVerify(ADE7880_CIGAIN)) { error = true; }
|
||||
if (ADE7880_NIGAIN_INIT != Ade7880ReadVerify(ADE7880_NIGAIN)) { error = true; }
|
||||
if (ADE7880_APGAIN_INIT != Ade7880ReadVerify(ADE7880_APGAIN)) { error = true; }
|
||||
if (ADE7880_BPGAIN_INIT != Ade7880ReadVerify(ADE7880_BPGAIN)) { error = true; }
|
||||
if (ADE7880_CPGAIN_INIT != Ade7880ReadVerify(ADE7880_CPGAIN)) { error = true; }
|
||||
if (ADE7880_APHCAL_INIT != Ade7880ReadVerify(ADE7880_APHCAL)) { error = true; }
|
||||
if (ADE7880_BPHCAL_INIT != Ade7880ReadVerify(ADE7880_BPHCAL)) { error = true; }
|
||||
if (ADE7880_CPHCAL_INIT != Ade7880ReadVerify(ADE7880_CPHCAL)) { error = true; }
|
||||
else if (ADE7880_BVGAIN_INIT != Ade7880ReadVerify(ADE7880_BVGAIN)) { error = true; }
|
||||
else if (ADE7880_CVGAIN_INIT != Ade7880ReadVerify(ADE7880_CVGAIN)) { error = true; }
|
||||
else if (ADE7880_AIGAIN_INIT != Ade7880ReadVerify(ADE7880_AIGAIN)) { error = true; }
|
||||
else if (ADE7880_BIGAIN_INIT != Ade7880ReadVerify(ADE7880_BIGAIN)) { error = true; }
|
||||
else if (ADE7880_CIGAIN_INIT != Ade7880ReadVerify(ADE7880_CIGAIN)) { error = true; }
|
||||
else if (ADE7880_NIGAIN_INIT != Ade7880ReadVerify(ADE7880_NIGAIN)) { error = true; }
|
||||
else if (ADE7880_APGAIN_INIT != Ade7880ReadVerify(ADE7880_APGAIN)) { error = true; }
|
||||
else if (ADE7880_BPGAIN_INIT != Ade7880ReadVerify(ADE7880_BPGAIN)) { error = true; }
|
||||
else if (ADE7880_CPGAIN_INIT != Ade7880ReadVerify(ADE7880_CPGAIN)) { error = true; }
|
||||
else if (ADE7880_APHCAL_INIT != Ade7880ReadVerify(ADE7880_APHCAL)) { error = true; }
|
||||
else if (ADE7880_BPHCAL_INIT != Ade7880ReadVerify(ADE7880_BPHCAL)) { error = true; }
|
||||
else if (ADE7880_CPHCAL_INIT != Ade7880ReadVerify(ADE7880_CPHCAL)) { error = true; }
|
||||
#ifdef ADE7880_COMPMODE_FREQ
|
||||
else if ((0x01FF | ADE7880_COMPMODE_FREQ) != Ade7880ReadVerify(ADE7880_COMPMODE)) { error = true; }
|
||||
#endif
|
||||
if (error) {
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("A78: Error initializing parameters"));
|
||||
return false;
|
||||
@ -400,16 +407,32 @@ bool Ade7880Init(void) {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Ade7880Service1(void) {
|
||||
// Init sequence
|
||||
SkipSleep(false);
|
||||
bool result = Ade7880Init();
|
||||
Ade7880.irq1_state = 0;
|
||||
return result;
|
||||
}
|
||||
|
||||
void IRAM_ATTR Ade7880Isr1(void) {
|
||||
// Init sequence
|
||||
if (!Ade7880.irq1_state) {
|
||||
Ade7880.irq1_state = 1;
|
||||
SkipSleep(true);
|
||||
}
|
||||
}
|
||||
|
||||
void Ade7880Cycle(void) {
|
||||
// Cycle sequence (takes 5ms)
|
||||
uint32_t status0 = Ade7880ReadVerify(ADE7880_STATUS0); // 0x000FEFE0
|
||||
if (!bitSet(status0, 5)) { // LENERGY
|
||||
return;
|
||||
} else {
|
||||
Ade7880WriteVerify(ADE7880_STATUS0, 0x00000020); // Acknowledge LENERGY
|
||||
Ade7880WriteVerify(ADE7880_STATUS0, 0x00000020); // Acknowledge LENERGY - Reset IRQ0 line
|
||||
status0 = Ade7880ReadVerify(ADE7880_STATUS0); // 0x000FEFC0
|
||||
}
|
||||
if (Ade7880.cycle_count < 3) {
|
||||
if (Ade7880.cycle_count < 2) { // Allow calibration stabilization
|
||||
Ade7880.cycle_count++;
|
||||
return; // Skip first two cycles
|
||||
}
|
||||
@ -436,42 +459,30 @@ void Ade7880Cycle(void) {
|
||||
Ade7880.apparent_energy[1] = Ade7880ReadVerify(ADE7880_BVAHR); // 0xFFFFFFC7
|
||||
Ade7880.apparent_energy[2] = Ade7880ReadVerify(ADE7880_CVAHR); // 0xFFFFFFC6
|
||||
|
||||
uint16_t comp_mode = Ade7880ReadVerify(ADE7880_COMPMODE); // 0x01FF
|
||||
|
||||
Ade7880.angle[0] = Ade7880ReadVerify(ADE7880_ANGLE0); // 0x13FD
|
||||
uint16_t comp_mode = Ade7880ReadVerify(ADE7880_COMPMODE); // 0x01FF (or 0x41FF) = Angles between phase voltages and phase currents are measured
|
||||
uint32_t fline = (bitSet(comp_mode, 14)) ? 60 : 50; // Line frequency in Hz
|
||||
Ade7880.angle[0] = Ade7880ReadVerify(ADE7880_ANGLE0); // 0x13FD = cos(5117 * 360 * fline / 256000) = cos_phi
|
||||
Ade7880.angle[1] = Ade7880ReadVerify(ADE7880_ANGLE1); // 0x0706
|
||||
Ade7880.angle[2] = Ade7880ReadVerify(ADE7880_ANGLE2); // 0x0859
|
||||
}
|
||||
|
||||
void Ade7880Reset(void) {
|
||||
pinMode(16, OUTPUT); // Reset pin ADE7880
|
||||
digitalWrite(16, 0);
|
||||
delay(1);
|
||||
digitalWrite(16, 1);
|
||||
pinMode(16, INPUT);
|
||||
}
|
||||
|
||||
void IRAM_ATTR Ade7880Isr0(void) {
|
||||
// Poll sequence
|
||||
if (!Ade7880.irq0_state) { Ade7880.irq0_state = 1; }
|
||||
Energy.frequency[0] = 256000.0f / Ade7880ReadVerify(ADE7880_APERIOD); // Page 34 and based on ADE7880_COMPMODE_FREQ
|
||||
Energy.frequency[1] = 256000.0f / Ade7880ReadVerify(ADE7880_BPERIOD);
|
||||
Energy.frequency[2] = 256000.0f / Ade7880ReadVerify(ADE7880_CPERIOD);
|
||||
}
|
||||
|
||||
void Ade7880Service0(void) {
|
||||
// Poll sequence
|
||||
SkipSleep(false);
|
||||
Ade7880Cycle();
|
||||
Ade7880.irq0_state = 0;
|
||||
}
|
||||
|
||||
void IRAM_ATTR Ade7880Isr1(void) {
|
||||
// Init sequence
|
||||
if (!Ade7880.irq1_state) { Ade7880.irq1_state = 1; }
|
||||
void IRAM_ATTR Ade7880Isr0(void) {
|
||||
// Poll sequence
|
||||
if (!Ade7880.irq0_state) {
|
||||
Ade7880.irq0_state = 1;
|
||||
SkipSleep(true);
|
||||
}
|
||||
|
||||
bool Ade7880Service1(void) {
|
||||
// Init sequence
|
||||
bool result = Ade7880Init();
|
||||
Ade7880.irq1_state = 0;
|
||||
return result;
|
||||
}
|
||||
|
||||
void Ade7880EnergyEverySecond(void) {
|
||||
@ -490,7 +501,13 @@ void Ade7880DrvInit(void) {
|
||||
pinMode(Pin(GPIO_ADE7880_IRQ, 1), INPUT);
|
||||
attachInterrupt(Pin(GPIO_ADE7880_IRQ, 1), Ade7880Isr1, FALLING);
|
||||
|
||||
Ade7880Reset();
|
||||
int reset = Pin(GPIO_RESET);
|
||||
if (-1 == reset) { reset = 16; } // Reset pin ADE7880 in Shelly 3EM
|
||||
pinMode(reset, OUTPUT);
|
||||
digitalWrite(reset, 0);
|
||||
delay(1);
|
||||
digitalWrite(reset, 1);
|
||||
pinMode(reset, INPUT);
|
||||
|
||||
uint32_t timeout = millis() + 400;
|
||||
while (!TimeReached(timeout)) { // Wait up to 400 mSec
|
||||
|
Loading…
x
Reference in New Issue
Block a user