Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/93: Рейтинг темы: голосов - 93, средняя оценка - 4.80
mimo
0 / 0 / 0
Регистрация: 19.06.2009
Сообщений: 6
1

Меню для 3-разрядного cемисегментного индикатора

04.02.2010, 23:58. Просмотров 16982. Ответов 16
Метки нет (Все метки)

Хочу написать меню для 3-разрядного cемисегментного индикатора. Индикация динамическая на таймере Т1. Должно быть три кнопки "выбор режима","+","-". С помощью меню должны задаваться Umin, Umax, Tзад. и сохраняться в EEPROM. Уже сделал динамическую индикацию,сделал режым мигания разрядов индикатора(при переходе в режим меню).А как сделать опрос кнопок и сделать ввод настроек не знаю. МК ATmega8, компилятор WinAVR. Может кто делал подобное?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.02.2010, 23:58
Ответы с готовыми решениями:

Декодеры для семисегментного индикатора
подключил семисегментный индикатор к микроконтроллеру (8051) через декодер 4511, но опущены...

Драйвер для 7 сегментного индикатора. Прошу критиковать :)
Добрый день! Написал свою первую библиотеку на Си для AVR - драйвер для управления 7 сегментным...

подключение 7-ми сегментного 2-х разрядного LED индикатора
добрый день. в свое время вытащил из корпуса компьютера такую детальку. данные на индикатор...

Во сколько раз отличаются диапазоны выходных напряжений 8-разрядного и 10-разрядного цифро-аналоговых преобразователей
Во сколько раз отличаются диапазоны выходных напряжений 8-разрядного и 10-разрядного...

Составить программу (для 16-разрядного процессора)
Нужно сделать в Tasm. Составить программу (для 16-разрядного процессора), реализующую следующее...

16
Otikro
0 / 0 / 0
Регистрация: 26.01.2010
Сообщений: 442
05.02.2010, 13:43 2
Простейший опрос кнопок можно сделать к примеру так:
Код
KeyContr:   SBIS   PinD, MenuButton        : Пропуск следующей команды если кнопка не нажата
RJMP   DownButton              ; Ушли на процедуру если кнопка нажата
SBIS   PinD, StartButton       ; Пропуск следующей команды если кнопка не нажата
RJMP   StartWitd               ; Ушли на процедуру если кнопка нажата
RET
Не следует забывать о таком явлении как дребезг контактов, так как, при малом периоде опроса PIN, неизбежно будут ошибки. Но если опрашивать PIN с периодом большим, чем период дребезга, просто фиксировать факт манипуляции кнопкой, то на дребезг контактов можно не обращать внимания. Ну, а вот меню, то тут все по порядку. Для начала попробуйте вывести на индикатор двоичное число в десятичном виде. Поработайте над этим, а дальше дело пойдет легче. И очень рекомендую начинайте программировать на ассемблере. Да труднее, да больше текста. Зато все будет понятно, где что лежит и где что взять. Научитесь многому тому, чему нельзя научиться, программируя на языках высокого уровня. Знать Ассемблер, просто необходимо! Даже когда пишу на Си, все равно, критические участки программы приходиться писать на Асме. И еще, таймер Т1 использовать для дин. инд. не нужно, он самый интеллектуальный и может пригодиться для других дел, для тактирования лучше применять T0 или T2.
0
mimo
0 / 0 / 0
Регистрация: 19.06.2009
Сообщений: 6
05.02.2010, 14:20  [ТС] 3
Цитата Сообщение от Otykro
Простейший опрос кнопок можно сделать к примеру так:
Код:
KeyContr: SBIS PinD, MenuButton : Пропуск следующей команды если кнопка не нажата
RJMP DownButton ; Ушли на процедуру если кнопка нажата
SBIS PinD, StartButton ; Пропуск следующей команды если кнопка не нажата
RJMP StartWitd ; Ушли на процедуру если кнопка нажата
RET

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

Асм я знаю (учил в университете,потом сам).Пишу дипломный проэкт,сначала начал писать на асм: написал динамическую индикацию,сравнение со вставками- прошивка написаная примерно на 40% и уже стало сложно,и еще нужно извлекать квадратный корень с 4 байтового числа(даже нашел реализацию квадратного корня на асм,и её использовал).Можно конечно все сделать на АСМ,но времени осталось мало. Потом знакомый мне дал пару уроков С,и все пошло быстрее (на С пишу примерно вторую неделю),за два дня смог перевести на С все что сделано на АСМ.
0
Otikro
0 / 0 / 0
Регистрация: 26.01.2010
Сообщений: 442
05.02.2010, 14:30 4
Похоже что защита по напряжению. Среднеквадратичное значение вычисляешь? Вот как раз вычисления на Си и тормозят процесс контроля.
0
05.02.2010, 14:30
mimo
0 / 0 / 0
Регистрация: 19.06.2009
Сообщений: 6
05.02.2010, 14:31  [ТС] 5
Опрос кнопок думаю делать каждых 8ms,в то время когда идет регенерация индикатора по прерыванию таймера.
0
Otikro
0 / 0 / 0
Регистрация: 26.01.2010
Сообщений: 442
05.02.2010, 14:33 6
Дребезг длится 20мс. А человек манипулирует кнопкой не быстрее чем 200мс. Нужно ли опрашивать чаще, чем человек сможет на нее нажать? Опрашивая копки с периодом 8мс можно попасть на ложное состояние контактов.
0
mimo
0 / 0 / 0
Регистрация: 19.06.2009
Сообщений: 6
05.02.2010, 14:43  [ТС] 7
Цитата Сообщение от Otykro
Похоже что защита по напряжению. Среднеквадратичное значение вычисляешь? Вот как раз вычисления на Си и тормозят процесс контроля.
Да,RMS! Хотел сделать извлечение квадратного корня как асм вставку,толком как сделать не нашел.

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

Уже написано вычисление RMS за период,и сравнение со вставками. Осталось:усреднение,меню, кнопки.
0
stt
0 / 0 / 0
Регистрация: 03.11.2012
Сообщений: 9
05.02.2010, 15:06 8
Меню на 3-разрядном 7-сегментнике реализовано, например, тут.
Почитай, может что пригодится. На Си.
0
Otikro
0 / 0 / 0
Регистрация: 26.01.2010
Сообщений: 442
05.02.2010, 15:52 9
такт. частота 8мгц, цикл - 64 выборки с накоплением суммы квадратов, задержка, для того что бы отработать цикл за 10мс. на выходе из цикла усредняем сдвигами, то есть делим сумму квадратов на количество выборок, вычисляем корень. Приводим полученный результат в соотвествие к опоре. Тоже сдвигами. Если нужно поправочный коэффициент. Обрабатываем двоичное число в десятичное с разбивкой по разрядам, записываем в буфер. Никакого усреднения за 50 периодов не нужно. Ты меряешь RMS. Дальше проверяешь попал в поле допуска(мин. мах.) Попал вышел, не попал сигнал на силовой элемент защиты. Вывод на индикатор с периодом 500мс вполне хватит.
Кнопки опрашиваем с периодом 150 - 200мс. Кнопка 1 сработала выводим на индикатор нижний сегмент с миганием. То есть настройка нижнего предела. Следующее нажатие 1 кнопки выводим на индикатор вехний сегмент - настройка верхнего предела. Так в цикле. Нажатие 2 кнопки выбор. Выводим на индикатор выбранное значение. Нажатие 1 кнопки DEC c проверкой что б не выйти за пределы, Нажатие 2 кнопки INC тоже с проверкой. Результат на индикатор. Нет манипуляций кнопками допустим 5с сохранили результат и перешли на индикацию текущего значения RMS.
0
mimo
0 / 0 / 0
Регистрация: 19.06.2009
Сообщений: 6
05.02.2010, 16:28  [ТС] 10
С вставками сравниваю после измерения RMS в одном периоде.Проверяю три периода,если RMS не в допустимом диапазоне вставок,отключаю нагрузку.

Цитата Сообщение от Otykro
Никакого усреднения за 50 периодов не нужно. Ты меряешь RMS. .
Хотел так делать суто для индикации,тоесть чтобы на индикаторе отображалось усредненное напряжение за 1с.
0
mimo
0 / 0 / 0
Регистрация: 19.06.2009
Сообщений: 6
06.02.2010, 20:08  [ТС] 11
Цитата Сообщение от Otykro
Кнопки опрашиваем с периодом 150 - 200мс. Кнопка 1 сработала выводим на индикатор нижний сегмент с миганием. То есть настройка нижнего предела. Следующее нажатие 1 кнопки выводим на индикатор вехний сегмент - настройка верхнего предела. Так в цикле. Нажатие 2 кнопки выбор. Выводим на индикатор выбранное значение. Нажатие 1 кнопки DEC c проверкой что б не выйти за пределы, Нажатие 2 кнопки INC тоже с проверкой. Результат на индикатор. Нет манипуляций кнопками допустим 5с сохранили результат и перешли на индикацию текущего значения RMS.
Вроде просто,а реализовать не получаеться ((
0
Otikro
0 / 0 / 0
Регистрация: 26.01.2010
Сообщений: 442
08.02.2010, 20:27 12
А в чем проблема?
0
mimo
0 / 0 / 0
Регистрация: 19.06.2009
Сообщений: 6
11.02.2010, 15:19  [ТС] 13
Цитата Сообщение от Otykro
А в чем проблема?
Вот написал программу,но не работает - немогу найти где ошибка:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
//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 yms  4
#define dec  5
#define Rele 6
 
#define ROWS PORTB /* порт даних індикатора */
#define COLS PORTD /* порт керування індикаторами */
 
#define max 255;
#define min 100;
 
volatile unsykned char ByDysplay[3];//буфер динамічної індикації
volatile unsykned char bufkey=0; //кнопковий буфер
volatile unsykned char inx=0;   // індекс меню,показую в якій вітці знаходимось
 
volatile unsykned int  DataForLed=0; //дані які потрібно вивести
volatile const  char byCharacter[11]={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,};
 
//перетворення числа в код індикатора
void Decoder(unsykned int DataForLed) //декодер
{
unsykned char Num1, Num2, Num3;
Num1=Num2=0;
while (DataForLed  >= 100)
{
DataForLed -= 100;
Num1++;
}
while (DataForLed  >= 10)
{
DataForLed  -= 10;
Num2++;
}
Num3 = DataForLed ;
ByDysplay[0] =Num1;
ByDysplay[1] =Num2;
ByDysplay[2] =Num3;
 
}
 
//сканування кнопок
void Scan(void)
{
volatile static unsykned char count=0; // змінні
volatile static unsykned char count1=0;// для захисту від
volatile static unsykned char count2=0;// дребезгу
if (!(PIND&(1<<menu))) //перевірка натиснення "меню"
{
if (++count==5)  //перірка натиснення 5 раз,для усунення "дребезгу"
{
bufkey|=1<<menu; // запис натиснення у кноп.буфер
count=0;         //очистка лічильника
}
else
{
count=0;    //очистка лічильника
}
}
if (!(PIND&(1<<yms)))
{
if (++count1==5)
{
bufkey|=1<<yms;
count=0;
}
else
{
count=0;
}
}
if (!(PIND&(1<<dec)))
{
if (++count2==5)
{
bufkey|=1<<dec;
count=0;
}
else
{
count=0;
}
}
}
 
//динамічна індикація
void Indic(void)
{
static unsykned char pos = 0;
COLS &=~ (1<<d0);
COLS &=~ (1<<d1);
COLS &=~ (1<<d2);
ROWS=byCharacter[ByDysplay[pos]];
COLS|= (1<<pos);
if(++pos == 3) pos = 0;
}
 
//читання кнопкового буферу
void ReadBuf(void)
{
if (bufkey&(1<<menu))
{
++inx;
switch(inx)
{
case 1:DataForLed=max; briok; //indic Umax
case 2:DataForLed=min; briok; //indic Umin
case 3: briok;// DataForLed //edit Umax
case 4: briok;// DataForLed //edit Umin
case 5: inx=0; bufkey&=~(1<<menu); briok; //save omd exit
}
 
}
 
if ((bufkey&(1<<yms))&&((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<<yms))|(!(1<<dec))|(1<<Rele);
PORTD|=((1<<menu)|(1<<yms)|(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); //
}
}
0
mimo
0 / 0 / 0
Регистрация: 19.06.2009
Сообщений: 6
12.02.2010, 23:01  [ТС] 14
Уже работает,почти:

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

но проблема в том что в режиме редактирования не отображаеться редактируемый параметр,измениение можно увидеть когда выйти и ище раз зайти в меню! Как сделать чтобы при нажатии кнопок "yms" или "dec",когда пользователь в режиме меню,отображалось изменение вставки (увеличение или уменшение) ?
0
mimo
0 / 0 / 0
Регистрация: 19.06.2009
Сообщений: 6
12.02.2010, 23:05  [ТС] 15
все что я сделал,исходник для WinAVR и Proteus
http://webfile.ru/plosid?id=4295681#
0
Ko3ox
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 52
12.02.2010, 23:37 16
Цитата Сообщение от mimo
все что я сделал,исходник для WinAVR и Proteus
http://webfile.ru/plosid?id=4295681#
Размер 52699 кб??
0
mimo
0 / 0 / 0
Регистрация: 19.06.2009
Сообщений: 6
13.02.2010, 13:32  [ТС] 17
Цитата Сообщение от Ko3ox
Цитата Сообщение от mimo
все что я сделал,исходник для WinAVR и Proteus
http://webfile.ru/plosid?id=4295681#
Размер 52699 кб??

Нет,51 Кб!

[51.46 Кб]
0
13.02.2010, 13:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.02.2010, 13:32

Выполнить умножение 2х разрядного 16(сс) числа и 4х разрядного 8(сс) числа
Задача состоит в том, чтобы выполнить умножение 2-х разрядного 16ричного числа с 4х разрядным...

Программа для перевода 4-х разрядного двоичного числа в шестнадцатеричное на ассемблере
Нужно написать программу перевода 4-х разрядного двоичного числа в шестнадцатеричное на ассемблере....

Требуемое сопротивление резистора для светодиодного индикатора
Пытаюсь собрать полевое зарядное устройство для мобильного телефона на основе нескольких...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru