// Останов всех сервоприводов
{i;
for(i=0;i<fxPWM_CH_NUM;i++)[i] = currAng[i];
}
//----------------------------------------------------------
//
//----------------------------------------------------------main(void)
{addr, MY_ADDR, U1, U2, a1, a2;char num, angle;i;_485Init();();_CH_NUM = 6;
USART_Init(BR57600);
// Установить в начальное положение
SetStartPos();
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 7,200 kHz
// Mode: Normal top=FFh
// OC2A output: Disconnected
// OC2B output: Disconnected=0x00;A=0x00;B=0x07;=0x00;A=0x00;B=0x00;
// Timer/Counter 2 Interrupt(s) initialization=0x01;
// Global enable interrupts
#asm("sei")
//--------------------------------------------------------
// Определяем собственный адрес=ReadByteADC(6);
a1=U1>100;=ReadByteADC(7);=U2>100;_ADDR=a1+a2*2;(MY_ADDR);
// Инициализация регистров[REG_ASTEP] = AStepDefault;[REG_SBLIM] = (signed char)0xff;[REG_SBMASK] = 0x00;[REG_STAT] = 0x00;
//--------------------------------------------------------
// Основной цикл
//--------------------------------------------------------CTL = U485READ;(1)
{
//------------------------------------------------------
// Считываю байты с портов
for(i=0;i<8;i++)[i] = ReadByteADC(i);
//------------------------------------------------------
// Управление сервомашинками
//------------------------------------------------------(i=0;i<fxPWM_CH_NUM;i++)
{(needrotate[i])
{(i, currAng[i]);
needrotate[i] = 0;
}
}
//------------------------------------------------------
// Проверяем условие прерывания операции CMD_SET_INT
//------------------------------------------------------(i=0;i<8;i++)
{= (INT_MASK & (1<<i));(num)
{(ADCVAL[i]>=INT_VALUE) // Блокируем движение
{();_MASK = 0;;
}
}
}(UWasChar1()) addr = ReadCommand(); else continue;(addr!=MY_ADDR) continue;CTL = U485WRITE;_us(DELAY_TIME);(MRcmd)
{CMD_GET_REG:(HEADER_BYTE);(MRfrom);(MY_ADDR);(CMD_SENS_COND);(MAX_REGIST);(i=0;i<MAX_REGIST;i++)(REGIST[i]);;CMD_READ_SENS: // Отправляем значения АЦП(HEADER_BYTE);(MRfrom);(MY_ADDR);(CMD_SENS_COND);(8);(i=0;i<8;i++)(ADCVAL[i]);;CMD_SENS_COND: // Пропускаю командуCMD_ACK:;CMD_PIP: // Пищалка();;CMD_STARTPOS: // Исходное положение();;CMD_SET_FAST:CMD_SET_SLOW:= MRDATA[0];= MRDATA[1];(num<0 || num>=fxPWM_CH_NUM) break;(angle>MaxAng) angle = MaxAng;(angle<MinAng) angle = MinAng;(MRcmd==CMD_SET_FAST) // Быстрый поворот
{[num] = goalAng[num] = angle;((int)num, (int)angle);
}// Медленный поворот[num] = angle;;CMD_SET_VECT_SLOW:CMD_SET_VECT_FAST:(MRlen>fxPWM_CH_NUM) MRlen = fxPWM_CH_NUM;(i=0;i<MRlen;i++)
{= MRDATA[i];(angle>MaxAng) angle = MaxAng;(angle<MinAng) angle = MinAng;(MRcmd==CMD_SET_VECT_FAST) // Быстрый поворот
{[i] = goalAng[i] = angle;(i, (int)angle);
}// Медленный поворот[i]=angle;
};CMD_SET_REG: // Установить значение регистра= MRDATA[0];(num<0 || num>=MAX_REGIST) break;[num] = MRDATA[1];;
//----------------------------------------------------
// Для версии SlaveXPod
//----------------------------------------------------CMD_STOP: // Останов всех сервоприводов();;CMD_SET_INT: // Прервать выполнение операции по состоянию датчика. Аргументы: <маска датчиков> <значение>_MASK = MRDATA[0];_VALUE = MRDATA[1];;
Самое читаемое:
Разработка микроконтроллерного устройства стабилизации температуры
Эффективная организация контроля информации приобретает всё большее
практическое значение, прежде всего как условие успешной практической
деятельности людей. Объем информации, необходимой для нормального
функционирования современного общества, растёт из года в год. На сегодняшний
день складывается ситуация, в которой наряду с самой ...