7. ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ СТРОБОСКОПА
#include <avr/io.h>
#include <avr/interrupt.h> //для доступа к sei
#include <avr/signal.h>//для доступа к макросу SIGNAL
#include <avr/delay.h>
#include <util/delay.h>
#include <math.h>
#define Freq 8000000//частота системной синхронизации в Гц
int ZhachPreob,Napr,n,R,Pezim,c,U,Z,Z1,I,N;
unsigned int CurrentTime,PreviousTime,T,UGL;// временные переменнные
unsigned char addr;
//---------Интерфейс ЖКИ-----------//
// A0 R/W E DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7//
// PA5 PA6 PA7 PC0 PC1 PC2 PC3 PC4 PC5 PC6 PC7//
//---------------------------------//
#define A0 PA5//линия выбора регистра
#define RW PA6//линия выбора операции
#define E PA7//линия стробирования / синхронизации
#define BS PC7//флаг занятости
unsigned char str1[] = "Работа";
unsigned char str2[] = "Стробоскоп";
unsigned char str3[] = "Тахометр";
unsigned char str4[] = "Вольтметр";
char buffer[15];
//--------------------------Ожидание готовности------------------------------------
void LCD_wait (void)
{
do
{
DDRC = 0x00;//порт на вход
PORTC = 0xFF;//подтяжка
PORTA &=~_BV(A0);//A0=0 (команда)
PORTA |=_BV(RW); //RW=1 (чтение)
PORTA |=_BV(E);//E=1
_delay_us(0);//задержка в 1 mc
PORTA &=~_BV(E);//E=0
}
while (bit_is_set(PINC,BS)); //ожидать сброса флага занятости
PORTA &=~_BV(RW);//RW=0
PORTA &=~_BV(E);//E=0
}
//-------------------------Запись в LCD------------------------------------------------
void LCD_write (unsigned char p)
{
PORTA &=~_BV(RW);//RW=0
PORTA |=_BV(E);//E=1
DDRC = 0b11111111;//порт C на выход
PORTC = 0b00000000;//подтяжка порта C
_delay_us(0);//задержка в 1 mc
PORTC = p;//запись байта
_delay_us(0);
PORTA &=~_BV(E);//E=0
PORTA &=~_BV(RW);//RW=0
DDRC = 0x00;//порт C на вход
PORTC = 0xFF;
_delay_us(0);
}
//------------------------Чтение из LCD----------------------------------------------
unsigned char LCD_read(void)
{
unsigned char p;//p-прочитанный байт данных
PINC = 0x00;//порт на вход
PORTC = 0xFF;//подтяжка
PORTA |=_BV(RW); //RW=1 (чтение)
PORTA |=_BV(E);//E=1
_delay_us(0);
p = PINC;//чтение входных данных
PORTA &=~_BV(E);//E=0
_delay_us(0);
PORTA &=~_BV(RW);//RW=0
PORTA &=~_BV(E);//E=0
return (p);
}
//-----------Функция ЗАПИСИ КОМАНДЫ (IR) в ЖКИ-----------------------
void LCD_com_write (unsigned char p)//p-байт команды
{
LCD_wait ();//ожидание готовности
PORTA &=~_BV(A0);//A0=0 (команда)
LCD_write (p);//запись команды в ЖКИ
}
//---------Функция ЗАПИСИ ДАННЫХ (DR) в ЖКИ--------------------------
void LCD_data_write (unsigned char p)//p-байт данных
{
LCD_wait ();//ожидание готовности
PORTA |=_BV(A0);//A0=1 (данные)
LCD_write (p);//запись команды в ЖКИ
}
//----------Функция ЧТЕНИЯ СЧЕТЧИКА АДРЕСА ЖКИ-------------------
unsigned char LCD_addr_read(void)
{
unsigned char p;//содержимое счетчика адреса
LCD_wait ();
PORTA &=~_BV(A0);//A0=0 (команда)
p = LCD_read();//чтение команды из ЖКИ
p = (p & 0b01111111);//отбрасывание бита занятости
return (p);//функция возвращает прочитанное
// содержание адреса счетчика
}
//--------Функция ЗАПИСИ команды в ЖКИ (при инициализации)--------
void LCD_com_init (unsigned char p)
{
DDRC = 0b11111111;//порт D на выход
PORTC = 0b00000000;//подтяжка порта D
PORTA &=~_BV(A0);//A0=0 (команда)
PORTA &=~_BV(RW);//RW=0
PORTA |=_BV(E);//E=1
_delay_us(60);//задержка в 1 mc
PORTC = p;//запись байта
_delay_us(60);
PORTA &=~_BV(E);//E=0
_delay_us(0);
PORTA &=~_BV(RW);//RW=0
_delay_us(60);
}
//---------------Функция иницилизации ЖКИ-------------------------------------
void LCD_init ()
{
_delay_ms(20);//ожидание 20 мс
LCD_com_init(0x33);//установка разрядности интерфейса
_delay_ms(40);
LCD_com_init(0x33);//установка разрядности интерфейса
_delay_ms(40);
LCD_com_init(0x33);//установка разрядности интерфейса
_delay_ms(40);
LCD_com_init(0x3A);//8 битный интерфейс, 1 страница знакогенератора
LCD_com_init(0x08);//включение дисплея
LCD_com_init(0x01);//очистка дисплея
LCD_com_init(0x06);//сдвиг курсора вправо
LCD_com_init(0x0F);//включение дисплея, мигающий курсор
}
//--------Функция вывода строки в ЖКИ по адресу "addr"-------------------
void LCD_out_str(unsigned char str[],unsigned char addr)
{
unsigned char a;//номер символа в стоке
unsigned char addr_t;//текущее содержание счетчика адреса ЖКИ
a = 0;
LCD_com_write ((addr + 0x80));//установка курсора на начало строки
while (str[a] !='\0')//ждать окончания строки
{
addr_t = LCD_addr_read();//стение текущего адреса вЖКИ
if (addr_t > 0x10)//если курсор уходит из видимой
{// области первой строки, то
LCD_com_write (0x80);// восстанавливаем его на начало
// первой строки
}
LCD_data_write(str[a]);//Передача данных
a++;
}
}
//-----------------------------------Процедура Импульс 1---------------------------
void P (void)//формирование импульса к лампе вспышке
{
if (Z1>Z) { _delay_loop_2(Z1);}
DDRA = 0xE2;
PORTA = 0x1D;
_delay_loop_2(40);//длительность вспышки
Z1 = 0;
DDRA = 0x1F;
PORTA = 0xE0;
}
//-------------------------Прерывание-------------------------------------------------
SIGNAL (SIG_INTERRUPT1)
{
Z1 = UGL;//сдвинуть периода на градус
R++;//отсчет градусов
Pezim++;
if (Pezim < 3)
{
_delay_loop_2(31250);}//задержка в 1 секунду
}
}
//---------Процедура расчета напряжения-----------------------------------------
void Haprezenie (void)
{
DDRA = 0xE2;
PORTA =0x1D;
ADCSRA = (1<<ADSC); //запуск АЦП
loop_until_bit_is_set(ADCSRA,ADIF); //ожидаем флаг прерывания ADIF
ZhachPreob = (ADCH*255) + ADCL; //вычисляем текущее значение
// преобразования
Napr = ZhachPreob*5/255; //получим значение измеренного
// напряжения в десятичной форме
sprintf(buffer,"%06u",Napr); //форматирование - представление
//числового результата
LCD_out_str (buffer,0x40);//вывод числового значения на ЖКИ, 2
// строка
}
//------------------------------------------------------------------------------
void Tahometr (void)
{
if(PIND & 0x01)== 0x01)//высоковольтный провод (емкостной //синхронизатор)
{
CurrentTime = TCNT1; //записываем текущее значение таймера
//если нет переполнения, то
if (CurrentTime > PreviousTime) T = CurrentTime - PreviousTime;
//если есть переполнение Т/С
else T = 0xFFFF + CurrentTime - PreviousTime;
PreviousTime = CurrentTime;//текущее значение стало предыдущим
U=60.0*2*31250/(T);//скорость вращения коленвала
sprintf(buffer,"%06u",U); //форматирование
LCD_out_str (buffer,0x40);//Вывод числового значения на ЖКИ, 2
// строка
}
if(PIND & 0x04)== 0x04)//низковольтный провод (коммутатор)
{
CurrentTime = TCNT1; //записываем текущее значение таймера
//если нет переполнения, то
if (CurrentTime > PreviousTime) T = CurrentTime - PreviousTime;
//если есть переполнение Т/С
else T = 0xFFFF + CurrentTime - PreviousTime;
PreviousTime = CurrentTime;//текущее значение стало предыдущим
U=60.0*31250/(0.5*T);//скорость вращения коленвала
sprintf(buffer,"%06u",U); //форматирование
LCD_out_str (buffer,0x40);//вывод числового значения на ЖКИ, 2
// строка
}
}
void Stroboskop (void)
{
int c ++;
CurrentTime = TCNT1;//записываем текущее значение таймера
//если нет переполнения, то
if (CurrentTime > PreviousTime) T = CurrentTime - PreviousTime;
//если есть переполнение Т/С
else T = 0xFFFF + CurrentTime - PreviousTime;
PreviousTime = CurrentTime;//текущее значение стало предыдущим
if (c=3)
{
if(PIND & 0x01)== 0x01)высоковольтный провод (емкостной //синхронизатор)
{
UGL=T/720; //2 оборота 1 импульс
n = 31250/T; // частота искрообразований
R = 0;//обнуление счетного регистра
Z = 0;
while ((PINB & 0x01)== 0x01) //пока режим нажат в цикле "режим"
i = 0;
{
for (i = 0, i = n, i ++)//импульсы на HL
{
if (i = 1) P();
else if (i = n/2) P();
else if (i = n) P();
_delay_loop_2(T/n);
sprintf(buffer,"%06u",R); //форматирование
LCD_out_str (buffer,0x40);//вывод числового значения на ЖКИ
}
}
}
if (PIND & 0x04) == 0x04)//низковольтный провод (коммутатор)
{
UGL=T/180; //1 оборот 2 импульс
n = 31250/T; // частота искрообразований
R = 0;//обнуление счетного регистра
Z = 0;
while ((PINB & 0x10)== 0x10) //пока режим нажат в цикле "режим"
i = 0;
{
for (i = 0, i = n, i ++)//импульсы на HL
{
if (i = 1) P();
else if (i = n/2) P();
else if (i = n) P();
_delay_loop_2(T/n);
sprintf(buffer,"%06u",R); //форматирование
LCD_out_str (buffer,0x40);//вывод числового значения на ЖКИ
}
}
}
}
int main (void)
{
//--------------------------------/*Настройка портов*/-------------------------------
DDRB = 0x00;//PB0 - режим
PORTB =0xFF;
DDRD = 0x00;// PD2 - выбор (по внешнему прерыванию),
PORTD =0xFF;
DDRA = 0xE2;//PA1-вход c датчика напряжения
PORTA =0x1D;//PA2-выход на лампу HL
//-------------------------------------------------------------------------------------------
//-------------------------------/*Настройка таймера*/------------------------------
TCCR1A = 0;//режим ШИМ выключен
TCCR1B = _BV(CS12);//коэффициент деления частоты системной
// синхронизации = 256
//-------------------------------------------------------------------------------------------
//--------------------------------/*Настройка АЦП*/---------------------------------
ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS2);//ADEN-разрешь
// работу АЦП, делитель частоты
// АЦП =64(8000000МГц/64=125кГц)
ADMUX = (1<<ADLAR)| (1<<REFS0);//выравнивание результата
// по правому краю выбран первый канал
// напряжение питания AVcc
//-------------------------------------------------------------------------------------------
//---------------------------------/*Настройка прерываний*/-----------------------
GICR = 0x40;//разрешить прерывания по выводу INT0
MCUCR = (1<<ISC11)|(1<<ISC10)|(1<<ISC01)|(1<<ISC00);//генерация внешних прерываний по нарастающему фронту
//-------------------------------------------------------------------------------------------
sei ();//разрешить прерывания
//----------------------------------------------ЖКИ--------------------------------------
LCD_init();//инициализация
while(1)
{
Pezim = 0;//обнуление счетного регистра
LCD_out_str (str1,0x00);
while ((PINB & 0x01) == 0x01)
{
if (Pezim ==1) Haprezenie ();
if (Pezim ==2) Tahometr ();
if (Pezim ==3) Stroboskop ();
if (Pezim ==3) LCD_out_str (str2,0x00);//стробоскоп
if (Pezim ==2) LCD_out_str (str3,0x00);//тахометр
if (Pezim ==1) LCD_out_str (str4,0x00);//вольтметр
}
}
}
При использовании стробоскопа с лампой вспышкой необходимо заменить «процедуру Импульс 1» на «процедуру Импульс 2»
//---------------------------------Процедура Импульс 2----------------------------
void P (void)//формирование импульса к лампе вспышке
{
if (Z1>Z) { _delay_loop_2(Z1);}
DDRA = 0xE2;
PORTA = 0x1D;
_delay_loop_2(40);//длительность вспышки
Z1 = 0;
DDRA = 0x1F;
PORTA = 0xE0;
}
... -4002; 5) пинцет ППМ 120 РД 107.290.600.034-89; 6) тара АЮР 7877-4048. Суммарное оперативное время Топ = 2 мин. Комплект технологической документации на технологический процесс сборки и монтажа блока стробоскопического прибора приведен в приложении. 5. ПРОЕКТИРОВАНИЕ УЧАСТКА СБОРКИ И МОНТАЖА Внедрение на предприятии механизированных, автоматизированных и автоматических поточных линий ...
... заслонки. д) Подсоединить шланги вентиляции картера и вакуумный шланг. е) Подсоединить трос системы поддержания скорости. ж) Установите воздуховод с переходником. 3.Техническое обслуживание трансмиссии 3.1 Проверка рабочей жидкости в АКПП Автомобиль должен совершить пробег для достижения нормальной рабочей температуры 70 - 80°С рабочей жидкости. 1. Установить автомобиль на ровной ...
... . На участке установлены кран-балки в первом и втором помещении, для перемещения тяжелых запасных частей, и самого двигателя в целом. 1.3.8 Организация ТО и ТР на участке Схема технологического процесса Т.О. и ремонта автомобилей При возвращении с линии автомобиль проходит через контрольно-технический пункт (КТП), где дежурный механик проводит визуальный осмотр автомобиля (автопоезда) и ...
... рынке для выживания в конкурентной среде и успешного развития предприятию необходим четко разработанный план как на длительную перспективу, так и на текущий период. ГЛАВА 2. АНАЛИЗ ПОЛОЖЕНИЯ ПРЕДПРИЯТИЯ ООО «АВТОДОМ-АТЭКС» НА РЫНКЕ УСЛУГ АВТОСЕРВИСА 2.1 Краткая технико-экономическая характеристика предприятия Предприятие «Автодом–Атэкс» учреждено на основании решения участников от 23 ...
0 комментариев