#include #include #include #include "modbus.h" #define HIGH_LOW_CYCLE_TIME 10 uint16_t holdingRegisters[4]; void timer0100us_start(void) { TCCR0B|=(1<>data_PIN) & 0x01); //Read and store data PORTB &= ~(1 << clk_PIN); //Set clock-PIN low _delay_us(HIGH_LOW_CYCLE_TIME); } /* Add extra clk-pluses to set PGA-Gain for next conversion 1 extra pulse : Channel A Gain = 128 2 extra pluses: Channel B Gain = 32 3 extra pluses: Channel A Gain = 64*/ int8_t extra_clk_pluses = 1; switch(gain_for_next_conv){ case 128: extra_clk_pluses = 1; break; case 64: extra_clk_pluses = 3; break; case 32: extra_clk_pluses = 2; break; default: extra_clk_pluses = 1; } for(uint8_t i = 0; i < extra_clk_pluses; i++){ PORTB |= (1 << clk_PIN); //set clock-PIN high _delay_us(HIGH_LOW_CYCLE_TIME); PORTB &= ~(1 << clk_PIN); //set clock-PIN low _delay_us(HIGH_LOW_CYCLE_TIME); } /* Convert 24bit Two's complement to 32bit Two's complement if MSB from 24Bit result is 1 aka negative*/ if(data & (1L<<23)){ data |= 0xFFL << 24; } return data; } void modbusGet(void) { if (modbusGetBusState() & (1<>16) & 0xFFFF; modbusExchangeRegisters(holdingRegisters,0,4); break; default: { modbusSendException(ecIllegalFunction); } break; } } } int main(void){ DDRC |= 3 << 0; DDRB |= (1<<3); modbusSetAddress(1); modbusInit(); sei(); timer0100us_start(); while(1){ modbusGet(); //PORTC ^= 1 << 0; //_delay_ms(100); //PORTC &= ~(1 << 1); } } ISR(TIMER0_OVF_vect) { //this ISR is called 9765.625 times per second modbusTickTimer(); }