Compare commits

...

4 Commits

Author SHA1 Message Date
120bd5f421 add toggle coils 2022-10-21 11:14:00 +02:00
38975d27bd fix input register edge reset 2022-10-21 10:33:38 +02:00
bf14cbd8df add edge detection and auto reset on modbus read 2022-10-19 19:19:39 +02:00
d09e496aa7 update README 2022-10-15 07:51:15 +02:00
3 changed files with 53 additions and 41 deletions

View File

@@ -1,26 +1,5 @@
## Network Config ## Network Config
-
|Parameter| Value
|---------|-------------
| IP Adr. | 192.168.2.1
| Subnet | 255.255.0.0
| MAC | 00-08-dc-ab-cd-f1
### MQTT
#### Connect to MQTT Host 192.168.5.2
##### Publish
|Topic |Values | Unit
|--------------------------------------------------------|------------|-------
| TODO | |
##### Subscribe
|Topic |Values | Unit
|--------------------------------------------------------|------------|-------
| TODO | |
## Hardware usage ## Hardware usage
@@ -29,6 +8,7 @@
|Timer| Type | Usage | Mode | used ISRs | Output connected |Timer| Type | Usage | Mode | used ISRs | Output connected
|-----|--------|-------------------------------|------------------------|----------------|------------------ |-----|--------|-------------------------------|------------------------|----------------|------------------
| 0 | 8 bit | Millis Tick Timer (1kHz) | 2 (CTC) | COMPA | - | 0 | 8 bit | Millis Tick Timer (1kHz) | 2 (CTC) | COMPA | -
| 2 | 8 bit | Modbus Tick Timer (1kHz) | 2 (CTC) | COMPA | -
### UART ### UART
@@ -37,4 +17,4 @@
| 0 | Debug Prints (connected to USB) | 0 | Debug Prints (connected to USB)
| 1 | | 1 |
| 2 | | 2 |
| 3 | | 3 | Modbus RS485

View File

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

64
main.c
View File

@@ -9,6 +9,10 @@
#include "uart.h" #include "uart.h"
#include "modbus.h" #include "modbus.h"
volatile uint32_t inputEdgesBoth;
volatile uint32_t inputEdgesFalling;
volatile uint32_t inputEdgesRising;
// Timer0 // Timer0
// 1ms IRQ // 1ms IRQ
// Used for millis() timing // Used for millis() timing
@@ -35,31 +39,46 @@ void modbusGet(void) {
case fcPresetSingleRegister: case fcPresetSingleRegister:
case fcPresetMultipleRegisters: case fcPresetMultipleRegisters:
case fcReadHoldingRegisters: case fcReadHoldingRegisters:
//;
//uint16_t test;
//modbusExchangeRegisters(&test,0,1);
modbusExchangeRegisters((void *)outStates,0,1); modbusExchangeRegisters((void *)outStates,0,1);
break; break;
case fcReadInputRegisters: case fcReadInputRegisters:
if(modbusRequestedAddress() < 100) if(modbusRequestedAddress() < 100)
modbusExchangeRegisters((void *)inStates,0,nrOfInputs/16); modbusExchangeRegisters((void *)inStates,0,nrOfInputs/16);
else if(modbusRequestedAddress() < 200) else if(modbusRequestedAddress() < 200){
modbusExchangeRegisters((void *)inStatesBothEdges,100,nrOfInputs/16); modbusExchangeRegisters((void *)&inputEdgesBoth,100,nrOfInputs/16);
else if(modbusRequestedAddress() < 300) for(uint16_t i = modbusDataLocation - 100; i < modbusDataLocation-100+(modbusDataAmount*16); i++)
modbusExchangeRegisters((void *)inStatesFallingEdge,200,nrOfInputs/16); inputEdgesBoth &= ~(1 << i);
else if(modbusRequestedAddress() < 400) }
modbusExchangeRegisters((void *)inStatesRisingEdge,300,nrOfInputs/16); else if(modbusRequestedAddress() < 300){
modbusExchangeRegisters((void *)&inputEdgesFalling,200,nrOfInputs/16);
for(uint16_t i = modbusDataLocation - 200; i < modbusDataLocation-200+(modbusDataAmount*16); i++)
inputEdgesFalling &= ~(1 << i);
}
else if(modbusRequestedAddress() < 400){
modbusExchangeRegisters((void *)&inputEdgesRising,300,nrOfInputs/16);
for(uint16_t i = modbusDataLocation - 300; i < modbusDataLocation-300+(modbusDataAmount*16); i++)
inputEdgesRising &= ~(1 << i);
}
break; break;
case fcReadInputStatus: case fcReadInputStatus:
if(modbusRequestedAddress() < 100) if(modbusRequestedAddress() < 100)
modbusExchangeBits(inStates,0,nrOfInputs); modbusExchangeBits(inStates,0,nrOfInputs);
else if(modbusRequestedAddress() < 200) else if(modbusRequestedAddress() < 200){
modbusExchangeBits(inStatesBothEdges,100,nrOfInputs); modbusExchangeBits((void*)&inputEdgesBoth,100,nrOfInputs);
else if(modbusRequestedAddress() < 300) for(uint16_t i = modbusDataLocation - 100; i < modbusDataLocation+modbusDataAmount-100; i++)
modbusExchangeBits(inStatesFallingEdge,200,nrOfInputs); inputEdgesBoth &= ~(1 << i);
else if(modbusRequestedAddress() < 400) }
modbusExchangeBits(inStatesRisingEdge,300,nrOfInputs); 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; break;
case fcForceMultipleCoils: case fcForceMultipleCoils:
@@ -69,6 +88,15 @@ void modbusGet(void) {
modbusExchangeBits(outStates,0,nrOfOutputs); modbusExchangeBits(outStates,0,nrOfOutputs);
else if(modbusRequestedAddress() < 200) else if(modbusRequestedAddress() < 200)
modbusExchangeBits(outStatesBlinking,100,nrOfOutputs); modbusExchangeBits(outStatesBlinking,100,nrOfOutputs);
else if(modbusRequestedAddress() < 300){
uint8_t outStatesToggle[sizeof(outStates)];
memset(outStatesToggle, 0, sizeof(outStatesToggle));
modbusExchangeBits(outStatesToggle,200,nrOfOutputs);
for(uint8_t i=0; i<sizeof(outStates); i++){
outStates[i] ^= outStatesToggle[i];
}
}
break; break;
default: default:
@@ -103,7 +131,11 @@ int main()
ioHelperReadPins(); ioHelperReadPins();
ioHelperDebounce(); ioHelperDebounce();
ioHelperEdgeDetector(); 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(); modbusGet();
// Toggle all outs which are set to blinking // Toggle all outs which are set to blinking