Технические разделы

Основные конструкции и процедуры, используемые для написания программы

Листинг 4.1 - Создание макроса

#define byBladeCnt 2

#define Prescaler 0x01 //0x00 - для кварца 4MHz, 0x01 - для кварца 8MHz .

#define UpCount 4 // +1 = количество пропусков (0,1S) до обновления

#include <tiny2313.h>

#include <delay.h>

BOOLEAN btTimeUpdate; // = 1, когда нужно обновить время на дисплееwTime; // Время, которое показывает секундомер (в десятых секунды)btTimerOn; // TRUE - таймер запущен, FALSE - остановленbyTcnt; // счетчик десятых секундbyDisplayRefreshCnt; //ShowDisplayData(void); // Вывод экранного буфераPrepareRpmData(WORD wRpm);btDisplayUpdate; // = TRUE, если пришло время обновить дисплейbyDisplay[4]; // буфер данных, для вывода на экранwLockedRpm;

// Массив знакогенератораbyCharacter[12] = {0xFA, //0

0x82, //1

xB9, //2

xAB, //3

xC3, //4

x6B, //5

x7B, //6

xA2, //7

xFB, //8

xEB, //9

x00, //blank

0x01 //-

};wRpm; // Скорость вращения ротора (об/мин)

//BOOLEAN btRpmUpdate; // = 1, когда измеряно новое значение оборотовwTimerOvfCnt; // Счетчик переполнений таймера (нужен для

// увеличения разрядностиwFlashCnt; // Счетчик срабатываний датчика прохождения допастиbtFirstLowRateFlash; // FALSE - если отсчет периода еще не начался

// (датчик ни разу не сработал)

Листинг 4.2 - Обновление дисплея

void RefreshDisplay(void)

{

#asm("cli");(btDisplayUpdate)

{= wRpm;= FALSE;

}

#asm("sei");(wLockedRpm);();

}

Листинг 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 Головная функция. Инициализация всех модулей. Цикл вызова рабочих подпрограмм

Перейти на страницу: 1 2

Еще статьи по технике и технологиям

Система пропорционально-интегрального регулирования
1. Выбрать кривую разгона согласно варианту задания. 2. Аппроксимировать кривую разгона апериодическим звеном первого порядка с запаздыванием. Определить соотношение угла наклона . . Найти оптимальные настройки ...

Расчет надежности радиоэлектронных устройств
Оценка показателей надежности радиоэлектронных устройств (РЭУ) является обязательной процедурой, выполняемой на этапе проектирования аппаратуры. Актуальность задач по расчету надежности объясняется тем, что они дают ответ на вопрос о ц ...

© 2021 | www.techexpose.ru