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

Работа с семисегментником на ATtiny2313

12.11.2014, 13:01. Просмотров 1534. Ответов 13
Метки нет (Все метки)

Нужна помощь.
Используемый софт: AVR Studio 6, Proteus 7.8
Задача:
По кнопке должен загораться 7-ми сегментнай индикатор, показыват число от 0 до 9 соответственно.
Всего 10 кнопок. Когда кнопка зажата, на ножку поступает сигнал, на индикаторе загорается 0. Отпускаем кнопку - индикатор потух.
Когда зажаты все 10 кнопок, на индикаторе должен высвечиваться 0. Постепенно будет выключаться 1 кнопка последовательно, пока не останется последняя, по которой индикатор должен выдавать 9.
В Proteus'е моделирование сделал с помошью сдвигового регистра 74HC595.
У меня получилось сделать только с 1-й кнопкой, когда ставлю 2-ю, он начинает "моргать", т.е. кнопка отжета - индикатор не горит, когда кнопка зажата - индикатор переключается с 0 на 1.
Проблема где-то в условии, но я не знаю как исправить, т.к. новичек в этом деле.
Может быть еще нужно счетчик кнопок поставить? (не знаю)
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
#define F_CPU 10UL  // 8 MHz
#include <avr/io.h>
#include <util/delay.h>
int main(void){
 DDRB=0b00001111;  // на выход
 PORTB=0b00000000;  // на PORTB все 0
 PINB7==0;
 PINB6==0;
 while(1){
m2:
  if (PINB&((1<<PB6)^(1<<PB7))){
   PORTB=0b00001001; //Q1.0
   PORTB=0b00001000;
   PORTB=0b00001001; //Q1.1
   PORTB=0b00001000;
   PORTB=0b00001011; //Q1.2
   PORTB=0b00001000;
   PORTB=0b00001011; //Q1.3
   PORTB=0b00001000;
   PORTB=0b00001011; //Q1.4
   PORTB=0b00001000;
   PORTB=0b00001011; //Q1.5
   PORTB=0b00001000;
   PORTB=0b00001011; //Q1.6
   PORTB=0b00001000;
   PORTB=0b00001011; //Q1.7
   PORTB=0b00001100;
   PORTB=0b00000000;
  }
  else {   
   PORTB=0b00000100; //Q1.0
  // PORTB=0b00000000;
   goto m1;
  }
  m1:
    if (PINB&((1<<PB6)^(1<<PB7))){
   PORTB=0b00001001; //Q1.0
   PORTB=0b00001000;
   PORTB=0b00001001; //Q1.1
   PORTB=0b00001000;
   PORTB=0b00001001; //Q1.2
   PORTB=0b00001000;
   PORTB=0b00001001; //Q1.3
   PORTB=0b00001000;
   PORTB=0b00001001; //Q1.4
   PORTB=0b00001000;
   PORTB=0b00001011; //Q1.5
   PORTB=0b00001000;
   PORTB=0b00001011; //Q1.6
   PORTB=0b00001000;
   PORTB=0b00001001; //Q1.7
   PORTB=0b00001100;
   PORTB=0b00000000;
  }
  else {   
   PORTB=0b00000100; //Q1.0
  // PORTB=0b00000000;
 //  break;
  }
 }
 goto m2;
}
Вот, собственно, как он моргает в протеусе:
0
Миниатюры
Работа с семисегментником на ATtiny2313  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.11.2014, 13:01
Ответы с готовыми решениями:

Работа с семисегментником (PIC18F452, MPLab, ASM)
Ребят есть схема на MPLab и программа разделенная на подпрограммы, программа должна показывать...

Работа с портами ATtiny2313
Делаю вот что. #define F_CPU 8000000UL #include &lt;avr/io.h&gt; #include &lt;util/delay.h&gt; int...

Работа с EEPROM Attiny2313
Добрый вечер:) Есть программа кодового замка для Attiny2313. Пользователь вводит код, этот код...

Странная работа таймера на ATTiny2313
Добрый чего там у вас. Запускаю обычный таймер1 с предделителем 8. в прерывании переполнения...

Работа с семисегментником на Arduino UNO
Здравствуйте, пробемка проста, но что-то не нашел её решения в и-нете. Есть 4-х разрядный...

13
pyzhman
796 / 488 / 68
Регистрация: 15.05.2012
Сообщений: 2,775
12.11.2014, 19:49 2
Смысл мудрить с 595-ой? Есть же свободные ноги у мк.

Добавлено через 54 секунды
Ах да, 10 кнопок. А на схеме только 2. Гидэ остальные?
0
Greem_Jow
0 / 0 / 1
Регистрация: 04.04.2013
Сообщений: 23
13.11.2014, 03:15  [ТС] 3
Цитата Сообщение от pyzhman Посмотреть сообщение
Смысл мудрить с 595-ой? Есть же свободные ноги у мк.
я же говорю, что я новичек в этом деле =.=
как сделать регистр сдвига на МК я не знаю, поэтому поставил 595.

Цитата Сообщение от pyzhman Посмотреть сообщение
Ах да, 10 кнопок. А на схеме только 2. Гидэ остальные?
на счет остальных кнопок: решил сначала на 2-х попробовать, больше не добовлять, а не то запутаюсь еще.
Думал, если с 2-мя получится, добавлю остальные. Правда вот не очень вышло

Мжешь помочь с этой задачей?
0
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
13.11.2014, 08:14 4
Вам нужно отображать число нажатых кнопок, я правильно понял?
0
pyzhman
796 / 488 / 68
Регистрация: 15.05.2012
Сообщений: 2,775
13.11.2014, 09:07 5
А я так понял, что по-любому, если нажато хоть что-нибудь, высвечивать 0, и только если последовательно отжаты 9, то высветить 9.
0
Voland_
1694 / 1038 / 98
Регистрация: 04.01.2010
Сообщений: 3,520
13.11.2014, 11:59 6
Цитата Сообщение от Greem_Jow Посмотреть сообщение
if (PINB&((1<<PB6)^(1<<PB7)))
1) что вы хотите получить этим условием?
2) не используйте в программах на Си оператор goto. Во времена инквизиции за это давали линейкой по рукам! И только избранным профессионалам позволялось "иногда"...
0
Greem_Jow
0 / 0 / 1
Регистрация: 04.04.2013
Сообщений: 23
13.11.2014, 19:47  [ТС] 7
Цитата Сообщение от Витальич Посмотреть сообщение
Вам нужно отображать число нажатых кнопок, я правильно понял?
Нет. Когда зажата 1-я кнопка - загорается 9, зажимаем 2-ю, не отпуская 1-ю, - загорается 8. И так далее по убыванию. Код который написан, не совсем правельный. Там загорается 0 и 1.
Должно быть так: когда зажаты все кнопки - на индикаторе должен гореть 0. Отжимаем последовательно кнопки, число на индикаторе возрастает.
Цитата Сообщение от pyzhman Посмотреть сообщение
А я так понял, что по-любому, если нажато хоть что-нибудь, высвечивать 0, и только если последовательно отжаты 9, то высветить 9.
Все кнопки зажимаются последовательно.
Цитата Сообщение от Voland_ Посмотреть сообщение
if (PINB&((1<<PB6)^(1<<PB7)))
Этим условием я хотел сравнить, так сказать, "показания" на кнопках. Хотя что я тут могу объяснить.. оно же и так не правильное. Вообщем говоря, пытался как мог...
Цитата Сообщение от Voland_ Посмотреть сообщение
не используйте в программах на Си оператор goto.
Вопрос: почему? Это не правильно? Что тогда нужно использовать вместо него или неиспользовать его совсем?
0
Voland_
1694 / 1038 / 98
Регистрация: 04.01.2010
Сообщений: 3,520
13.11.2014, 21:36 8
Цитата Сообщение от Greem_Jow Посмотреть сообщение
Вопрос: почему?
ну, хотя бы потому, что даже в вашей программе вы четко показали, что логику алгоритма с использованием goto расшифровать не реально.
Например, ваш первый goto m1 абсолютно ничего не делает - программа как из одной, так и из другой ветки if () идет к строчке с меткой m1. А оператор goto m2 вообще находится за пределами бесконечного цикла.

Что касаемо табу на goto - построение программы на Сях, Паскале и еще ряде подобных языков исключает использование переходов. Если вы его используете - значит алгоритм построен неправильно, плохо читается и плохо поддается дальнейшему развитию. Да, существуют исключения, но такое встречается крайне редко.
1
Greem_Jow
0 / 0 / 1
Регистрация: 04.04.2013
Сообщений: 23
13.11.2014, 22:24  [ТС] 9
Немного покумекав над программой, в итоге НАКОНЕЦ-ТО у меня получилось сделать кнопки.
Вот, собственно, как это выглядит в протеусе (см. миниатюру).
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
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
#define F_CPU 10UL // 8 MHz
#include <avr/io.h>
#include <util/delay.h>
int main(void){
DDRB=0b00001111; // на выход
PORTB=0b11110000; // на PORTB все 0
PINB7==0;
PINB6==0;
PINB5==0;
PINB4==0;
DDRD=0b00111111; // на выход
PORTD=0b00000000; // на PORTB все 0
PIND1==0;
PIND2==0;
PIND3==0;
PIND4==0;
PIND5==0;
PIND6==0;
while(1){
m10:
if (PINB&(1<<PB7))//0
{
PORTB=0b00001001; //Q1.0
PORTB=0b00001000;
PORTB=0b00001001; //Q1.1
PORTB=0b00001000;
PORTB=0b00001011; //Q1.2
PORTB=0b00001000;
PORTB=0b00001011; //Q1.3
PORTB=0b00001000;
PORTB=0b00001011; //Q1.4
PORTB=0b00001000;
PORTB=0b00001011; //Q1.5
PORTB=0b00001000;
PORTB=0b00001011; //Q1.6 0
PORTB=0b00001000;
PORTB=0b00001011; //Q1.7
PORTB=0b00001100;
PORTB=0b00000000;
}
else {
PORTB=0b00000100; //Q1.0
goto m1;
}
}
while(1)
{
m1:
if (PINB&(1<<PB6))//1
{
PORTB=0b00001001; //Q1.0
PORTB=0b00001000;
PORTB=0b00001001; //Q1.1
PORTB=0b00001000;
PORTB=0b00001001; //Q1.2
PORTB=0b00001000;
PORTB=0b00001001; //Q1.3
PORTB=0b00001000;
PORTB=0b00001001; //Q1.4
PORTB=0b00001000;
PORTB=0b00001011; //Q1.5
PORTB=0b00001000;
PORTB=0b00001011; //Q1.6 1
PORTB=0b00001000;
PORTB=0b00001001; //Q1.7
PORTB=0b00001100;
PORTB=0b00000000;
}
else {
PORTB=0b00000100; //Q1.0
goto m2;
}
}
while(1){
m2:
if (PINB&(1<<PB5))//2
{
PORTB=0b00001001; //Q1.0
PORTB=0b00001000;
PORTB=0b00001011; //Q1.1
PORTB=0b00001000;
PORTB=0b00001001; //Q1.2
PORTB=0b00001000;
PORTB=0b00001011; //Q1.3
PORTB=0b00001000;
PORTB=0b00001011; //Q1.4
PORTB=0b00001000;
PORTB=0b00001001; //Q1.5
PORTB=0b00001000;
PORTB=0b00001011; //Q1.6 2
PORTB=0b00001000;
PORTB=0b00001011; //Q1.7
PORTB=0b00001100;
PORTB=0b00000000;
}
else {
PORTB=0b00000100; //Q1.0
goto m3;
}
}
while(1)
{
m3:
if (PINB&(1<<PB4))//3
{
PORTB=0b00001001; //Q1.0
PORTB=0b00001000;
PORTB=0b00001011; //Q1.1
PORTB=0b00001000;
PORTB=0b00001001; //Q1.2
PORTB=0b00001000;
PORTB=0b00001001; //Q1.3
PORTB=0b00001000;
PORTB=0b00001011; //Q1.4
PORTB=0b00001000;
PORTB=0b00001011; //Q1.5
PORTB=0b00001000;
PORTB=0b00001011; //Q1.6 3
PORTB=0b00001000;
PORTB=0b00001011; //Q1.7
PORTB=0b00001100;
PORTB=0b00000000;
}
else {
PORTB=0b00000100; //Q1.0
goto m4;
}
}
while(1){
m4:
if (PIND&(1<<PD1))//0
{
PORTB=0b00001001; //Q1.0 h
PORTB=0b00001000;
PORTB=0b00001011; //Q1.1 g
PORTB=0b00001000;
PORTB=0b00001011; //Q1.2 f
PORTB=0b00001000;
PORTB=0b00001001; //Q1.3 e
PORTB=0b00001000;
PORTB=0b00001001; //Q1.4 d
PORTB=0b00001000;
PORTB=0b00001011; //Q1.5 c
PORTB=0b00001000;
PORTB=0b00001011; //Q1.6 b 4
PORTB=0b00001000;
PORTB=0b00001001; //Q1.7 a
PORTB=0b00001100;
PORTB=0b00000000;
}
else {
PORTB=0b00000100; //Q1.0
goto m5;
}
}
while(1){
m5:
if (PIND&(1<<PD2))//0
{
PORTB=0b00001001; //Q1.0 h
PORTB=0b00001000;
PORTB=0b00001011; //Q1.1 g
PORTB=0b00001000;
PORTB=0b00001011; //Q1.2 f
PORTB=0b00001000;
PORTB=0b00001001; //Q1.3 e
PORTB=0b00001000;
PORTB=0b00001011; //Q1.4 d
PORTB=0b00001000;
PORTB=0b00001011; //Q1.5 c 5
PORTB=0b00001000;
PORTB=0b00001001; //Q1.6 b
PORTB=0b00001000;
PORTB=0b00001011; //Q1.7 a
PORTB=0b00001100;
PORTB=0b00000000;
}
else {
PORTB=0b00000100; //Q1.0
goto m6;
}
}
while(1){
m6:
if (PIND&(1<<PD3))//0
{
PORTB=0b00001001; //Q1.0 h
PORTB=0b00001000;
PORTB=0b00001011; //Q1.1 g
PORTB=0b00001000;
PORTB=0b00001011; //Q1.2 f
PORTB=0b00001000;
PORTB=0b00001011; //Q1.3 e
PORTB=0b00001000;
PORTB=0b00001011; //Q1.4 d 6
PORTB=0b00001000;
PORTB=0b00001011; //Q1.5 c
PORTB=0b00001000;
PORTB=0b00001001; //Q1.6 b
PORTB=0b00001000;
PORTB=0b00001011; //Q1.7 a
PORTB=0b00001100;
PORTB=0b00000000;
}
else {
PORTB=0b00000100; //Q1.0
goto m7;
}
}
while(1){
m7:
if (PIND&(1<<PD4))//0
{
PORTB=0b00001001; //Q1.0 h
PORTB=0b00001000;
PORTB=0b00001001; //Q1.1 g
PORTB=0b00001000;
PORTB=0b00001001; //Q1.2 f
PORTB=0b00001000;
PORTB=0b00001001; //Q1.3 e
PORTB=0b00001000;
PORTB=0b00001001; //Q1.4 d
PORTB=0b00001000;
PORTB=0b00001011; //Q1.5 c 7
PORTB=0b00001000;
PORTB=0b00001011; //Q1.6 b
PORTB=0b00001000;
PORTB=0b00001011; //Q1.7 a
PORTB=0b00001100;
PORTB=0b00000000;
}
else {
PORTB=0b00000100; //Q1.0
goto m8;
}
}
while(1){
m8:
if (PIND&(1<<PD5))//0
{
PORTB=0b00001001; //Q1.0 h
PORTB=0b00001000;
PORTB=0b00001011; //Q1.1 g
PORTB=0b00001000;
PORTB=0b00001011; //Q1.2 f
PORTB=0b00001000;
PORTB=0b00001011; //Q1.3 e
PORTB=0b00001000;
PORTB=0b00001011; //Q1.4 d
PORTB=0b00001000;
PORTB=0b00001011; //Q1.5 c
PORTB=0b00001000;
PORTB=0b00001011; //Q1.6 b 8
PORTB=0b00001000;
PORTB=0b00001011; //Q1.7 a
PORTB=0b00001100;
PORTB=0b00000000;
}
else {
PORTB=0b00000100; //Q1.0
goto m9;
}
}
while(1){
m9:
if (PIND&(1<<PD6))//0
{
PORTB=0b00001001; //Q1.0 h
PORTB=0b00001000;
PORTB=0b00001011; //Q1.1 g
PORTB=0b00001000;
PORTB=0b00001011; //Q1.2 f
PORTB=0b00001000;
PORTB=0b00001001; //Q1.3 e
PORTB=0b00001000;
PORTB=0b00001011; //Q1.4 d
PORTB=0b00001000;
PORTB=0b00001011; //Q1.5 c
PORTB=0b00001000;
PORTB=0b00001011; //Q1.6 b 9
PORTB=0b00001000;
PORTB=0b00001011; //Q1.7 a
PORTB=0b00001100;
PORTB=0b00000000;
}
else {
PORTB=0b00000100; //Q1.0
goto m10;
}
}
}
Подскажите, как сделать так, чтоб при нажатии 1-й кнопки загорался 0, отпускаем - горит 0, пока не нажмем следующую кнопку. Нажимаем - 0 переключается в 1. Короче говоря, программа должна запоминать последнее состояние и менять его на следующее, если будет нажата следующая кнопка.
0
Миниатюры
Работа с семисегментником на ATtiny2313  
ValeryS
Модератор
7483 / 5666 / 725
Регистрация: 14.02.2011
Сообщений: 19,368
Завершенные тесты: 1
13.11.2014, 22:26 10
Цитата Сообщение от Greem_Jow Посмотреть сообщение
Вопрос: почему? Это не правильно?
это приводит к программированию типа "спагетти"
все со всем завязано и изменение одной строчки приведет к правке всего кода, затруднено использование библиотек, это идеология ассемблера, и то уходит последнее время
Си это "процедурный"("функциональный") язык
всякая сущность оборачивается в свою функцию
и потом легче отлаживать, править
например поменять семисегментный индикатор на ЖКИ достаточно переписать одну функцию
еще преимущество
позволяет программировать "сверху-вниз"
например для твоей задачи
можно написать так
C
1
2
3
4
5
6
7
8
9
10
11
void Init();
void Display(unsigned char );
unsigned char GetButton();
int main()
{
Init();
while (1)
{
  Display(GetButton());
}
}
функции пока пустышки реализованы например так
C
1
2
3
4
5
6
7
8
9
10
11
void Init();
{
}
 
void Display(unsigned char a)
{
}
unsigned char GetButton()
{
return 5;
}
но программа уже работает
потом добавил тело в Init
проверил
потом в Display проверил
меняя в GetButton возвращаемое значение, удостоверился что кажет нормально
и после этого уже реализуешь GetButton
1
Voland_
1694 / 1038 / 98
Регистрация: 04.01.2010
Сообщений: 3,520
14.11.2014, 00:27 11
Цитата Сообщение от ValeryS Посмотреть сообщение
и после этого уже реализуешь GetButton
после этого взял, и разобрался как работает 595 регистр через SPI
0
Greem_Jow
0 / 0 / 1
Регистрация: 04.04.2013
Сообщений: 23
14.11.2014, 01:33  [ТС] 12
Цитата Сообщение от Voland_ Посмотреть сообщение
после этого взял, и разобрался как работает 595 регистр через SPI

все гениальное просто
0
Greem_Jow
0 / 0 / 1
Регистрация: 04.04.2013
Сообщений: 23
16.11.2014, 14:09  [ТС] 13
можешь показать, как это сделать?

Добавлено через 2 минуты
pyzhman, Подскажите, как сделать так, чтоб при нажатии 1-й кнопки загорался 0, отпускаем - горит 0, пока не нажмем следующую кнопку. Нажимаем - 0 переключается в 1. Короче говоря, программа должна запоминать последнее состояние и менять его на следующее, если будет нажата следующая кнопка.
0
pyzhman
796 / 488 / 68
Регистрация: 15.05.2012
Сообщений: 2,775
16.11.2014, 19:19 14
Можно и без запоминания. По образу и подобию дешифратора сделать - код на входе (нажатые/ненажатые кнопки) определяют состояние переменной, которая выводится на индикатор через 595-ую.
1
16.11.2014, 19:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2014, 19:19

Attiny2313
пытаюсь подключить тиньку2313 к програматору, но не могу найти SCK вход в даташите кто знает?

Attiny2313
Прочитал документацию, там 4 шим порта(вывода), но вот не понял дальше, пишут что 1 какой-то для...

Proteus + Attiny2313
Здравствуйте в протеусе собрал небольшую схему: программу в контроллер добавил вот эту:...


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

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

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