while(1) // Непрерывный цикл в ожидании прерывания
{
;
}
}
//********************************************************************
//initialize_ports: обеспечивает начальную конфигурацию портов
//ввода - вывода
//********************************************************************
void initialize_ports(void) {
DDRP = 0xFF; // Установить PORTP как выходной для ШИМ
DDRT = 0x00; //Установить PORTT как входной, а вывод PORTT[7]
// как вход аккумулятора PA
DDRB = 0xFF; //PORTB на вывод - двунаправленная
//магистраль данных для ЖКИ
DDRDLC = 0xFF; //порт PORT DLC на вывод - линии управления ЖКИ
}
//********************************************************************
//RTI_isr: Программа обработки прерывания по меткам реального времени
//********************************************************************
void RTI_isr(void) {
unsigned int new_count;
unsigned int pulse_count;
unsigned int current_RPM;
float max_count = 65535.0;
new_count = PACNT; // Получить текущее число импульсов в аккумуляторе
if (new_count old_count) // Определить текущее число импульсов
pulse_count = new_count - old_count;
else pulse_count = (unsigned int)(max_count-(float)(old_count+new_count));
// Преобразовать число импульсов кодера в об/мин
current_RPM = (unsigned int)(pulse_count/0.032768);
// Изменить число прерываний RTI в счетчике
RTI_int_count = RTI_int_count + 1;
if (RTI_int_count == 10) // Изменить на ЖКИ значение после 10 прерываний RTI
{
display_count_LCD(current_RPM); // Изменить показания ЖКИ
RTI_int_count=0; // Сбросить счетчик прерываний RTI
}
// Изменить значение скорости двигателя
if (current_RPM desired_motor_RPM) PWM_duty_cycle = PWM_duty_cycle + 1; // Ускорить двигатель
else PWM_duty_cycle = PWM_duty_cycle - 1; // Замедлить двигатель
// Изменить скорость двигателя с помощью ШИМ
PWDTY0 = PWM_duty_cycle; //коэффициент заполнения
old_count = new_count;
RTIFLG = 0x80; //сбросить флаг прерывания RTI
}
//********************************************************************
// Initialize_RTI: конфигурирует регистры связанные с RTI
//- Регистр управления RTI (RTICTL):
// - разрешение RTI, флаг RTIE
// - установка периода RTI на 32.768 мс
// - сброс RTI, бит RTIF регистре Флагов RTI (RTIFLG)
//********************************************************************
void initialize_RTI(void) {
RTICTL = 0x86; // Установить период RTI 32.768 мс
RTIFLG = 0x80; // сброс RTI
}
//********************************************************************
// Initialize_RTI_PA: инициализация 68HC12 аккумулятора импульсов PA