add edge detection and auto reset on modbus read

master
Eggert Jung 3 years ago
parent d09e496aa7
commit bf14cbd8df

@ -93,8 +93,8 @@ void set_Output(uint8_t nr, uint8_t state);
#define BitPinD7 16 //I16
#define BitPinG2 17 //I17
#define BitPinG1 18 //I18
#define BitPinD3 10 //INO
#define BitPinD2 11 //IN1
#define BitPinD3 19 //INO
#define BitPinD2 20 //IN1
#define BTN_DREHZAHL_GROB_PLUS BitPinF4 // modbus

@ -9,6 +9,10 @@
#include "uart.h"
#include "modbus.h"
volatile uint32_t inputEdgesBoth;
volatile uint32_t inputEdgesFalling;
volatile uint32_t inputEdgesRising;
// Timer0
// 1ms IRQ
// Used for millis() timing
@ -35,9 +39,6 @@ void modbusGet(void) {
case fcPresetSingleRegister:
case fcPresetMultipleRegisters:
case fcReadHoldingRegisters:
//;
//uint16_t test;
//modbusExchangeRegisters(&test,0,1);
modbusExchangeRegisters((void *)outStates,0,1);
break;
case fcReadInputRegisters:
@ -54,12 +55,21 @@ void modbusGet(void) {
case fcReadInputStatus:
if(modbusRequestedAddress() < 100)
modbusExchangeBits(inStates,0,nrOfInputs);
else if(modbusRequestedAddress() < 200)
modbusExchangeBits(inStatesBothEdges,100,nrOfInputs);
else if(modbusRequestedAddress() < 300)
modbusExchangeBits(inStatesFallingEdge,200,nrOfInputs);
else if(modbusRequestedAddress() < 400)
modbusExchangeBits(inStatesRisingEdge,300,nrOfInputs);
else if(modbusRequestedAddress() < 200){
modbusExchangeBits((void*)&inputEdgesBoth,100,nrOfInputs);
for(uint16_t i = modbusDataLocation - 100; i < modbusDataLocation+modbusDataAmount-100; i++)
inputEdgesBoth &= ~(1 << i);
}
else if(modbusRequestedAddress() < 300){
modbusExchangeBits((void*)&inputEdgesFalling,200,nrOfInputs);
for(uint16_t i = modbusDataLocation - 200; i < modbusDataLocation+modbusDataAmount-200; i++)
inputEdgesFalling &= ~(1 << i);
}
else if(modbusRequestedAddress() < 400){
modbusExchangeBits((void*)&inputEdgesRising,300,nrOfInputs);
for(uint16_t i = modbusDataLocation - 300; i < modbusDataLocation+modbusDataAmount-300; i++)
inputEdgesRising &= ~(1 << i);
}
break;
case fcForceMultipleCoils:
@ -103,7 +113,11 @@ int main()
ioHelperReadPins();
ioHelperDebounce();
ioHelperEdgeDetector();
inputEdgesBoth |= inStatesBothEdges[0] | ((uint32_t)inStatesBothEdges[1]<<8) | ((uint32_t)inStatesBothEdges[2] << 16) | ((uint32_t)inStatesBothEdges[3]<<24);
inputEdgesFalling |= inStatesFallingEdge[0] | ((uint32_t)inStatesFallingEdge[1]<<8) | ((uint32_t)inStatesFallingEdge[2] << 16) | ((uint32_t)inStatesFallingEdge[3]<<24);
inputEdgesRising |= inStatesRisingEdge[0] | ((uint32_t)inStatesRisingEdge[1]<<8) | ((uint32_t)inStatesRisingEdge[2] << 16) | ((uint32_t)inStatesRisingEdge[3]<<24);
modbusGet();
// Toggle all outs which are set to blinking