diff --git a/avrIOhelper/io-helper.h b/avrIOhelper/io-helper.h index 9ffef1e..cfaeade 100644 --- a/avrIOhelper/io-helper.h +++ b/avrIOhelper/io-helper.h @@ -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 diff --git a/main.c b/main.c index 34b4fb0..d0ae00b 100644 --- a/main.c +++ b/main.c @@ -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