You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

152 lines
4.4 KiB
C

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/wdt.h> // WatchDog
#include <stdint.h>
#include <string.h>
#include "avrIOhelper/io-helper.h"
#include "millis.h"
#include "uart.h"
#include "modbus.h"
//FUNC headers
static void avr_init(void);
void timer0_init(void);
void timer2_init(void);
void print_network_information(void);
void modbusGet(void) {
if (modbusGetBusState() & (1<<ReceiveCompleted))
{
switch(rxbuffer[1]) {
case fcPresetSingleRegister:
case fcPresetMultipleRegisters:
case fcReadHoldingRegisters:
//;
//uint16_t test;
//modbusExchangeRegisters(&test,0,1);
modbusExchangeRegisters((void *)outStates,0,NUMBER_OF_INPUT_BYTES/2);
break;
case fcReadInputRegisters:
if(modbusRequestedAddress() < 100)
modbusExchangeRegisters((void *)inStates,0,NUMBER_OF_INPUT_BYTES/2);
else if(modbusRequestedAddress() < 200)
modbusExchangeRegisters((void *)inStatesBothEdges,100,NUMBER_OF_INPUT_BYTES/2);
else if(modbusRequestedAddress() < 300)
modbusExchangeRegisters((void *)inStatesFallingEdge,200,NUMBER_OF_INPUT_BYTES/2);
else if(modbusRequestedAddress() < 400)
modbusExchangeRegisters((void *)inStatesRisingEdge,300,NUMBER_OF_INPUT_BYTES/2);
break;
case fcReadInputStatus:
if(modbusRequestedAddress() < 100)
modbusExchangeBits(inStates,0,NUMBER_OF_INPUT_BYTES*8);
else if(modbusRequestedAddress() < 200)
modbusExchangeBits(inStatesBothEdges,100,NUMBER_OF_INPUT_BYTES*8);
else if(modbusRequestedAddress() < 300)
modbusExchangeBits(inStatesFallingEdge,200,NUMBER_OF_INPUT_BYTES*8);
else if(modbusRequestedAddress() < 400)
modbusExchangeBits(inStatesRisingEdge,300,NUMBER_OF_INPUT_BYTES*8);
break;
case fcForceMultipleCoils:
case fcForceSingleCoil:
case fcReadCoilStatus:
if(modbusRequestedAddress() < 100)
modbusExchangeBits(outStates,0,NUMBER_OF_INPUT_BYTES*8);
else if(modbusRequestedAddress() < 200)
modbusExchangeBits(outStatesBlinking,100,NUMBER_OF_INPUT_BYTES*8);
break;
default:
modbusSendException(ecIllegalFunction);
break;
}
}
}
int main()
{
// INIT MCU
avr_init();
ioHelperInitBuffer();
ioHelperIoConf();
modbusSetAddress(4);
modbusInit();
timer2_init();
uint32_t timer_blink_outs = millis();
set_Output(LED_EXTR_FEHLER, BLINK);
printf("moin\n");
while(1)
{
wdt_reset(); // WDT reset at least every sec
ioHelperReadPins();
ioHelperDebounce();
ioHelperEdgeDetector();
modbusGet();
// Toggle all outs which are set to blinking
if(millis() - timer_blink_outs > 500){
outStates[0] ^= outStatesBlinking[0];
outStates[1] ^= outStatesBlinking[1];
outStates[2] ^= outStatesBlinking[2];
outStates[2] ^= outStatesBlinking[3];
timer_blink_outs = millis();
printf("bus state: %d\n", modbusGetBusState());
printf("DE /RE state: %d\n", PORTJ & (_BV(5)|_BV(6)) );
}
ioHelperSetOuts();
}
}
// Timer0
// 1ms IRQ
// Used for millis() timing
void timer0_init()
{
TCCR0A = (1<<WGM01); //TIMER0 SET-UP: CTC MODE
TCCR0B = (1<<CS01)|(1<<CS00); // PS 1:64
OCR0A = 249; // 1ms reach for clear (16mz:64=>250kHz:250-=>1kHz)
TIMSK0 |= 1<<OCIE0A; //IRQ on TIMER0 output compareA
}
void timer2_init()
{
TCCR2A = (1<<WGM21); //TIMER0 SET-UP: CTC MODE
TCCR2B|=(1<<CS21); //prescaler 8
OCR2A = 200;
TIMSK2|=(1<<OCIE2A);
}
static void avr_init(void)
{
// Initialize device here.
// WatchDog INIT
wdt_enable(WDTO_8S); // set up wdt reset interval 2 second
wdt_reset(); // wdt reset ~ every <2000ms
timer0_init();// Timer0 millis engine init
//timer3_init();
uart_init();
sei(); //re-enable global interrupts
return;
}
ISR(TIMER2_COMPA_vect) { //this ISR is called 9765.625 times per second
modbusTickTimer();
}