Разработка цифрового тахометра на базе микроконтроллер 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