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.

124 lines
3.6 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"
// 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);
}
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,1);
break;
case fcReadInputRegisters:
if(modbusRequestedAddress() < 100)
modbusExchangeRegisters((void *)inStates,0,nrOfInputs/16);
else if(modbusRequestedAddress() < 200)
modbusExchangeRegisters((void *)inStatesBothEdges,100,nrOfInputs/16);
else if(modbusRequestedAddress() < 300)
modbusExchangeRegisters((void *)inStatesFallingEdge,200,nrOfInputs/16);
else if(modbusRequestedAddress() < 400)
modbusExchangeRegisters((void *)inStatesRisingEdge,300,nrOfInputs/16);
break;
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);
break;
case fcForceMultipleCoils:
case fcForceSingleCoil:
case fcReadCoilStatus:
if(modbusRequestedAddress() < 100)
modbusExchangeBits(outStates,0,nrOfOutputs);
else if(modbusRequestedAddress() < 200)
modbusExchangeBits(outStatesBlinking,100,nrOfOutputs);
break;
default:
modbusSendException(ecIllegalFunction);
break;
}
}
}
int main()
{
wdt_enable(WDTO_2S); // set up wdt reset interval 2 second
uart_init();
ioHelperIoConf();
timer0_init();// Timer0 millis engine init
modbusSetAddress(4);
modbusInit();
timer2_init();
sei();
set_Output(LED_EXTR_FEHLER, BLINK);
uint32_t timer_blink_outs = millis();
printf("moin\n");
while(1)
{
wdt_reset(); // wdt reset ~ every <2000ms
ioHelperReadPins();
ioHelperDebounce();
ioHelperEdgeDetector();
modbusGet();
// Toggle all outs which are set to blinking
if(millis() - timer_blink_outs > 500){
ioHelperBlinkOuts();
timer_blink_outs = millis();
}
ioHelperSetOuts();
}
}
ISR(TIMER2_COMPA_vect) { //this ISR is called 9765.625 times per second
modbusTickTimer();
}