|
|
|
@ -6,7 +6,9 @@
|
|
|
|
#include <stddef.h>
|
|
|
|
#include <stddef.h>
|
|
|
|
#include "yaMBSiavr.h"
|
|
|
|
#include "yaMBSiavr.h"
|
|
|
|
|
|
|
|
|
|
|
|
uint16_t inputStatus[9];
|
|
|
|
#define AVRG 1024
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
uint16_t adc_values[AVRG];
|
|
|
|
|
|
|
|
|
|
|
|
void init_clk(void)
|
|
|
|
void init_clk(void)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
@ -34,12 +36,12 @@ void init_clk(void)
|
|
|
|
|
|
|
|
|
|
|
|
void init_timer_100us(){
|
|
|
|
void init_timer_100us(){
|
|
|
|
TCC0.CTRLA |= TC_CLKSEL_DIV256_gc;
|
|
|
|
TCC0.CTRLA |= TC_CLKSEL_DIV256_gc;
|
|
|
|
TCC0.PER = 13; // ==> 9615us
|
|
|
|
TCC0.PER = 13; // ==> 9615Hz
|
|
|
|
TCC0.INTCTRLA |= TC_OVFINTLVL_MED_gc;
|
|
|
|
TCC0.INTCTRLA |= TC_OVFINTLVL_MED_gc;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void adc_init(void){
|
|
|
|
void adc_init(void){
|
|
|
|
ADCA.CTRLB = 0x00;
|
|
|
|
ADCA.CTRLB = ADC_FREERUN_bm;
|
|
|
|
ADCA.REFCTRL = ADC_REFSEL_VCC_gc;
|
|
|
|
ADCA.REFCTRL = ADC_REFSEL_VCC_gc;
|
|
|
|
ADCA.PRESCALER = ADC_PRESCALER_DIV512_gc;
|
|
|
|
ADCA.PRESCALER = ADC_PRESCALER_DIV512_gc;
|
|
|
|
|
|
|
|
|
|
|
|
@ -65,15 +67,49 @@ uint16_t adc_read(void){
|
|
|
|
return ADCA.CH0.RES;
|
|
|
|
return ADCA.CH0.RES;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
float avrg(uint16_t * values, uint16_t length){
|
|
|
|
|
|
|
|
uint64_t res = 0;
|
|
|
|
|
|
|
|
for(uint16_t i=0; i < length; i++){
|
|
|
|
|
|
|
|
res += values[i];
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return (float)(res)/length;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void dma_init(void){
|
|
|
|
|
|
|
|
DMA.CTRL = DMA_ENABLE_bm;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//DMA.CH0.CTRLB = DMA_CH_TRNINTLVL_LO_gc;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DMA.CH0.TRFCNT = AVRG * 2;
|
|
|
|
|
|
|
|
DMA.CH0.CTRLA = DMA_CH_BURSTLEN_2BYTE_gc | DMA_CH_SINGLE_bm;
|
|
|
|
|
|
|
|
DMA.CH0.TRIGSRC = DMA_CH_TRIGSRC_ADCA_CH0_gc;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//repeat endless
|
|
|
|
|
|
|
|
DMA.CH0.CTRLA |= DMA_CH_REPEAT_bm;
|
|
|
|
|
|
|
|
DMA.CH0.REPCNT = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DMA.CH0.SRCADDR0 = ((uintptr_t)&ADCA.CH0.RES) & 0xFF;
|
|
|
|
|
|
|
|
DMA.CH0.SRCADDR1 = (((uintptr_t)&ADCA.CH0.RES) >> 0x08) & 0xFF;
|
|
|
|
|
|
|
|
DMA.CH0.SRCADDR2 = (((uintptr_t)&ADCA.CH0.RES) >> 0x0F) & 0xFF;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DMA.CH0.DESTADDR0 = ((uintptr_t)adc_values) & 0xFF;
|
|
|
|
|
|
|
|
DMA.CH0.DESTADDR1 = ((uintptr_t)adc_values >> 0x08) & 0xFF;
|
|
|
|
|
|
|
|
DMA.CH0.DESTADDR2 = ((uintptr_t)adc_values >> 0x0F) & 0xFF;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DMA.CH0.ADDRCTRL = DMA_CH_SRCRELOAD_BURST_gc | DMA_CH_DESTRELOAD_TRANSACTION_gc | DMA_CH_SRCDIR_INC_gc | DMA_CH_DESTDIR_INC_gc;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DMA.CH0.CTRLA |= DMA_CH_ENABLE_bm;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void modbusGet(void) {
|
|
|
|
void modbusGet(void) {
|
|
|
|
if (modbusGetBusState() & (1<<ReceiveCompleted))
|
|
|
|
if (modbusGetBusState() & (1<<ReceiveCompleted))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
switch(rxbuffer[1]) {
|
|
|
|
switch(rxbuffer[1]) {
|
|
|
|
case fcReadHoldingRegisters: ;
|
|
|
|
case fcReadHoldingRegisters: ;
|
|
|
|
float tmp[4];
|
|
|
|
float tmp[4];
|
|
|
|
tmp[0] = adc_read() - 170;
|
|
|
|
tmp[0] = avrg(adc_values, AVRG) - 170;
|
|
|
|
tmp[1] = (tmp[0])/ 3926 * 1.95;
|
|
|
|
tmp[1] = (tmp[0])/ 3926 * 1.95;
|
|
|
|
tmp[2] = (tmp[1]*993)/(3.3-tmp[1]);
|
|
|
|
tmp[2] = (tmp[1]*980)/(3.3-tmp[1]);
|
|
|
|
tmp[3] = (tmp[2]-100)/0.3927;
|
|
|
|
tmp[3] = (tmp[2]-100)/0.3927;
|
|
|
|
modbusExchangeRegisters(tmp, 0, 8);
|
|
|
|
modbusExchangeRegisters(tmp, 0, 8);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
@ -87,8 +123,12 @@ void modbusGet(void) {
|
|
|
|
int main(void){
|
|
|
|
int main(void){
|
|
|
|
init_clk();
|
|
|
|
init_clk();
|
|
|
|
PORTD.DIRSET = 1 << 5;
|
|
|
|
PORTD.DIRSET = 1 << 5;
|
|
|
|
|
|
|
|
PORTD.OUTTGL = 1 << 5;
|
|
|
|
|
|
|
|
_delay_ms(500);
|
|
|
|
|
|
|
|
PORTD.OUTTGL = 1 << 5;
|
|
|
|
|
|
|
|
|
|
|
|
adc_init();
|
|
|
|
adc_init();
|
|
|
|
|
|
|
|
dma_init();
|
|
|
|
|
|
|
|
|
|
|
|
PORTCFG.MPCMASK = 0xFF;
|
|
|
|
PORTCFG.MPCMASK = 0xFF;
|
|
|
|
PORTC.PIN1CTRL = PORT_OPC_PULLUP_gc;
|
|
|
|
PORTC.PIN1CTRL = PORT_OPC_PULLUP_gc;
|
|
|
|
|