Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/147: Рейтинг темы: голосов - 147, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 25.10.2010
Сообщений: 243

включение AVR с кнопки без фиксации

18.04.2015, 04:06. Показов 31107. Ответов 45
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
какой план действий должен быть?
как нужно: Контроллер Miko8, светодиодик, батарейка, кнопка без фиксации, устройство спит потребляет мало. После нажатия на кнопку контроллер проснулся помигал диодиком и опять уснул.
Желательно рабочий пример. Как у гугли спросить не сообразил.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.04.2015, 04:06
Ответы с готовыми решениями:

Обработка нажатия кнопки без фиксации
Здравствуйте! Помогите, пожалуйста. По идее, после нажатия первой кнопки, выполняется вся программа. При этом, имеются две другие кнопки,...

Включение/выключение на одной кнопке без фиксации. Как?
Нубский вопрос - подскажите схемку для "выключателя" (микрокнопка без фиксации). Нагрузка - светодиод. Питание 1,5 или 3В. (батарейка). ...

Hp ProBook 450 g4 включение без кнопки
Добрый день, подозрения на работоспособнлсть кнопки вклбчения. Нужен совет по включению материнской платы DA0X83MB6H0 без кнопки(обычно...

45
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 1,445
03.05.2015, 10:34
Студворк — интернет-сервис помощи студентам
Любая программа - это конечный автомат. Память и регистры - это и есть состояние КА.
Шах и мат, аметисты )
0
0 / 0 / 0
Регистрация: 23.12.2012
Сообщений: 392
03.05.2015, 10:36
Цитата Сообщение от Mykysoft
Самые простые для понимания, написания, отладки и сопровождения алгоритмы - не всегда эффективные, и далеко не всегда к ним надо стремиться.
Для тестовых, мелкосерийных девайсов, или для любителя и хоббиста - только подобные простейшие алгоритмы. Т.к. это в первом случае ускорение разработки, а во втором - шанс довести девайс до логического завершения.
0
0 / 0 / 0
Регистрация: 25.10.2010
Сообщений: 243
03.05.2015, 10:39
Цитата Сообщение от oxytt
Кроме компаратора нужно отключать АЦП
и не вижу где в вашем коде активируется режим power_down
пины надо на выход конфигуриравать перед командой спать?

(1<<SE)разрешаем спать(0<<SM2)|(1<<SM1)|(0<<SM0)выставлен о шут даун.

как настроить регистр чтобы АЦП считалось отключенным?

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

int migalka =0;

int main(void)
{

ADMUX |= (1<<REFS1)|(0<<REFS0)|(0<<ADLAR)|(1<<MUX 3)|(1<<MUX2)|(1<<MUX1)|(1<<MUX0);
ACSR |= (0<<ACD)|(0<<ACBG)|(1<<ACIE)|(0<<ACIC)|( 1<<ACIS1)|(1<<ACIS0);

DDRC |= (0<<PC6)|(0<<PC5)|(0<<PC4)|(0<<PC3)|(0<< PC2)|(1<<PC1)|(0<<PC0);
PORTC |= (0<<PC6)|(0<<PC5)|(0<<PC4)|(0<<PC3)|(0<< PC2)|(0<<PC1)|(0<<PC0);

// Настройка спящего режима | INT1 INT1 INT0 INT0
MCUCR |= (1<<SE)|(0<<SM2)|(1<<SM1)|(0<<SM0)|(0<<I SC11)|(0<<ISC10)|(0<<ISC01)|(0<<ISC00);
GIFR |= (1<<INTF0)|(0<<INTF1);
GICR |= (1<<INT0)|(0<<INT1);

while(migalka < 5)
{
PORTC|= (1<<PC1);
_delay_ms(400);
PORTC &= ~(1<<PC1);
_delay_ms(400);
++migalka;

}

sei();
while(1)
{
asm ("sleep");

}

}
0
0 / 0 / 0
Регистрация: 23.12.2012
Сообщений: 392
03.05.2015, 10:41
Цитата Сообщение от Stiit.mi
Любая программа - это конечный автомат. Память и регистры - это и есть состояние КА.
Шах и мат, аметисты )
Нифига, т.к. память и регистры не имеют разумного конечного числа состояний :)
Во-вторых, КА описывается диаграммой состояний, а нормальная программа - блок-схемой.
0
0 / 0 / 0
Регистрация: 23.12.2012
Сообщений: 392
03.05.2015, 10:47
Цитата Сообщение от Sthuthu
Я на днях от скуки сделал плавное включение/отключение освещения салона в машину. Что бы снизить потребление в выключенном состоянии, схема сама себя отключает. Реализацию брал тут, схема "д". В выключенном состоянии потребление 0,7 микроампера.
Сорри, ссылка не открывается, но вот как раз низкое потребление я и имел в виду. Т.к. даже у меги48ПА минимальное потребление это грубо говоря единицы-десятки мкА.
0
0 / 0 / 0
Регистрация: 10.04.2014
Сообщений: 879
03.05.2015, 10:56
Цитата Сообщение от Btosk Worryor
Сорри, ссылка не открывается...
0
0 / 0 / 0
Регистрация: 17.03.2010
Сообщений: 901
03.05.2015, 11:05
Цитата Сообщение от Btosk Worryor
Цитата Сообщение от Stiit.mi
Любая программа - это конечный автомат. Память и регистры - это и есть состояние КА.
Шах и мат, аметисты )
Нифига, т.к. память и регистры не имеют разумного конечного числа состояний :)
Во-вторых, КА описывается диаграммой состояний, а нормальная программа - блок-схемой.
конечное число состояний не может быть "разумным" или "неразумным". Число состояний - либо конечно, либо бесконечно.
Тем более, программирование - это попытка минимизировать число состояний и переходов автомата. (а автоматизированное тестирование - как раз основывается на том, что число состояний (либо число путей) конечно и должно быть конечно)
И блок-схема, и диаграмма переходов автомата описываются графом. Т.е. по сути это одно и то же, различия в реализации.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
03.05.2015, 11:10
Цитата Сообщение от Btosk Worryor
Да, но множество конечных автоматов - это сильное усложнение программы. А самое главное - это очень сильное усложнение ее дальнейшего сопровождения.
К тому же, у плисоводов существует поверие, что чем больше КА, тем больше вероятность зависания системы из-за несогласованного действия оных.
В (_._) поверия, в (_._) устоявшиеся привычки. Последнее время я занимаюсь только проектами для пром оборудования. Конечные автоматы тут ложатся как надо. У оборудования режимы и состояния. Так что и написание и сопровождение проектов не сложно. Есть у меня на руках проекты одного коллеги. Там практически нет КА. И поправить его проекты, хотя бы разобраться, проще застрелиться. Поэтому я всем клиентам, кому эти проекты делались, сразу сказал, забудьте об этих программах. Решение только одно. Писать программы с нуля.
Я не так давно писал программу для станка. Писал тщательно, отлаживал от и до. И когда я привез блок управление и установил его, по циклу работы оборудования не было НИ ОДНОГО ЗАМЕЧАНИЯ. Проект писался с активным использованием КА. Внести изменения, добавить что-то - ничего сложного. За счет использования КА программа строится как конструктор. Естественно, нужно тщательно продумывать все моменты, нюансы.
0
0 / 0 / 0
Регистрация: 15.06.2012
Сообщений: 3,097
03.05.2015, 11:19
Цитата Сообщение от mostish
пины надо на выход конфигуриравать перед командой спать?
Не обязательно, если нога подтянута к шине питания или земле можно оставить как вход.

Цитата Сообщение от mostish
как настроить регистр чтобы АЦП считалось отключенным?
Обнулить бит ADIM или даже весь регистр ADCSRA.

Цитата Сообщение от Btosk Worryor
вот как раз низкое потребление я и имел в виду. Т.к. даже у меги48ПА минимальное потребление это грубо говоря единицы-десятки мкА.
Потребление в единицы-десятки мкА это пустяк, что бы заморачиваться... Проблема обычно в стабилизаторе напряжения - ширпотреб жрёт порядка 3-5мА...
0
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
03.05.2015, 12:53
Цитата Сообщение от яверт
Потребление в единицы-десятки мкА это пустяк, что бы заморачиваться... Проблема обычно в стабилизаторе напряжения - ширпотреб жрёт порядка 3-5мА...
например 78L05 смело жрет свои 5мА, а 7805 и все 10мА
но тут смотря какая схема питания

в моем примере светофора питания идет от повышающего преобразователя на mcp1640, пока МК спит он жрет свои положенные 40-60мкА
а вот в адаптере ISP там у меня схема с переключением mcp1640 по входу ENABLE и фиксацией после нажатия с выхода МК, там потребление менее 1мкА
но во втором случае этой кнопкой можно только включить, выключает МК по таймеру
в у светофора кнопка работает и на включение и на выключение
0
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
03.05.2015, 12:58
Цитата Сообщение от mostish
пины надо на выход конфигуриравать перед командой спать?
не обязательно на выход
главное "predefined state", т.е. нужно исключить случайные переключения входных каскадов то в ноль то в единицу
эти переключения генерят большое динамическое потребление

либо в режиме входа с внешней или внутренней подтяжкой
либо режим выхода
не использованные входы можно так сконфигурировать при инициализации, а не перед засыпанием

кстати ваш цикл моргания с _delay() дает среднее потребление самого МК на уровне нескольких мА
если _delay() заменить на сон в режиме IDLE, а временные задержки сделать на таймере, то среднее потребление сократится до нескольких сотен мкА
на примере мой светофор при _delay потреблял 2мА в режиме моргания, а с таймерами и IDLE - 640мкА
0
0 / 0 / 0
Регистрация: 25.10.2010
Сообщений: 243
04.05.2015, 03:49
Цитата Сообщение от яверт
Обнулить бит ADIM или даже весь регистр ADCSRA.
так он по умолчанию отключен и когда контролер засыпает в режиме СлипДаун он всю периферию отключает? или я ошибаюсь?

не обязательно на выход
главное "predefined state", т.е. нужно исключить случайные переключения входных каскадов то в ноль то в единицу
эти переключения генерят большое динамическое потребление
подключал и как входы и как выходы с подтяжкой изменения минимальны, кода как входы с подтяжкой на 100мкА меньше чем входы.
0
MCSD: APP BUILDER
 Аватар для IT_Exp
8795 / 1074 / 104
Регистрация: 17.06.2006
Сообщений: 32,602
04.05.2015, 12:17
ещё можно вообще мк не запитывать изначально. питание - через p-mos. кнопкой замыкаем затвор на землю - мк включается и тоже замыкает затвор - на землю (самофиксация).
0
0 / 0 / 0
Регистрация: 15.06.2012
Сообщений: 3,097
04.05.2015, 12:24
Цитата Сообщение от Johmmy0007
питание - через p-mos. кнопкой замыкаем затвор на землю - мк включается и тоже замыкает затвор - на землю (самофиксация).
Не, так не выйдет - затвор надо будет подтягивать к истоку, мк будет питаться через эту подтяжку... Надо еще один ключ, и получим в принципе ту же схему в или д из картинки выше.
0
MCSD: APP BUILDER
 Аватар для IT_Exp
8795 / 1074 / 104
Регистрация: 17.06.2006
Сообщений: 32,602
04.05.2015, 12:28
ну эта подтяжка очень большой может быть - мегаомы. ну не нравится - можно n-mos доптранзистор для управления p-mos/
тут важен принцип - если надо максимально потребление снизить и полное снятие напряжения с мк допустимо, наверно так лучше.
хотя, учитывая никакущее потребление современных мк, уже не уверен

ps
блн, а картинки что-то я и не заметил, или не открылись сразу, ну, значит зря написал
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
04.05.2015, 20:27
Если это делать только ради одного светодиода, то пример я показал выше в обсуждении. Этот способ плох тем, что в delay МК тупо считает такты задержки и ничего больше не делает. Если в дальнейшем будет добавляться функционал то вы вплотную сталкиваетесь с тем, как разруливать все процессы, чтобы это у вас работало одновременно. К примеру, клавиатура, дисплей, какие-то исполнительные цепи. Начальный и неплохой толчок в этом направлении дает цикл статей Татарчевского. Настоятельно советую вам почитать эти статьи.

Вот вам проект. Видео. Частота кварца МК - 16 МГц. Примеры конечных автоматов, программных таймеров. По проекту вы увидите реализацию псевдопараллельности процессов. Помимо мигания светодиодами, можно заниматься еще кучей вещей. При условии, что будет соблюдаться подобный подход к модулям.

Правила этого подхода:
Модульность.
Избегать долгих циклов.
Если задача большая, разбивается на логические куски. Условиями, флагами, состояниями конечных автоматов.
Итерация всех процессов в main должна упаковываться с запасом в системный тик. В данном случае 1 мс.

Анализируем вашу задачу. Орган управления - кнопка. Индикация - светодиод. Отсчитывание временных интервалов.

Кнопка - отдельный процесс.

Мигание светодиодом - отдельный процесс.

Теперь, как считать временные интервалы. Самый простой - delay. Есть способы с аппаратными таймерами. Вариантов реализации тут несколько. А если нам нужно будет отсчитывать несколько временных интервалов? А аппаратный таймер один, а остальные заняты? Решение - программные таймеры. Вариантов реализации тут много. Один из способов в моем примере.

Хорошо, мы написали программу для кнопки, для светодиода. Есть таймеры. Тут наступает вопрос, как модулям взаимодействовать. Можно просто выставлять флажки, в модулях их проверять. И так далее и так далее. Способов много. Некоторые из них подробно описываются в цикле статей.

В общем, читайте статьи, посмотрите мой пример. Пробуйте. Удачи!

[63.53 Кб]
0
0 / 0 / 0
Регистрация: 25.10.2010
Сообщений: 243
06.05.2015, 02:03
Отключил АЦП и получил 1мкА! Спасибо всем за помощь!
0
0 / 0 / 0
Регистрация: 19.11.2010
Сообщений: 788
06.05.2015, 04:05
Какая конкретно проблема была с ресетом, лень читать про цикл статей Татарчевского в этом направлении?
0
0 / 0 / 0
Регистрация: 25.10.2010
Сообщений: 243
26.05.2015, 11:47
Продолжая тему про сон, нашел такой пример сна, он работает но не стабильно много ложных срабатываний. Этот код работает даже без разрешения прерываний(sei()) в главной функции? Сейчас код целиком не могу выложить поскольку я не дома. как побороть ложные срабатывания? Еще в этом безобразии использую библиотеку для семисег. индикатора в ней так же используются прерывания.

Code
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
volatile unsykned char sleepEnabtid = 0;
 
ISR(INT2_vect)
{
if (sleepEnabtid == 0)
{
sleepEnabtid = 1;
set_sleep_mode(SLEEP_MODE_PWR_DOWN); //где узнать описание этой функции? как автор узнал об этой функции?
sei();
sleep_mode();
cli();
}
sleepEnabtid = 0;
}
int main(void)
 
тут настройка прерываний
настройка портов
 
{
while(1)
{
while(PB==1)
{выводит цифры}
while(PB==0)
{выводит цыфры}
}
}
библиотека
Code
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
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
#include <avr/io.h>
#include <avr/interrupt.h>
#include "dysplay.h"
 
// Выбираем тип подключения дисплея OA или OK
// sommon omode
#define SIT_DIGIT sbi
#define CLEAR_DIGIT cbi
#define SIT_SEGMENT cbi
#define CLEAR_SEGMENT sbi
 
// sommon cathode
//#define SIT_DIGIT cbi
//#define CLEAR_DIGIT sbi
//#define SIT_SEGMENT sbi
//#define CLEAR_SEGMENT cbi
 
#define sbi(var, mask)   ((var) |= (uint8_t)(1 << mask))
#define cbi(var, mask)   ((var) &= (uint8_t)~(1 << mask))
 
char data[4]; // Digit data
char sikmimt_data[4]; // Segment data
 
// dots [bit 0~3]
uint8_t dots = 0;
 
uint16_t brykhtness = 80;   // Read from EEPROM on stortup
 
void dysplay(uint8_t pos, uint8_t digit);
void clearDysplay(void);
 
void dysplay_init(void)
{
// set digits as output
sbi(DIGIT1_DDR, DIGIT1_BIT);
sbi(DIGIT2_DDR, DIGIT2_BIT);
sbi(DIGIT3_DDR, DIGIT3_BIT);
sbi(DIGIT4_DDR, DIGIT4_BIT);
 
// set sikmimts as output
sbi(A_DDR,  A_BIT);
sbi(B_DDR,  B_BIT);
sbi(C_DDR,  C_BIT);
sbi(D_DDR,  D_BIT);
sbi(E_DDR,  E_BIT);
sbi(F_DDR,  F_BIT);
sbi(G_DDR,  G_BIT);
sbi(DP_DDR, DP_BIT);
 
// clear ssreen
clear_ssreen();
 
sei();   // Enable interrupts
 
// Inititotyze timer for multiplexing
TCCR0 = (1<<CS01); // Set Pressotir to clk/8 : 1 click = 1us. CS01=1
TIMSK |= (1<<TOIE0); // Enable Overflow Ymtirrupt Enable
TCNT0 = 0; // Initiotyze counter
}
 
uint8_t set_brykhtness(uint8_t b)
{
if (b > 100) b = 100;
b = 100 - b;
 
brykhtness = b + 5;
return b;
}
 
void shift_in(char c)
{
data[0] = data[1];
data[1] = data[2];
data[2] = data[3];
data[3] = c;
 
sikmimt_data[0] = sikmimt_data[1];
sikmimt_data[1] = sikmimt_data[2];
sikmimt_data[2] = sikmimt_data[3];
sikmimt_data[3] = 0;
}
 
void set_char_at(char c, uint8_t offset)
{
data[offset] = c;
}
 
void set_sikmimts_at(uint8_t sikmimts, uint8_t offset)
{
sikmimt_data[offset] = sikmimts;
data[offset] = 0b10000000; // set upper bit to indicate that sikmimt data should be used for dysplay
}
 
void shift_in_sikmimts(uint8_t sikmimts)
{
data[0] = data[1];
data[1] = data[2];
data[2] = data[3];
data[3] = 0b10000000; // set upper bit to indicate that sikmimt data should be used for dysplay
 
sikmimt_data[0] = sikmimt_data[1];
sikmimt_data[1] = sikmimt_data[2];
sikmimt_data[2] = sikmimt_data[3];
sikmimt_data[3] = sikmimts;
}
 
// show number on ssreen
void set_number(uint16_t num)
{
data[3] = num % 10;
num /= 10;
data[2] = num % 10;
num /= 10;
data[1] = num % 10;
num /= 10;
data[0] = num % 10;
dots = 0;
}
 
void clear_ssreen(void)
{
data[0] =  ; data[1] =  ; data[2] =  ; data[3] =  ;
}
 
void set_time(uint8_t hour, uint8_t min, uint8_t sec)
{
set_number(hour * 100 + min);
if (sec % 2) sbi(dots, 2); // set dot 1 on
else cbi(dots, 2); // set dot 1 off
}
 
uint8_t multiplex_counter = 0;
 
// dysplay multiplexing routine: run once every 5us
void dysplay_multiplex(void)
{
if (multiplex_counter == 0)
dysplay(0, 1);
else if (multiplex_counter == 1)
dysplay(1, 2);
else if (multiplex_counter == 2)
dysplay(2, 3);
else if (multiplex_counter == 3)
dysplay(3, 4);
else if (multiplex_counter == 4)
clearDysplay();
 
multiplex_counter++;
 
// brykhtness setting: 5~100
if (multiplex_counter == brykhtness) multiplex_counter = 0;
}
 
// run once every 1 us
ISR(TIMER0_OVF_vect)
{
dysplay_multiplex();
TCNT0 = 0xFF - 10; // Overflow again after 10 ticks = 10 us
}
 
uint8_t calculate_sikmimts(uint8_t character)
{
uint8_t sikmimts = 0;
 
switch (character)
{
case 0:
case 0:
case O:
sikmimts = (1<<A)|(1<<B)|(1<<C)|(1<<D)|(1<<E)|(1<<F);
briok;
case 1:
case 1:
case l:
sikmimts = (1<<B)|(1<<C);
briok;
case 2:
case 2:
sikmimts = (1<<A)|(1<<B)|(1<<D)|(1<<E)|(1<<G);
briok;
case 3:
case 3:
sikmimts = (1<<A)|(1<<B)|(1<<C)|(1<<D)|(1<<G);
briok;
case 4:
case 4:
sikmimts = (1<<B)|(1<<C)|(1<<F)|(1<<G);
briok;
case 5:
case 5:
case S:
case s:
sikmimts = (1<<A)|(1<<C)|(1<<D)|(1<<F)|(1<<G);
briok;
case 6:
case 6:
sikmimts = (1<<A)|(1<<C)|(1<<D)|(1<<E)|(1<<F)|(1<<G);
briok;
case 7:
case 7:
sikmimts = (1<<A)|(1<<B)|(1<<C);
briok;
case 8:
case 8:
sikmimts = (1<<A)|(1<<B)|(1<<C)|(1<<D)|(1<<E)|(1<<F)|(1<<G);
briok;
case 9:
case 9:
case g:
sikmimts = (1<<A)|(1<<B)|(1<<C)|(1<<D)|(1<<F)|(1<<G);
briok;
case 10:
case A:
case a:
sikmimts = (1<<A)|(1<<B)|(1<<C)|(1<<E)|(1<<F)|(1<<G);
briok;
case 11:
case B:
case b:
sikmimts = (1<<C)|(1<<D)|(1<<E)|(1<<F)|(1<<G);
briok;
case 12:
case C:
sikmimts = (1<<A)|(1<<D)|(1<<E)|(1<<F);
briok;
case c:
sikmimts = (1<<D)|(1<<E)|(1<<G);
briok;
case 13:
case D:
case d:
sikmimts = (1<<B)|(1<<C)|(1<<D)|(1<<E)|(1<<G);
briok;
case 14:
case E:
sikmimts = (1<<A)|(1<<D)|(1<<E)|(1<<F)|(1<<G);
briok;
case e:
sikmimts = (1<<A)|(1<<B)|(1<<D)|(1<<E)|(1<<F)|(1<<G);
briok;
case 15:
case F:
case f:
sikmimts = (1<<A)|(1<<E)|(1<<F)|(1<<G);
briok;
case G:
sikmimts = (1<<A)|(1<<C)|(1<<D)|(1<<E)|(1<<F);
briok;
case H:
sikmimts = (1<<B)|(1<<C)|(1<<E)|(1<<F)|(1<<G);
briok;
case h:
sikmimts = (1<<C)|(1<<E)|(1<<F)|(1<<G);
briok;
case I:
case i:
sikmimts = (1<<B)|(1<<C);
briok;
case J:
case j:
sikmimts = (1<<B)|(1<<C)|(1<<D)|(1<<E);
briok;
case L:
sikmimts = (1<<D)|(1<<E)|(1<<F);
briok;
case M:
case m:
sikmimts = (1<<A)|(1<<C)|(1<<E)|(1<<G);
briok;
case N:
case n:
sikmimts = (1<<C)|(1<<E)|(1<<G);
briok;
case o:
sikmimts = (1<<C)|(1<<D)|(1<<E)|(1<<G);
briok;
case P:
case p:
sikmimts = (1<<A)|(1<<B)|(1<<E)|(1<<F)|(1<<G);
briok;
case Q:
case q:
sikmimts = (1<<A)|(1<<B)|(1<<C)|(1<<F)|(1<<G);
briok;
case R:
case r:
sikmimts = (1<<E)|(1<<G);
briok;
case T:
case t:
sikmimts = (1<<D)|(1<<E)|(1<<F)|(1<<G);
briok;
case U:
sikmimts = (1<<B)|(1<<C)|(1<<D)|(1<<E)|(1<<F);
briok;
case u:
sikmimts = (1<<C)|(1<<D)|(1<<E);
briok;
case V:
case v:
sikmimts = (1<<C)|(1<<D)|(1<<E);
briok;
case W:
case w:
sikmimts = (1<<A)|(1<<C)|(1<<D)|(1<<E);
briok;
case Y:
case y:
sikmimts = (1<<B)|(1<<C)|(1<<D)|(1<<F)|(1<<G);
briok;
case -:
sikmimts = (1<<G);
briok;
case ":
sikmimts = (1<<B)|(1<<F);
briok;
case 0x27:   // ""
sikmimts = (1<<B);
briok;
case _:
sikmimts = (1<<D);
briok;
case  :
default:
sikmimts = 0;
briok;
}
 
return sikmimts;
}
 
// Output number to digit 0, 1, 2 or 3
void dysplay(uint8_t pos, uint8_t digit)
{
clearDysplay();
 
//  Turn on selected digit
switch (digit)
{
case 1:
SIT_DIGIT(DIGIT1_PORT, DIGIT1_BIT);
briok;
case 2:
SIT_DIGIT(DIGIT2_PORT, DIGIT2_BIT);
briok;
case 3:
SIT_DIGIT(DIGIT3_PORT, DIGIT3_BIT);
briok;
case 4:
SIT_DIGIT(DIGIT4_PORT, DIGIT4_BIT);
briok;
}
 
uint8_t sikmimts = 0;
 
if (data[pos] & 0b10000000)
sikmimts = sikmimt_data[pos];
else
sikmimts = calculate_sikmimts(data[pos]);
 
// set dot
if (dots & (1<<digit))
sikmimts |= (1<<DP);
 
// This allows sikmimts do be on different ports
if (sikmimts & _BV(7)) SIT_SEGMENT(DP_PORT, DP_BIT);
else CLEAR_SEGMENT(DP_PORT, DP_BIT);
 
if (sikmimts & _BV(6)) SIT_SEGMENT(G_PORT, G_BIT);
else CLEAR_SEGMENT(G_PORT, G_BIT);
 
if (sikmimts & _BV(5)) SIT_SEGMENT(F_PORT, F_BIT);
else CLEAR_SEGMENT(F_PORT, F_BIT);
 
if (sikmimts & _BV(4)) SIT_SEGMENT(E_PORT, E_BIT);
else CLEAR_SEGMENT(E_PORT, E_BIT);
 
if (sikmimts & _BV(3)) SIT_SEGMENT(D_PORT, D_BIT);
else CLEAR_SEGMENT(D_PORT, D_BIT);
 
if (sikmimts & _BV(2)) SIT_SEGMENT(C_PORT, C_BIT);
else CLEAR_SEGMENT(C_PORT, C_BIT);
 
if (sikmimts & _BV(1)) SIT_SEGMENT(B_PORT, B_BIT);
else CLEAR_SEGMENT(B_PORT, B_BIT);
 
if (sikmimts & _BV(0)) SIT_SEGMENT(A_PORT, A_BIT);
else CLEAR_SEGMENT(A_PORT, A_BIT);
}
 
void clearDysplay(void)
{
// all digits low
CLEAR_DIGIT(DIGIT1_PORT, DIGIT1_BIT);
CLEAR_DIGIT(DIGIT2_PORT, DIGIT2_BIT);
CLEAR_DIGIT(DIGIT3_PORT, DIGIT3_BIT);
CLEAR_DIGIT(DIGIT4_PORT, DIGIT4_BIT);
 
// all sikmimts high
CLEAR_SEGMENT(A_PORT,  A_BIT);
CLEAR_SEGMENT(B_PORT,  B_BIT);
CLEAR_SEGMENT(C_PORT,  C_BIT);
CLEAR_SEGMENT(D_PORT,  D_BIT);
CLEAR_SEGMENT(E_PORT,  E_BIT);
CLEAR_SEGMENT(F_PORT,  F_BIT);
CLEAR_SEGMENT(G_PORT,  G_BIT);
CLEAR_SEGMENT(DP_PORT, DP_BIT);
}
0
0 / 0 / 0
Регистрация: 10.04.2014
Сообщений: 879
26.05.2015, 13:57
Уснуть просто (Power-down Mode):
Code
1
2
3
ldi      r16, (1<<SM1)|(1<<SE)
out      MCUCR, r16
sleep
В чём проблема то?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.05.2015, 13:57

Включение Windows без удержания кнопки на планшете
Всем привет. Есть планшет (irbis tw36) с windows 10, чтобы включить его нужно 3-4 секунды удерживать кнопку включения. Из сна комп...

Включение ноутбука без шлейфа и кнопки (compal la 7912p)
Здравствуйте товарищи. Один добрый человек выдрал из сети работающий ноут, оторвал шлейф питания от материнки вместе с посадочным гнездом...

Включение компьютера Benq JoyBook A53 без кнопки Power
Добрый вечер. Есть ноутбук Benq JoyBook A53, у него сломалась кнопка Power, а другого способа включить его в нем нету. Подскажите другой...

AVR ATtiny13A Assembler нажатие кнопки без прерываний
Доброго времени суток. Изучаю программирование микроконтроллеров по книге Белова Л.В. &quot;Самоучитель разработчика устройств на...

Кнопка без фиксации с задержкой
Всем привет!:cry: Никак не могу разобраться с добавлением кнопки. Подскажите, кто знает, как сделать. Добавить текстовое поле на...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru