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.
extr/main.c

65 lines
1.4 KiB
C

#include <avr/io.h>
#include <util/delay.h>
#include <modbus.h>
#include <avr/interrupt.h>
volatile uint16_t holdingRegisters[4];
void modbusGet(void);
int main(){
DDRD |= (1 << 4); // LED
DDRD |= (1 << 3); // FU PWM
DDRD |= (1 << 2); // 485 DE
PORTD|=(1<<0); // RX
// FU PWM on PD3
OCR2B = 12;
TCCR2A |= (1 << COM2B1);
TCCR2A |= (1 << WGM21) | (1 << WGM20);
TCCR2B |= (1 << CS21);
sei();
modbusSetAddress(1);
modbusInit();
// Modbus Tick Timer
TCCR0B|=(1<<CS01); //prescaler 8
TIMSK0|=(1<<TOIE0);
while(1){
_delay_ms(10);
OCR2B += 1;
modbusGet();
}
}
ISR(TIMER0_OVF_vect) { //this ISR is called 9765.625 times per second
modbusTickTimer();
}
void modbusGet(void) {
if (modbusGetBusState() & (1<<ReceiveCompleted))
{
switch(rxbuffer[1]) {
case fcReadHoldingRegisters:
modbusExchangeRegisters(holdingRegisters,0,4);
break;
case fcPresetSingleRegister:
modbusExchangeRegisters(holdingRegisters,0,4);
case fcPresetMultipleRegisters:
modbusExchangeRegisters(holdingRegisters,0,4);
if(holdingRegisters[0])
PORTD |= 1 << 4;
else
PORTD &= ~(1 << 4);
break;
default:
modbusSendException(ecIllegalFunction);
break;
}
}
}