Easyelectronics.ru

Электроника для всех
Текущее время: 08 мар 2021, 08:27

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 18 ] 
Автор Сообщение
 Заголовок сообщения: Меню для 3-разрядного cемисегментного индикатора
СообщениеДобавлено: 06 фев 2010, 00:45 
Заглядывает иногда

Зарегистрирован: 27 янв 2010, 22:29
Сообщения: 31
Откуда: Ивано-Франковск,Украина
Хочу написать меню для 3-разрядного cемисегментного индикатора. Индикация динамическая на таймере Т1. Должно быть три кнопки "выбор режима","+","-". С помощью меню должны задаваться Umin, Umax, Tзад. и сохраняться в EEPROM. Уже сделал динамическую индикацию,сделал режым мигания разрядов индикатора(при переходе в режим меню).А как сделать опрос кнопок и сделать ввод настроек не знаю. МК ATmega8, компилятор WinAVR. Может кто делал подобное?


Последний раз редактировалось nemo 06 фев 2010, 02:10, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Меню для 3-разрядного cемисегментного индикатора
СообщениеДобавлено: 06 фев 2010, 14:30 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 12:39
Сообщения: 690
Откуда: г. Симферополь
Простейший опрос кнопок можно сделать к примеру так:
Код:
KeyContr:   SBIS   PinD, MenuButton        : Пропуск следующей команды если кнопка не нажата
            RJMP   DownButton              ; Ушли на процедуру если кнопка нажата
            SBIS   PinD, StartButton       ; Пропуск следующей команды если кнопка не нажата
            RJMP   StartWeld               ; Ушли на процедуру если кнопка нажата
            RET

Не следует забывать о таком явлении как дребезг контактов, так как, при малом периоде опроса PIN, неизбежно будут ошибки. Но если опрашивать PIN с периодом большим, чем период дребезга, просто фиксировать факт манипуляции кнопкой, то на дребезг контактов можно не обращать внимания. Ну, а вот меню, то тут все по порядку. Для начала попробуйте вывести на индикатор двоичное число в десятичном виде. Поработайте над этим, а дальше дело пойдет легче. И очень рекомендую начинайте программировать на ассемблере. Да труднее, да больше текста. Зато все будет понятно, где что лежит и где что взять. Научитесь многому тому, чему нельзя научиться, программируя на языках высокого уровня. Знать Ассемблер, просто необходимо! Даже когда пишу на Си, все равно, критические участки программы приходиться писать на Асме. И еще, таймер Т1 использовать для дин. инд. не нужно, он самый интеллектуальный и может пригодиться для других дел, для тактирования лучше применять T0 или T2.


Последний раз редактировалось Alegro 06 фев 2010, 15:08, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Меню для 3-разрядного cемисегментного индикатора
СообщениеДобавлено: 06 фев 2010, 15:07 
Заглядывает иногда

Зарегистрирован: 27 янв 2010, 22:29
Сообщения: 31
Откуда: Ивано-Франковск,Украина
Alegro писал(а):
Простейший опрос кнопок можно сделать к примеру так:
Код:
KeyContr:   SBIS   PinD, MenuButton        : Пропуск следующей команды если кнопка не нажата
            RJMP   DownButton              ; Ушли на процедуру если кнопка нажата
            SBIS   PinD, StartButton       ; Пропуск следующей команды если кнопка не нажата
            RJMP   StartWeld               ; Ушли на процедуру если кнопка нажата
            RET

Не следует забывать о таком явлении как дребезг контактов, так как, при малом периоде опроса PIN, неизбежно будут ошибки. Но если опрашивать PIN с периодом большим, чем период дребезга, просто фиксировать факт манипуляции кнопкой, то на дребезг контактов можно не обращать внимания. Ну, а вот меню, то тут все по порядку. Для начала попробуйте вывести на индикатор двоичное число в десятичном виде. Поработайте над этим, а дальше дело пойдет легче. И очень рекомендую начинайте программировать на ассемблере. Да труднее, да больше текста. Зато все будет понятно, где что лежит и где что взять. Научитесь многому тому, чему нельзя научиться, программируя на языках высокого уровня. Знать Ассемблер, просто необходимо! Даже когда пишу на Си, все равно, критические участки программы приходиться писать на Асме.


Асм я знаю (учил в университете,потом сам).Пишу дипломный проэкт,сначала начал писать на асм: написал динамическую индикацию,сравнение со вставками- прошивка написаная примерно на 40% и уже стало сложно,и еще нужно извлекать квадратный корень с 4 байтового числа(даже нашел реализацию квадратного корня на асм,и её использовал).Можно конечно все сделать на АСМ,но времени осталось мало. Потом знакомый мне дал пару уроков С,и все пошло быстрее (на С пишу примерно вторую неделю),за два дня смог перевести на С все что сделано на АСМ.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Меню для 3-разрядного cемисегментного индикатора
СообщениеДобавлено: 06 фев 2010, 15:17 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 12:39
Сообщения: 690
Откуда: г. Симферополь
Похоже что защита по напряжению. Среднеквадратичное значение вычисляешь? Вот как раз вычисления на Си и тормозят процесс контроля.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Меню для 3-разрядного cемисегментного индикатора
СообщениеДобавлено: 06 фев 2010, 15:18 
Заглядывает иногда

Зарегистрирован: 27 янв 2010, 22:29
Сообщения: 31
Откуда: Ивано-Франковск,Украина
Опрос кнопок думаю делать каждых 8ms,в то время когда идет регенерация индикатора по прерыванию таймера.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Меню для 3-разрядного cемисегментного индикатора
СообщениеДобавлено: 06 фев 2010, 15:20 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 12:39
Сообщения: 690
Откуда: г. Симферополь
Дребезг длится 20мс. А человек манипулирует кнопкой не быстрее чем 200мс. Нужно ли опрашивать чаще, чем человек сможет на нее нажать? Опрашивая копки с периодом 8мс можно попасть на ложное состояние контактов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Меню для 3-разрядного cемисегментного индикатора
СообщениеДобавлено: 06 фев 2010, 15:30 
Заглядывает иногда

Зарегистрирован: 27 янв 2010, 22:29
Сообщения: 31
Откуда: Ивано-Франковск,Украина
Alegro писал(а):
Похоже что защита по напряжению. Среднеквадратичное значение вычисляешь? Вот как раз вычисления на Си и тормозят процесс контроля.


Да,RMS! Хотел сделать извлечение квадратного корня как асм вставку,толком как сделать не нашел.

Не знаю как в железе но в Протеус все работает! В течении полупериода делаеться 96 выборок-заносяться в масив,потом обрабатываються и сравниваються со вставками. Потом идет усреднение за 1с (50 периодов) и вывод на индикатор. Запуск АЦП и динамическая индикация реализована на одном таймере.

Уже написано вычисление RMS за период,и сравнение со вставками. Осталось:усреднение,меню, кнопки.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Меню для 3-разрядного cемисегментного индикатора
СообщениеДобавлено: 06 фев 2010, 15:34 
Заглядывает иногда

Зарегистрирован: 27 янв 2010, 22:29
Сообщения: 31
Откуда: Ивано-Франковск,Украина
.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Меню для 3-разрядного cемисегментного индикатора
СообщениеДобавлено: 06 фев 2010, 15:53 
Супермодератор
Аватара пользователя

Зарегистрирован: 26 янв 2010, 22:19
Сообщения: 6844
Откуда: Из тех... Из бывших...
Меню на 3-разрядном 7-сегментнике реализовано, например, тут.
Почитай, может что пригодится. На Си.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Меню для 3-разрядного cемисегментного индикатора
СообщениеДобавлено: 06 фев 2010, 16:39 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 12:39
Сообщения: 690
Откуда: г. Симферополь
такт. частота 8мгц, цикл - 64 выборки с накоплением суммы квадратов, задержка, для того что бы отработать цикл за 10мс. на выходе из цикла усредняем сдвигами, то есть делим сумму квадратов на количество выборок, вычисляем корень. Приводим полученный результат в соотвествие к опоре. Тоже сдвигами. Если нужно поправочный коэффициент. Обрабатываем двоичное число в десятичное с разбивкой по разрядам, записываем в буфер. Никакого усреднения за 50 периодов не нужно. Ты меряешь RMS. Дальше проверяешь попал в поле допуска(мин. мах.) Попал вышел, не попал сигнал на силовой элемент защиты. Вывод на индикатор с периодом 500мс вполне хватит.
Кнопки опрашиваем с периодом 150 - 200мс. Кнопка 1 сработала выводим на индикатор нижний сегмент с миганием. То есть настройка нижнего предела. Следующее нажатие 1 кнопки выводим на индикатор вехний сегмент - настройка верхнего предела. Так в цикле. Нажатие 2 кнопки выбор. Выводим на индикатор выбранное значение. Нажатие 1 кнопки DEC c проверкой что б не выйти за пределы, Нажатие 2 кнопки INC тоже с проверкой. Результат на индикатор. Нет манипуляций кнопками допустим 5с сохранили результат и перешли на индикацию текущего значения RMS.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Меню для 3-разрядного cемисегментного индикатора
СообщениеДобавлено: 06 фев 2010, 17:15 
Заглядывает иногда

Зарегистрирован: 27 янв 2010, 22:29
Сообщения: 31
Откуда: Ивано-Франковск,Украина
С вставками сравниваю после измерения RMS в одном периоде.Проверяю три периода,если RMS не в допустимом диапазоне вставок,отключаю нагрузку.

Alegro писал(а):
Никакого усреднения за 50 периодов не нужно. Ты меряешь RMS. .


Хотел так делать суто для индикации,тоесть чтобы на индикаторе отображалось усредненное напряжение за 1с.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Меню для 3-разрядного cемисегментного индикатора
СообщениеДобавлено: 07 фев 2010, 20:55 
Заглядывает иногда

Зарегистрирован: 27 янв 2010, 22:29
Сообщения: 31
Откуда: Ивано-Франковск,Украина
Alegro писал(а):
Кнопки опрашиваем с периодом 150 - 200мс. Кнопка 1 сработала выводим на индикатор нижний сегмент с миганием. То есть настройка нижнего предела. Следующее нажатие 1 кнопки выводим на индикатор вехний сегмент - настройка верхнего предела. Так в цикле. Нажатие 2 кнопки выбор. Выводим на индикатор выбранное значение. Нажатие 1 кнопки DEC c проверкой что б не выйти за пределы, Нажатие 2 кнопки INC тоже с проверкой. Результат на индикатор. Нет манипуляций кнопками допустим 5с сохранили результат и перешли на индикацию текущего значения RMS.


Вроде просто,а реализовать не получаеться ((


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Меню для 3-разрядного cемисегментного индикатора
СообщениеДобавлено: 09 фев 2010, 21:14 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 12:39
Сообщения: 690
Откуда: г. Симферополь
А в чем проблема?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Меню для 3-разрядного cемисегментного индикатора
СообщениеДобавлено: 12 фев 2010, 16:06 
Заглядывает иногда

Зарегистрирован: 27 янв 2010, 22:29
Сообщения: 31
Откуда: Ивано-Франковск,Украина
Alegro писал(а):
А в чем проблема?

Вот написал программу,но не работает - немогу найти где ошибка:

//ATmega8
//F_CPU=8Mhz
#include <avr/io.h>
#include <avr/interrupt.h>

#define d0 0
#define d1 1
#define d2 2
#define menu 3
#define inc 4
#define dec 5
#define Rele 6

#define ROWS PORTB /* порт даних індикатора */
#define COLS PORTD /* порт керування індикаторами */

#define max 255;
#define min 100;

volatile unsigned char ByDisplay[3];//буфер динамічної індикації
volatile unsigned char bufkey=0; //кнопковий буфер
volatile unsigned char inx=0; // індекс меню,показую в якій вітці знаходимось

volatile unsigned int DataForLed=0; //дані які потрібно вивести
volatile const char byCharacter[11]={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,};

//перетворення числа в код індикатора
void Decoder(unsigned int DataForLed) //декодер
{
unsigned char Num1, Num2, Num3;
Num1=Num2=0;
while (DataForLed >= 100)
{
DataForLed -= 100;
Num1++;
}
while (DataForLed >= 10)
{
DataForLed -= 10;
Num2++;
}
Num3 = DataForLed ;
ByDisplay[0] =Num1;
ByDisplay[1] =Num2;
ByDisplay[2] =Num3;

}

//сканування кнопок
void Scan(void)
{
volatile static unsigned char count=0; // змінні
volatile static unsigned char count1=0;// для захисту від
volatile static unsigned char count2=0;// дребезгу
if (!(PIND&(1<<menu))) //перевірка натиснення "меню"
{
if (++count==5) //перірка натиснення 5 раз,для усунення "дребезгу"
{
bufkey|=1<<menu; // запис натиснення у кноп.буфер
count=0; //очистка лічильника
}
else
{
count=0; //очистка лічильника
}
}
if (!(PIND&(1<<inc)))
{
if (++count1==5)
{
bufkey|=1<<inc;
count=0;
}
else
{
count=0;
}
}
if (!(PIND&(1<<dec)))
{
if (++count2==5)
{
bufkey|=1<<dec;
count=0;
}
else
{
count=0;
}
}
}

//динамічна індикація
void Indic(void)
{
static unsigned char pos = 0;
COLS &=~ (1<<d0);
COLS &=~ (1<<d1);
COLS &=~ (1<<d2);
ROWS=byCharacter[ByDisplay[pos]];
COLS|= (1<<pos);
if(++pos == 3) pos = 0;
}

//читання кнопкового буферу
void ReadBuf(void)
{
if (bufkey&(1<<menu))
{
++inx;
switch(inx)
{
case 1:DataForLed=max; break; //indic Umax
case 2:DataForLed=min; break; //indic Umin
case 3: break;// DataForLed //edit Umax
case 4: break;// DataForLed //edit Umin
case 5: inx=0; bufkey&=~(1<<menu); break; //save and exit
}

}


if ((bufkey&(1<<inc))&&((inx==3)||(inx==4)))
{
DataForLed=DataForLed+1;
}

if ((bufkey&(1<<dec))&&((inx==3)||(inx==4)))
{
DataForLed=DataForLed-1;
}
}

// ініціалізація
inline void init(void) //8ms
{
DDRD=(1<<d0)|(1<<d1)|(1<<d2)|(!(1<<menu))|(!(1<<inc))|(!(1<<dec))|(1<<Rele);
PORTD|=((1<<menu)|(1<<inc)|(1<<dec)); // вкл. підтяжки на кнопки
DDRB=0xFF;
TIMSK=1<<OCIE1A;
OCR1AL=250;
TCCR1B =(1<<WGM12)|(1<<CS12); //256
TCNT1H=0x00 ;
TCNT1L=0x00 ;
sei();
}

// обробка периривання таймера
ISR(TIMER1_COMPA_vect) // 8ms
{
Scan();
Indic();
}



//головна програма
int main(void)
{
init();
while(1)
{
ReadBuf();
Decoder(DataForLed); //
}
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Меню для 3-разрядного cемисегментного индикатора
СообщениеДобавлено: 13 фев 2010, 23:48 
Заглядывает иногда

Зарегистрирован: 27 янв 2010, 22:29
Сообщения: 31
Откуда: Ивано-Франковск,Украина
Уже работает,почти:

Нажатие кнопки "меню":
1-нажатие отображение вставки макс
2-нажатие обображение вставки мин
3-нажатие редактирование вставки макс
4-нажатие редактирование вставки мин
5-выход из меню.

но проблема в том что в режиме редактирования не отображаеться редактируемый параметр,измениение можно увидеть когда выйти и ище раз зайти в меню! Как сделать чтобы при нажатии кнопок "inc" или "dec",когда пользователь в режиме меню,отображалось изменение вставки (увеличение или уменшение) ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Меню для 3-разрядного cемисегментного индикатора
СообщениеДобавлено: 13 фев 2010, 23:52 
Заглядывает иногда

Зарегистрирован: 27 янв 2010, 22:29
Сообщения: 31
Откуда: Ивано-Франковск,Украина
все что я сделал,исходник для WinAVR и Proteus
http://webfile.ru/placed?id=4295681#


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Меню для 3-разрядного cемисегментного индикатора
СообщениеДобавлено: 14 фев 2010, 00:24 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 26 янв 2010, 23:02
Сообщения: 57
nemo писал(а):
все что я сделал,исходник для WinAVR и Proteus
http://webfile.ru/placed?id=4295681#

Размер 52699 кб??


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Меню для 3-разрядного cемисегментного индикатора
СообщениеДобавлено: 14 фев 2010, 14:19 
Заглядывает иногда

Зарегистрирован: 27 янв 2010, 22:29
Сообщения: 31
Откуда: Ивано-Франковск,Украина
Ka3ax писал(а):
nemo писал(а):
все что я сделал,исходник для WinAVR и Proteus
http://webfile.ru/placed?id=4295681#

Размер 52699 кб??


Нет,51 Кб!


Вложения:
menu_beta.zip [51.46 Кб]
Скачиваний: 224
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 18 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB