Разработка цифрового тахометра на базе микроконтроллер ATtiny2313

Курсовой проект - Компьютеры, программирование

Другие курсовые по предмету Компьютеры, программирование

Листинг 4.3 - Преобразование скорости мотораPrepareRpmData(WORD wRpm)

{i;R;= wRpm;[3] = wRpm % 10;/= 10;(byDisplay[3] > 4) //округляем

{

wRpm++;+= 10;

}[3] = 0;

// Первые 4 цифр - обороты двигателя

for(i=0; i<3; i++)

{[2-i] = wRpm % 10;/= 10;

}(R < 10)

{[0] = 10;[1] = 10;[2] = 10;exit;

}((R >= 10) & (R <100))

{[0] = 10;[1] = 10;exit;

}((R >= 100) & (R <1000))

{[0] = 10;exit;

}:

}

Листинг 4.4 Вывод экранного буфера на дисплей.

void ShowDisplayData(void)

{

#ifdef Cathode= byCharacter[byDisplay[0]];.5 = 0;_us(LED_delay);.5 = 1;= byCharacter[byDisplay[1]];.1 = 0;_us(LED_delay);.1 = 1;= byCharacter[byDisplay[2]];.0 = 0;_us(LED_delay);.0 = 1;= byCharacter[byDisplay[3]];.4 = 0;_us(LED_delay);.4 = 1;

#endif

#ifdef Anode= ~byCharacter[byDisplay[0]];.5 = 1;_us(LED_delay);.5 = 0;= ~byCharacter[byDisplay[1]];.1 = 1;_us(LED_delay);.1 = 0;= ~byCharacter[byDisplay[2]];.0 = 1;_us(LED_delay);.0 = 0;= ~byCharacter[byDisplay[3]];.4 = 1;_us(LED_delay);.4 = 0;

#endif(! PIND.6)

{_us(Light_delay);

}

}

Лисинг 4.5 - Обработка прерываний от OC1 (для отсчета импульсов 0.1 сек)

interrupt [TIM1_COMPA] void SYSTEM_TICK_interrupt(void)

{

// Вычисляем оммент следующего срабатывания таймераA += CNT_100_MS;

// 3 раза в секунду перерисовываем дисплей,

// независимо от обстоятельств.

if( ++byDisplayRefreshCnt == UpCount )

{

byDisplayRefreshCnt = 0;

btDisplayUpdate = TRUE;

}

// Если секундомер запущен - инкрементируем его показания

if( btTimerOn )

{(++byTcnt == 10)

{= 0;

if( ++wTime == 60000)= 0;

}

}

}

Литинг 4.6 - Обработка прерываний от управляющих импульсов

interrupt [EXT_INT0] void RPM_PULSE_interrupt(void)

{lTmp;&= ~0x40;(btFirstLowRateFlash)

{

// Первый импульс, сбрасываем счетчик периода и

// счетчик импульсов= 0;= 0;= 0;

TIFR = 0x02;B = 0x03; // FCK / 64 ( 62.5 KHz )

TCNT0 = 0;|= 0x02; // Разрешаем прерывания от TMR0= FALSE;

}

{++;

// Проверяем, не пора ли закончить измерения

if( wTimerOvfCnt > TIMER_OVF_ENOUGHT )

{B = 0; // Останавливаем TMR0&= 0x40; // Запрещаем прерывания от INT0&= ~0x02; // Запрещаем прерывания от TMR0(TIFR & 0x02)++; // Учитываем возможность переполнения

lTmp = (62500L * 60L * (long)wFlashCnt);/= ((wTimerOvfCnt << 8) + TCNT0);/= byBladeCnt;= lTmp;

// Перезапускаем измерения= TRUE;= 0;= 0;B = 0x03; // FCK / 64 ( 62.5 KHz )

TCNT0 = 0;= 0x02;|= 0x02; // Разрешаем прерывания от TMR0

// GIFR = 0x40;

}

}= 0x40;|= 0x40;

}

Листинг 4.6 - interrupt [TIM0_OVF] void TIMER0_interrupt(void)

{++;

// Если импульсов не было слишком долго, то показываем

// 0 оборотов и запускаем измерение заново( wTimerOvfCnt > NO_PULSES_INTERVAL )

{= 0;= TRUE;= 0;

}

}

Листинг 4.7 Головная функция. Инициализация всех модулей. Цикл вызова рабочих подпрограмм

void main(void)

{

// Crystal Oscillator division factor:

#pragma optsize-=0x80;=Prescaler; //0x00 - для кварца 4MHz, 0x01 - для кварца 8MHz...

#ifdef _OPTIMIZE_SIZE_

#pragma optsize+

#endif

#asm("cli");= 0x00; // Запрещаем SLEEP, режимы прерывания пока не важны.

// В принципе, этого можно и не делать.= 0x00; // Запрещаем внешние прерывания= 0xFF; // Очищаем флаги прерываний= 0x00; // Запрещаем прерывания от таймеров= 0xFF; // Очищаем флаги прерываний

//Разряд DDRx - определяет направление передачи данных (0 - вход, 1 - выход).

//Разряд PORTx - если вывод определен выходом (DDRx = 1), то:

// если установлена 1 - то на выводе устанавливается лог. 1

// если установлена 0 - то на выводе устанавливается лог. 0

// если вывод определен входом (DDRx = 0), то PORTx - определяет состояние подтягивающего резистора (при PORTx = 1 резистор подключен)

//Разряд PINx - доступен только для чтения и содержит физическое значение вывода порта

PORTA=0b00000011;= 0b00000011;=0b00000000;= 0b11111111;

#ifdef Cathode=0b01111111;= 0b00110011;

#endif

#ifdef Anode=0b01001100;= 0b00110011;

#endif

// Инициализируем модули

//time------------------------------------= FALSE;= 0;= 0;= 0;= FALSE;= 0;A = 0x00; // Отключаем управление выводом OC1 и PWM

TCCR1B = 0x03; // На таймер подается FCK через делитель на 64,

// шумодав отключен, никакого сброса нетA = TCNT1 + CNT_100_MS;|= 0x40; // Сбрасываем флаг прерываний от Output-Compare|= 0x40; // Разрешаем прерывание от Output-Compare

//time------------------------------------

//rmp-------------------------------------= TRUE;= 0;

// Разрешаем прервание INT1= 0x40;|= 0x40;= 0x02; // Настраиваем INT0 на спад, остальные биты не важны.

// Таймер запускаем сразу, чтобы проверять

// отсутствие сигнала= 0;= 0;B = 0x03; // FCK / 64 ( 62.5 KHz )= 0;|= 0x02; // Разрешаем прерывания от TMR0

//rmp-------------------------------------

#asm("sei");

// StartLowRateRpm();(TRUE)

{();

}

}

 

5.Рабочий проект

 

Рабочий проект включает в себя программирование устройства и физическое тестирование.

 

5.1Реализация и программирование

 

Интегрированная среда IAR Embedded Workbench IDE содержит: графическую оболочку для управления ресурсами проекта; текстовый редактор исходного модуля программы; кросс-компилятор; отладчик, программатор; автоматический генератор программного кода; терминал для работы с последовательным интерфейсом RS232C (USART).

Полученный в результате компиляции исходного кода программы на языке С исполняемый модуль (файл прошивки) может быть непосредственно записан в память программ микроконтроллера.

 

Рисунок 5.1 - Главное окно IAR Embedded Workbench IDE

Таблица 5.1 - Описание пунктов меню

МенюОписаниеFileВ меню File представлены команды для открытия новых файлов и файлов проекта, сохранение, печать и выход из IAR Embedded Workbench IDE.EditМеню Edit содержит команды редактирования и поиска в окнах редактора, включения и отключения контрольных точек в C-SPY.ViewКоманды меню View используют для того, чтобы открыть окна и выбрать для отображения необходимые инструментальные панели.ProjectМеню Project содержит команды для того, чтобы добавить файлы к проекту, создать группы, и использовать инструментальные средства IAR в текущем проекте.ToolsМеню Tools - пользовательское-конфигурируемое меню, к которому Вы можете добавить инструментальные средства для использования с IAR Embedded Workbench IDE.WindowС помощью команд в меню Window вы можете управлять внедренными окнами IAR Embedded Workbench IDE и изменять их расположение относительно экрана.HelpМеню Help содержит справку о IAR Embedd