From 979856fd1226696786556455f61f68ea0b08186f Mon Sep 17 00:00:00 2001 From: Eggert Jung Date: Wed, 12 Jan 2022 16:26:02 +0100 Subject: [PATCH] add io helper lib --- 22_m1284p_WIZNET_MQTT/avrIOhelper/io-helper.c | 3245 ++++++++++++++++++++ 22_m1284p_WIZNET_MQTT/avrIOhelper/io-helper.h | 96 + .../avrIOhelper/iohelperhelper.py | 155 + 3 files changed, 3496 insertions(+) create mode 100644 22_m1284p_WIZNET_MQTT/avrIOhelper/io-helper.c create mode 100644 22_m1284p_WIZNET_MQTT/avrIOhelper/io-helper.h create mode 100644 22_m1284p_WIZNET_MQTT/avrIOhelper/iohelperhelper.py diff --git a/22_m1284p_WIZNET_MQTT/avrIOhelper/io-helper.c b/22_m1284p_WIZNET_MQTT/avrIOhelper/io-helper.c new file mode 100644 index 0000000..3efd96b --- /dev/null +++ b/22_m1284p_WIZNET_MQTT/avrIOhelper/io-helper.c @@ -0,0 +1,3245 @@ +#include +#include "io-helper.h" + + +volatile uint8_t outStates[NUMBER_OF_INPUT_BYTES]; +volatile uint8_t outStatesBlinking[NUMBER_OF_INPUT_BYTES]; +volatile uint8_t inStatesRaw[NUMBER_OF_INPUT_BYTES]; +volatile uint8_t inStates[NUMBER_OF_INPUT_BYTES]; +volatile uint8_t ioHelperDebounceTable[NUMBER_OF_INPUT_BYTES*8]; + +volatile uint8_t oldInstates[NUMBER_OF_INPUT_BYTES]; +volatile uint8_t inStatesBothEdges[NUMBER_OF_INPUT_BYTES]; +volatile uint8_t inStatesRisingEdge[NUMBER_OF_INPUT_BYTES]; +volatile uint8_t inStatesFallingEdge[NUMBER_OF_INPUT_BYTES]; + +volatile uint8_t ioHelperDebounceTable[NUMBER_OF_INPUT_BYTES*8]; + +uint8_t read_Input(uint8_t nr, uint8_t type) { + uint8_t state = 0; + switch (type) { + case LEVEL: + state = ioHelperReadBit(inStates, nr); + break; + case EDGE: + state = ioHelperReadBit(inStatesBothEdges, nr); + ioHelperSetBit(inStatesBothEdges, nr, 0); + break; + case RISING: + state = ioHelperReadBit(inStatesRisingEdge, nr); + ioHelperSetBit(inStatesRisingEdge, nr, 0); + break; + case FALLING: + state = ioHelperReadBit(inStatesFallingEdge, nr); + ioHelperSetBit(inStatesFallingEdge, nr, 0); + break; + } + + //reset edges after being read once + // if (state) { + // if (type == EDGE) + // ioHelperSetBit(inStatesBothEdges, nr, OFF); + // if (type == RISING) + // ioHelperSetBit(inStatesRisingEdge, nr, OFF); + // if (type == FALLING) + // ioHelperSetBit(inStatesFallingEdge, nr, OFF); + // } + + return state; +} + +void set_Output(uint8_t nr, uint8_t state) { + switch (state) { + case BLINK: + ioHelperSetBit(outStatesBlinking, nr, ON); + break; + case TOGGLE: + ioHelperSetBit(outStatesBlinking, nr, OFF); + if (ioHelperReadBit(outStates, nr)) { + ioHelperSetBit(outStates, nr, OFF); + } else { + ioHelperSetBit(outStates, nr, ON); + } + break; + case ON: + ioHelperSetBit(outStates, nr, ON); + ioHelperSetBit(outStatesBlinking, nr, OFF); + break; + case OFF: + ioHelperSetBit(outStates, nr, OFF); + ioHelperSetBit(outStatesBlinking, nr, OFF); + break; + } +} + +void ioHelperInitBuffer(void){ + for(uint8_t i = 0; i < NUMBER_OF_INPUT_BYTES; i++){ + outStates[i]= 0; + inStatesRaw[i] = 0; + inStates[i] = 0; + + oldInstates[i] = 0; + inStatesBothEdges[i] = 0; + inStatesRisingEdge[i] = 0; + inStatesFallingEdge[i] = 0; + } + for(uint8_t i = 0; i < NUMBER_OF_INPUT_BYTES*8; i++){ + ioHelperDebounceTable[i] = 0; + } +} + +/* Flankenwechsel Rising Falling + alt neu | (alt XOR neu) | (Flankenwechsel UND neu) | (flankenwechsel UND alt) + 0 0 | 0 | 0 | 0 + 0 1 | 1 | 1 | 0 + 1 0 | 1 | 0 | 1 + 1 1 | 0 | 0 | 0 + */ +void ioHelperEdgeDetector(void){ + for (uint8_t i = 0; i < NUMBER_OF_INPUT_BYTES; i++){ + inStatesBothEdges[i] = oldInstates[i] ^ inStates[i]; + inStatesRisingEdge[i] = inStatesBothEdges[i] & inStates[i]; + inStatesFallingEdge[i] = inStatesBothEdges[i] & oldInstates[i]; + oldInstates[i] = inStates[i]; + } +} + + +/* @brief: copies a single bit from one char to another char (or arrays thereof) + * + * + */ +void ioHelperCpArb(volatile uint8_t *source, uint16_t sourceNr,volatile uint8_t *target, uint16_t targetNr) { + if(*(source+(sourceNr/8))&(1<<(sourceNr-((sourceNr/8)*8)))) + { + *(target+(targetNr/8))|=(1<<(targetNr-((targetNr/8)*8))); + } else *(target+(targetNr/8))&=~(1<<(targetNr-((targetNr/8)*8))); +} + + +/* debounceing: */ +void ioHelperDebounce(void) { + static volatile uint8_t tablePos=0; + for(uint8_t i = 0; i< NUMBER_OF_INPUT_BYTES*8; i++) { + ioHelperCpArb(inStatesRaw,i,ioHelperDebounceTable,i*8+tablePos); + if(ioHelperDebounceTable[i]==0) ioHelperSetBit(inStates,i,0); + else if(ioHelperDebounceTable[i]==0xFF) ioHelperSetBit(inStates,i,1); + } + if (tablePos<7) { + tablePos++; + } else tablePos=0; +} + + +void ioHelperSetBit(volatile uint8_t *list, uint8_t nr, uint8_t state) { + unsigned char ArC=0; + ArC=nr/8; + if(state) *(list+ArC)|=(1<<(nr-(ArC*8))); + else *(list+ArC)&=~(1<<(nr-(ArC*8))); +} + +unsigned char ioHelperReadBit(volatile uint8_t *list, uint8_t nr) { + unsigned char ArC=0; + ArC=nr/8; + if (*(list+ArC)&(1<<(nr-(ArC*8)))) + { + return 1; + } else return 0; +} + +void ioHelperCpBit(uint8_t reg, uint8_t bi, uint8_t bo) { + ioHelperSetBit(inStatesRaw,bo,reg&(1< + +#define LEVEL 0 +#define EDGE 1 +#define RISING 2 +#define FALLING 3 + +#define OFF 0 +#define ON 1 +#define BLINK 2 +#define TOGGLE 3 + + +#define NUMBER_OF_INPUT_BYTES 2 + +extern volatile uint8_t outStates[NUMBER_OF_INPUT_BYTES]; +extern volatile uint8_t outStatesBlinking[NUMBER_OF_INPUT_BYTES]; +extern volatile uint8_t inStates[NUMBER_OF_INPUT_BYTES]; +extern volatile uint8_t inStatesRaw[NUMBER_OF_INPUT_BYTES]; +extern volatile uint8_t ioHelperDebounceTable[NUMBER_OF_INPUT_BYTES*8]; +extern volatile uint8_t oldInstates[NUMBER_OF_INPUT_BYTES]; +extern volatile uint8_t inStatesBothEdges[NUMBER_OF_INPUT_BYTES]; +extern volatile uint8_t inStatesRisingEdge[NUMBER_OF_INPUT_BYTES]; +extern volatile uint8_t inStatesFallingEdge[NUMBER_OF_INPUT_BYTES]; + + +uint8_t read_Input(uint8_t nr, uint8_t type); +void set_Output(uint8_t nr, uint8_t state); + +void ioHelperInitBuffer(void); +void ioHelperSetOuts(void); +void ioHelperReadPins(void); +void ioHelperIoConf(void); +void ioHelperSetBit(volatile uint8_t *list, uint8_t nr, uint8_t state); +unsigned char ioHelperReadBit(volatile uint8_t *list, uint8_t nr); +void ioHelperDebounce(void); +void ioHelperEdgeDetector(void); + +//Outputs +//Verknüpfen von Pin | Bit mit Bitposition (0...n) outStates[0...n/8]. +#define BitPE4 0 //D0 +#define BitPE5 1 //D1 +#define BitPG5 2 //D2 +#define BitPE3 3 //D3 +#define BitPH3 4 //D4 +#define BitPH4 5 //D5 +#define BitPH5 6 //D6 +#define BitPH6 7 //D7 + +#define BitPB4 8 //D8 +#define BitPB5 9 //D9 +#define BitPB6 10 //D10 +#define BitPB7 11 //D11 + +#define LED_ROT_NOTAUS_SCHRANK BitPG5 +#define LED_GRN_NOTAUS_SCHRANK BitPE3 +#define LED_ROT_NOTAUS_ANLAGE BitPH3 +#define LED_GRN_NOTAUS_ANLAGE BitPH4 +#define LED_PLC_OK BitPB5 +#define LED_BUS_OK BitPB6 +#define LED_ZUMBACH BitPH5 +#define LED_LUEFTER BitPH6 +#define SCHUETZ_ZUMBACH BitPE5 + + +//Inputs +//Verknüpfen von Pin | Bit mit Bitposition (0...n) inStates[0...n/8]. +#define BitPinF0 0 //A0 +#define BitPinF1 1 //A1 +#define BitPinF2 2 //A2 +#define BitPinF3 3 //A3 +#define BitPinF4 4 //A4 +#define BitPinF5 5 //A5 +#define BitPinF6 6 //A6 +#define BitPinF7 7 //A7 + +#define BitPinK0 8 //A8 +#define BitPinK1 9 //A9 +#define BitPinD3 10 //INO +#define BitPinD2 11 //IN1 + +#define BTN_ZUMBACH_EIN BitPinF2 +#define BTN_ZUMBACH_AUS BitPinF3 +#define BTN_LUEFTER_EIN BitPinF4 +#define BTN_LUEFTER_AUS BitPinF5 +#define BTN_LUEFTER_PLUS BitPinF6 +#define BTN_LUEFTER_MINUS BitPinF7 +#define BTN_ANLAGE_EIN BitPinD3 +#define IN_ANLAGE_EIN BitPinD2 +#define IN_NOTAUS_ANLAGE BitPinF0 +#define IN_NOTAUS_SCHRANK BitPinF1 + +#endif diff --git a/22_m1284p_WIZNET_MQTT/avrIOhelper/iohelperhelper.py b/22_m1284p_WIZNET_MQTT/avrIOhelper/iohelperhelper.py new file mode 100644 index 0000000..e3efc70 --- /dev/null +++ b/22_m1284p_WIZNET_MQTT/avrIOhelper/iohelperhelper.py @@ -0,0 +1,155 @@ +import string + +ddr="""#ifdef DDRA +DDRA|=0 +#ifdef BitPA0 +|(1<<0) +#endif +#ifdef BitPA1 +|(1<<1) +#endif +#ifdef BitPA2 +|(1<<2) +#endif +#ifdef BitPA3 +|(1<<3) +#endif +#ifdef BitPA4 +|(1<<4) +#endif +#ifdef BitPA5 +|(1<<5) +#endif +#ifdef BitPA6 +|(1<<6) +#endif +#ifdef BitPA7 +|(1<<7) +#endif +|0; + +#endif + +""" + +port=""" +#ifdef PORTA +PORTA|=0 +#ifdef BitPA0 +|(getBit1(BitPA0)<<0) +#endif +#ifdef BitPA1 +|(getBit1(BitPA1)<<1) +#endif +#ifdef BitPA2 +|(getBit1(BitPA2)<<2) +#endif +#ifdef BitPA3 +|(getBit1(BitPA3)<<3) +#endif +#ifdef BitPA4 +|(getBit1(BitPA4)<<4) +#endif +#ifdef BitPA5 +|(getBit1(BitPA5)<<5) +#endif +#ifdef BitPA6 +|(getBit1(BitPA6)<<6) +#endif +#ifdef BitPA7 +|(getBit1(BitPA7)<<7) +#endif +|0; + +PORTA&=~(0 +#ifdef BitPA0 +|(getBit0(BitPA0)<<0) +#endif +#ifdef BitPA1 +|(getBit0(BitPA1)<<1) +#endif +#ifdef BitPA2 +|(getBit0(BitPA2)<<2) +#endif +#ifdef BitPA3 +|(getBit0(BitPA3)<<3) +#endif +#ifdef BitPA4 +|(getBit0(BitPA4)<<4) +#endif +#ifdef BitPA5 +|(getBit0(BitPA5)<<5) +#endif +#ifdef BitPA6 +|(getBit0(BitPA6)<<6) +#endif +#ifdef BitPA7 +|(getBit0(BitPA7)<<7) +#endif +|0); +#endif + +""" + +pin=""" +#ifdef PINA +#ifdef BitPinA0 +ioHelperCpBit(PINA,0,BitPinA0); +#endif +#ifdef BitPinA1 +ioHelperCpBit(PINA,1,BitPinA1); +#endif +#ifdef BitPinA2 +ioHelperCpBit(PINA,2,BitPinA2); +#endif +#ifdef BitPinA3 +ioHelperCpBit(PINA,3,BitPinA3); +#endif +#ifdef BitPinA4 +ioHelperCpBit(PINA,4,BitPinA4); +#endif +#ifdef BitPinA5 +ioHelperCpBit(PINA,5,BitPinA5); +#endif +#ifdef BitPinA6 +ioHelperCpBit(PINA,6,BitPinA6); +#endif +#ifdef BitPinA7 +ioHelperCpBit(PINA,7,BitPinA7); +#endif +#endif + +""" + +port_letters=list(string.ascii_uppercase); + +allddr=[] +for x in range(0,len(port_letters)): + allddr.append(ddr) + allddr[x]=allddr[x].replace("DDRA","DDR"+port_letters[x]) + allddr[x]=allddr[x].replace("BitPA","BitP"+port_letters[x]) + +allport=[] +for x in range(0,len(port_letters)): + allport.append(port) + allport[x]=allport[x].replace("PORTA","PORT"+port_letters[x]) + allport[x]=allport[x].replace("BitPA","BitP"+port_letters[x]) + +allpin=[] +for x in range(0,len(port_letters)): + allpin.append(pin) + allpin[x]=allpin[x].replace("PINA","PIN"+port_letters[x]) + allpin[x]=allpin[x].replace("BitPinA","BitPin"+port_letters[x]) + + +for x in allddr: + #print(x) + pass + +for x in allport: + #print(x) + pass + +for x in allpin: + print(x) + pass