НИгде не могу найти инфу по этой теме
НИгде не могу найти инфу по этой теме
Да, шина и ПО уже есть, нужно добавить устройство.Пухич писал(а):Ну а дальше - чисто заморочки с формированием сообщений для сети Modbus, причем на МК это будет непросто, на компе проще. Самое главное - а зачем вы комп и МК через такую шину связываете? У вас она уже есть и ее надо использовать, или почему?
У тебя есть великолепный шанс это сделатьHold[On] писал(а):кто нибудь переписывал этот main.c для ATmega16 ? там не все так просто...процы разные, у меги128 кажись 2 уарта.
У тебя есть великолепный шанс это сделатьHold[On] писал(а):кто нибудь переписывал этот main.c для ATmega16 ? там не все так просто...процы разные, у меги128 кажись 2 уарта.
Проблема с разными названиями регистров? дак там в 99% случаев достаточно убрать 0 из имени.Hold[On] писал(а):кто нибудь переписывал этот main.c для ATmega16 ? там не все так просто...процы разные, у меги128 кажись 2 уарта.
Исправляя программу под мега16 еще надо было поправить настройки таймера:Hold[On] писал(а):И еще раз. выкладываю свою переделанную. В чем проверять протокол? Ставлю скорость 19200, Com1, 8 бит данных, без паритета, 1 стоп бит, режим - RTU, таймайт - 1000мс, DSR, CTS, RTS - галочки не стоят. Затем захожу Setup - > Poll definition. Там -
Slave ID - 32
Function - 03 HOLDING REGISTER
Address - 1
Lenght - 8
Scan Rate - 1000
где ошибка? завтра сдавать научную работу, срочно потребовали в цифровой регулятор запихать MODBUS. с утра сижу
Код: Выделить всё
[code]
case 0x03:{//чтение регистров
TempI=(int) (cmRcBuf0[2]<<8) + cmRcBuf0[3];
if (TempI!=1){ //првоерка номера регистра, есть только 1 регистр
return ErrorMessage(0x02); //данный адрес не может быть обработан
}
TempI=(int) (cmRcBuf0[4]<<8) + cmRcBuf0[5];
if (TempI>8){//проверка кол-ва запрашиваемых регистров, не больше 8
return ErrorMessage(0x02); //данный адрес не может быть обработан
}
cmTrBuf0[1]=0x03;//команда
cmTrBuf0[2]=0x02;//кол-во байт данных
cmTrBuf0[3]=0x00;//старший байт
TempI=PINB;
for (unsigned char i = 0; i < 8; i++)
cmTrBuf0[4+i] = (TempI >> i) & 0x01;
TempI=GetCRC16(cmTrBuf0,12);//подсчет КС посылки
cmTrBuf0[12]=Low(TempI);
cmTrBuf0[13]=Hi(TempI);
return 14;
}