Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
1 / 1 / 1
Регистрация: 19.10.2025
Сообщений: 186

Atmel Studio 7. Установка Avrdude. Первый проект

30.05.2026, 09:48. Показов 5371. Ответов 129

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток !
На руках есть контроллер ( судя по исполнению использовался как термометр ). На базе БП на 5 вольт , Atmega 16 ( если быть точным Atmega16 16AU0606J ) , кварц на 8 MHz . На отдельной плате 7 сегментный индикатор и три кнопки. Есть разъём для подключения программатора .
Нужно сваять часы - таймер для электроплиты .
Поставил Atmel Studio 7, привязал WinAVR, но сразу столкнулся с проблемой при создании проекта . Не знаю что прописать в аргументах . По примеру (который расписан для Atmega 168) выглядит так:

Windows Batch file
1
avrdude -c usbasp -p atmega168 -U lfuse:w:0x26:m -U flash:w:$(ProjectDir)Debug\$(TargetName).hex:i
Но у меня мега 16 ( нашёл похожий вариант , но для мега 16А ) :

Windows Batch file
1
avrdude -p usbasp -U atmega16 -U lfuse:w:0xE1:m -U -U hfuse:w:0x99:m flash:w:$(ProjectDir)Debug\$(TargetName).hex:i
Только не знаю правильно это или нет . С фьюзами как то шутить не очень хочется ( есть печальный опыт ) .
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.05.2026, 09:48
Ответы с готовыми решениями:

Atmel Studio,первый опыт
Решил порвать с Arduino-й ...... надоела своей поверхностностью и легкомысленностью. Остановился на...

Atmel Studio 6. Ошибки при попытке собрать проект.
Собственно, имеется два файла: DS1307_lib.h и DS1307_lib.cpp DS1307_lib.h #ifdef DS1307_H...

Как в Atmel Studio 7 открыть старый проект?
Может и не старый, а просто в другом редакторе каком делалось: ...

129
1 / 1 / 1
Регистрация: 19.10.2025
Сообщений: 186
13.06.2026, 13:19  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Artem_Proger Посмотреть сообщение
При условии что на моём Микрочип и на вашем Атмел этот момент одинаковый
Всё там , где и у Вас .
Теперь пытаюсь разобраться в ошибках при компиляции . Которые естественно имеются .
0
Эксперт .NET
 Аватар для Rius
13683 / 7863 / 1702
Регистрация: 25.05.2015
Сообщений: 23,877
Записей в блоге: 14
13.06.2026, 16:41
Цитата Сообщение от Dushevny Посмотреть сообщение
У современных эта схема (Power-on-reset//POR, Brown-out-reset/BOR) встроена в контроллер и снаружи не требуется. А те, кто их продолжает ставить сейчас, по прошествии 20 лет - просто не понимают их предназначения.
Наоборот. Те, кто их не ставят, не работают в области, где за их отсутствие прилетает по шапке. Несмотря на наличие встроенных схем в самих МК.
У домашних самоделкиных раздолье, ставь что хочешь или не ставь, разводи плату как хошь, используй любую библиотеку, и ничего за это не будет.
0
1 / 1 / 1
Регистрация: 12.03.2019
Сообщений: 89
13.06.2026, 17:34
Цитата Сообщение от Rius Посмотреть сообщение
Наоборот. Те, кто их не ставят, не работают в области, где за их отсутствие прилетает по шапке.
Вы абсолютно правы

Добавлено через 1 минуту
Цитата Сообщение от sergey_67 Посмотреть сообщение
Теперь пытаюсь разобраться в ошибках при компиляции .
Вы всегда можете их нам показать и мы поможем, подскажем
0
1 / 1 / 1
Регистрация: 19.10.2025
Сообщений: 186
13.06.2026, 19:37  [ТС]
Цитата Сообщение от Artem_Proger Посмотреть сообщение
Вы всегда можете их нам показать и мы поможем, подскажем
Да видимо самому не разобраться будет .
main.c
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
// Использование библиотеки для работы с семисегментным индикатором
 
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "display.h"
 
volatile unsigned char second, minute, hour, level;
 
// Обработчик прерывания по совпадению Т1
 
ISR(TIMER1_COMPA_vect)
{
        minute++;                   // Увеличиваем минуты
        if(minute == 60)
        {
            minute = 0;
            hour++;                  // Увеличиваем часы
            if(hour == 24) hour = 0;
        }
    }
    
    set_time(hour,minute,second); // Выводим на дисплей
}
 
int main(void)
{
    hour = 12;  // Начальная установка времени
    minute = 0;
    second = 0;
 
    
    // Порты ввода/вывода
 
 
    DDRA |= (0 << PA6)|(0 << PA7);
    PORTA |= (1 << PA6)|(1 << PA7);
 
    // Настройка Т1
 
    TCCR1B |= (1 << WGM12)|(1 << CS12); // 8MHz/256/(1+31249)=1Hz
    OCR1A = 31249;
    
    sei(); // Глобально разрешам прерывания
    
    set_brightness(80); // Начальная установка яркости дисплея
    display_init(); // Инициализация дисплея
 
    // Выводим бегущую строку "test display"
 
    shift_in('t');
    _delay_ms(100);
    shift_in('E');
    _delay_ms(100);
    shift_in('s');
    _delay_ms(100);
    shift_in('t');
    _delay_ms(100);
    shift_in(' ');
    _delay_ms(100);
    shift_in('d');
    _delay_ms(100);
    shift_in('i');
    _delay_ms(100);
    shift_in('s');
    _delay_ms(100);
    shift_in('p');
    _delay_ms(100);
    shift_in('L');
    _delay_ms(100);
    shift_in('a');
    _delay_ms(100);
    shift_in('y');
    _delay_ms(100);
    shift_in(' ');
    _delay_ms(100);
    shift_in(' ');
    _delay_ms(100);
    shift_in(' ');
    _delay_ms(100);
    clear_screen();
    _delay_ms(100);
    
    TIMSK |= (1 << OCIE1A); // Разрешаем прерывание по совпадению Т1
    
    while(1)
    {
        unsigned char i, dr;
 
        // Если кнопка Часы+ и Минуты+ нажаты увеличиваем яркость
 
        if((PINA&(1 << PA7)) == 0 && (PINA&(1 << PA6)) == 0)
        {
            dr = 0;
 
            // Программный антидребезг контактов
 
            for(i = 0; i < 10; i++)
            {
                _delay_ms(5);
                if((PINA&(1 << PA7)) == 0 && (PINA&(1 << PA6)) == 0)
                dr++;
            }
            if(dr > 5)
            {
                if(level != 99)
                level++; // Увеличиваем яркость
                else level = 0;
                set_brightness(level);
            }
        }
        
        // Если кнопка Часы+ нажата увеличиваем часы
 
        if((PINA&(1 << PA7)) == 0 && PINA&(1 << PA6))
        {
            dr=0;
 
            // Программный антидребезг контактов
 
            for(i = 0; i < 10; i++)
            {
                _delay_ms(5);
                if((PINA&(1 << PA7)) == 0)
                dr++;
            }
            if(dr > 5)
            {
                if(hour != 23) hour++; // Увеличиваем часы
                else hour = 0;
                set_time(hour,minute,second); // Выводим на дисплей
            }
        }
        
        // Если кнопка Минуты+ нажата увеличиваем минуты
 
        if((PINA&(1 << PA6))==0 && PINA&(1 << PA7))
        {
            dr=0;
 
            // Программный антидребезг контактов
 
            for(i = 0; i < 10; i++)
            {
                _delay_ms(5);
                if((PINA&(1 << PA6)) == 0)
                dr++;
            }
            if (dr > 5)
            {
                if(minute != 59) minute++; // Увеличиваем минуты
                else minute = 0;
                set_time(hour,minute,second); // Выводим на дисплей
            }
        }
        
    }
}
display.h
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
#ifndef DISPLAY_H_
 
#define DISPLAY_H_
 
 
 
#include <avr/io.h>
 
 
 
// data mode: determines how c parameter to shift_in and set_char_at is interpreted
 
#define ASCII 0    // interpreted as ascii
 
#define SEGMENTS 1 // interpreted as segments to turn on/off
 
 
 
void display_init(void); // Инициализация дисплея
 
uint8_t set_brightness(uint8_t b); // Установка яркости
 
void shift_in(char c); // Сдвиг символа
 
void set_char_at(char c, uint8_t offset); // Вывод символа в оределенную позицию
 
void set_segments_at(uint8_t segments, uint8_t offset); // Вывод сегмента в определенную позицию
 
void shift_in_segments(uint8_t segments); // Сдвиг сегмента
 
void set_number(uint16_t num); // Вывод четырехразрядной переменной
 
void clear_screen(void); // Очистить дисплей
 
void set_time(uint8_t hour, uint8_t min, uint8_t sec); // Вывод времени
 
 
// Вывод значений поразрядно, вывод точки в позицию 1..4, 0 - неактивна
void set_number_4(uint8_t num_0, uint8_t num_1, uint8_t num_2, uint8_t num_3, uint8_t offset);
 
 
// Segment A: PC0
 
#define A_DDR  DDRC
#define A_PORT PORTC
#define A_BIT  PC0
 
#define A   0
 
// Segment B: PC1
 
#define B_DDR DDRC
 
#define B_PORT PORTC
 
#define B_BIT  PC1
 
#define B   1
 
// Segment C: PC2
 
#define C_DDR DDRC
 
#define C_PORT PORTC
#define C_BIT  PC2
 
#define C   2
 
// Segment D: PC3
 
#define D_DDR DDRC
 
#define D_PORT PORTC
#define D_BIT  PC3
 
#define D   3
 
// Segment E: PC4
 
#define E_DDR DDRC
 
#define E_PORT PORTC
 
#define E_BIT  PC4
 
#define E   4
 
// Segment F: PC5
 
#define F_DDR DDRC
#define F_PORT PORTC
 
#define F_BIT  PC5
 
#define F   5
 
// Segment G: PC6
 
#define G_DDR DDRC
#define G_PORT PORTC
 
#define G_BIT  PC6
 
#define G   6
 
// Segment DP: PC7
 
#define DP_DDR DDRC
#define DP_PORT PORTC
 
#define DP_BIT  PC7
 
#define DP  7
 
 
 
// Digit 1: PB0
 
#define DIGIT1_DDR DDRB
 
#define DIGIT1_PORT PORTB
 
#define DIGIT1_BIT  0
 
// Digit 2: PB1
 
#define DIGIT2_DDR DDRB
 
#define DIGIT2_PORT PORTB
 
#define DIGIT2_BIT  1
 
// Digit 3: PB2
 
#define DIGIT3_DDR DDRB
 
#define DIGIT3_PORT PORTB
 
#define DIGIT3_BIT  2
 
// Digit 4: PB3
 
#define DIGIT4_DDR DDRB
 
#define DIGIT4_PORT PORTB
 
#define DIGIT4_BIT  3
 
 
 
 
#endif // DISPLAY_H_
display.c
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
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
409
410
411
412
413
414
415
416
417
418
419
420
#include <avr/io.h>
#include <avr/interrupt.h>
#include "display.h"
 
// Выбираем тип подключения дисплея OA или OK
// common anode
#define SET_DIGIT sbi
#define CLEAR_DIGIT cbi
#define SET_SEGMENT cbi
#define CLEAR_SEGMENT sbi
 
// common cathode
//#define SET_DIGIT cbi
//#define CLEAR_DIGIT sbi
//#define SET_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 segment_data[4]; // Segment data
 
// dots [bit 0~3]
uint8_t dots = 0;
 
uint16_t brightness = 80;   // Read from EEPROM on startup
 
void display(uint8_t pos, uint8_t digit);
void clearDisplay(void);
 
void display_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 segments 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 screen
    clear_screen();
 
    sei();  // Enable interrupts
 
    // Inititalize timer for multiplexing
    TCCR0 |= (1 << CS01); // Set Prescaler to clk/8 : 1 click = 1us. CS01=1 
    TIMSK |= (1 << TOIE0); // Enable Overflow Interrupt Enable
    TCNT0 = 0; // Initialize counter
}
 
uint8_t set_brightness(uint8_t b)
{
    if (b > 100) b = 100;
    b = 100 - b;
 
    brightness = b + 5;
    return b;
}
 
void shift_in(char c)
{
    data[0] = data[1];
    data[1] = data[2];
    data[2] = data[3];
    data[3] = c;
 
    segment_data[0] = segment_data[1];
    segment_data[1] = segment_data[2];
    segment_data[2] = segment_data[3];
    segment_data[3] = 0;
}
 
void set_char_at(char c, uint8_t offset)
{
    data[offset] = c;
}
 
void set_segments_at(uint8_t segments, uint8_t offset)
{
    segment_data[offset] = segments;
    data[offset] = 0b10000000; // set upper bit to indicate that segment data should be used for display
}
 
void shift_in_segments(uint8_t segments)
{
    data[0] = data[1];
    data[1] = data[2];
    data[2] = data[3];
    data[3] = 0b10000000; // set upper bit to indicate that segment data should be used for display
 
    segment_data[0] = segment_data[1];
    segment_data[1] = segment_data[2];
    segment_data[2] = segment_data[3];
    segment_data[3] = segments;
}
 
// Вывод четырехразрядной переменной  
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;
}
// Вывод значений поразрядно, вывод точки в позицию 1..4, 0 - неактивна
void set_number_4(uint8_t num_0, uint8_t num_1, uint8_t num_2, uint8_t num_3, uint8_t offset)
{
    data[3] = num_3;
    data[2] = num_2;
    data[1] = num_1;
    data[0] = num_0;
    sbi(dots, offset);
}
// Очистка дисплея
void clear_screen(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;
 
// display multiplexing routine: run once every 5us
void display_multiplex(void)
{
    if (multiplex_counter == 0)
        display(0, 1);
    else if (multiplex_counter == 1)
        display(1, 2);
    else if (multiplex_counter == 2)
        display(2, 3);
    else if (multiplex_counter == 3)
        display(3, 4);
    else if (multiplex_counter == 4)
        clearDisplay();
 
    multiplex_counter++;
 
    // brightness setting: 5~100
    if (multiplex_counter == brightness) multiplex_counter = 0;
}
 
// run once every 1 us
ISR(TIMER0_OVF_vect)
{
    display_multiplex();    
    TCNT0 = 0xFF - 10; // Overflow again after 10 ticks = 10 us
}
 
uint8_t calculate_segments(uint8_t character)
{
    uint8_t segments = 0;
 
    switch (character)
    {
        case 0:
        case '0':
        case 'O':
            segments = (1<<A)|(1<<B)|(1<<C)|(1<<D)|(1<<E)|(1<<F);
            break;
        case 1:
        case '1':
        case 'l':
            segments = (1<<B)|(1<<C);
            break;
        case 2:
        case '2':
            segments = (1<<A)|(1<<B)|(1<<D)|(1<<E)|(1<<G);
            break;
        case 3:
        case '3':
            segments = (1<<A)|(1<<B)|(1<<C)|(1<<D)|(1<<G);
            break;
        case 4:
        case '4':
            segments = (1<<B)|(1<<C)|(1<<F)|(1<<G);
            break;
        case 5:
        case '5':
        case 'S':
        case 's':
            segments = (1<<A)|(1<<C)|(1<<D)|(1<<F)|(1<<G);
            break;
        case 6:
        case '6':
            segments = (1<<A)|(1<<C)|(1<<D)|(1<<E)|(1<<F)|(1<<G);
            break;
        case 7:
        case '7':
            segments = (1<<A)|(1<<B)|(1<<C);
            break;
        case 8:
        case '8':
            segments = (1<<A)|(1<<B)|(1<<C)|(1<<D)|(1<<E)|(1<<F)|(1<<G);
            break;
        case 9:
        case '9':
        case 'g':
            segments = (1<<A)|(1<<B)|(1<<C)|(1<<D)|(1<<F)|(1<<G);
            break;
        case 10:
        case 'A':
        case 'a':
            segments = (1<<A)|(1<<B)|(1<<C)|(1<<E)|(1<<F)|(1<<G);
            break;
        case 11:
        case 'B':
        case 'b':
            segments = (1<<C)|(1<<D)|(1<<E)|(1<<F)|(1<<G);
            break;
        case 12:
        case 'C':
            segments = (1<<A)|(1<<D)|(1<<E)|(1<<F);
            break;
        case 'c':
            segments = (1<<D)|(1<<E)|(1<<G);
            break;
        case 13:
        case 'D':
        case 'd':
            segments = (1<<B)|(1<<C)|(1<<D)|(1<<E)|(1<<G);
            break;
        case 14:
        case 'E':
            segments = (1<<A)|(1<<D)|(1<<E)|(1<<F)|(1<<G);
            break;
        case 'e':
            segments = (1<<A)|(1<<B)|(1<<D)|(1<<E)|(1<<F)|(1<<G);
            break;
        case 15:
        case 'F':
        case 'f':
            segments = (1<<A)|(1<<E)|(1<<F)|(1<<G);
            break;
        case 'G':
            segments = (1<<A)|(1<<C)|(1<<D)|(1<<E)|(1<<F);
            break;
        case 'H':
            segments = (1<<B)|(1<<C)|(1<<E)|(1<<F)|(1<<G);
            break;
        case 'h':
            segments = (1<<C)|(1<<E)|(1<<F)|(1<<G);
            break;
        case 'I':
        case 'i':
            segments = (1<<B)|(1<<C);
            break;
        case 'J':
        case 'j':
            segments = (1<<B)|(1<<C)|(1<<D)|(1<<E);
            break;
        case 'L':
            segments = (1<<D)|(1<<E)|(1<<F);
            break;
        case 'M':
        case 'm':
            segments = (1<<A)|(1<<C)|(1<<E)|(1<<G);
            break;
        case 'N':
        case 'n':
            segments = (1<<C)|(1<<E)|(1<<G);
            break;
        case 'o':
            segments = (1<<C)|(1<<D)|(1<<E)|(1<<G);
            break;
        case 'P':
        case 'p':
            segments = (1<<A)|(1<<B)|(1<<E)|(1<<F)|(1<<G);
            break;
        case 'Q':
        case 'q':
            segments = (1<<A)|(1<<B)|(1<<C)|(1<<F)|(1<<G);
            break;
        case 'R':
        case 'r':
            segments = (1<<E)|(1<<G);
            break;
        case 'T':
        case 't':
            segments = (1<<D)|(1<<E)|(1<<F)|(1<<G);
            break;
        case 'U':
            segments = (1<<B)|(1<<C)|(1<<D)|(1<<E)|(1<<F);
            break;
        case 'u':
            segments = (1<<C)|(1<<D)|(1<<E);
            break;
        case 'V':
        case 'v':
            segments = (1<<C)|(1<<D)|(1<<E);
            break;
        case 'W':
        case 'w':
            segments = (1<<A)|(1<<C)|(1<<D)|(1<<E);
            break;
        case 'Y':
        case 'y':
            segments = (1<<B)|(1<<C)|(1<<D)|(1<<F)|(1<<G);
            break;
        case '-':
            segments = (1<<G);
            break;
        case '"':
            segments = (1<<B)|(1<<F);
            break;
        case 0x27:  // "'"
            segments = (1<<B);
            break;
        case '_':
            segments = (1<<D);
            break;
        case '.':
            segments = (1<<DP);
            break;
        case ' ':
        default:
            segments = 0;
            break;
    }
 
    return segments;
}
 
// Output number to digit 0, 1, 2 or 3
void display(uint8_t pos, uint8_t digit)
{   
    clearDisplay();
 
    //  Turn on selected digit
    switch (digit)
    {
        case 1:
            SET_DIGIT(DIGIT1_PORT, DIGIT1_BIT);
            break;
        case 2:
            SET_DIGIT(DIGIT2_PORT, DIGIT2_BIT);
            break;
        case 3:
            SET_DIGIT(DIGIT3_PORT, DIGIT3_BIT);
            break;  
        case 4:
            SET_DIGIT(DIGIT4_PORT, DIGIT4_BIT);
            break;
    }
 
    uint8_t segments = 0;
 
    if (data[pos] & 0b10000000)
        segments = segment_data[pos];
    else
        segments = calculate_segments(data[pos]);
    
    // set dot
    if (dots & (1<<digit))
        segments |= (1<<DP);
 
    // This allows segments do be on different ports
    if (segments & _BV(7)) SET_SEGMENT(DP_PORT, DP_BIT);
    else CLEAR_SEGMENT(DP_PORT, DP_BIT);
 
    if (segments & _BV(6)) SET_SEGMENT(G_PORT, G_BIT);
    else CLEAR_SEGMENT(G_PORT, G_BIT);
 
    if (segments & _BV(5)) SET_SEGMENT(F_PORT, F_BIT);
    else CLEAR_SEGMENT(F_PORT, F_BIT);
 
    if (segments & _BV(4)) SET_SEGMENT(E_PORT, E_BIT);
    else CLEAR_SEGMENT(E_PORT, E_BIT);
 
    if (segments & _BV(3)) SET_SEGMENT(D_PORT, D_BIT);
    else CLEAR_SEGMENT(D_PORT, D_BIT);
 
    if (segments & _BV(2)) SET_SEGMENT(C_PORT, C_BIT);
    else CLEAR_SEGMENT(C_PORT, C_BIT);
            
    if (segments & _BV(1)) SET_SEGMENT(B_PORT, B_BIT);
    else CLEAR_SEGMENT(B_PORT, B_BIT);
 
    if (segments & _BV(0)) SET_SEGMENT(A_PORT, A_BIT);
    else CLEAR_SEGMENT(A_PORT, A_BIT);
}
 
void clearDisplay(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 segments 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);
}
Ошибка компиляции:
C
1
2
3
4
Severity    Code    Description Project File    Line
Error       expected identifier or '(' before '}' token Проект 2  C:\Users\SERGEY\Pictures\Для электрплиты\Проект 2\Проект 2\main.c 24
Error       conflicting types for 'set_time'    Проект 2  C:\Users\SERGEY\Pictures\Для электрплиты\Проект 2\Проект 2\main.c 23
Error       recipe for target 'main.o' failed   Проект 2  C:\Users\SERGEY\Pictures\Для электрплиты\Проект 2\Проект 2\Debug\Makefile 88
0
 Аватар для COKPOWEHEU
4148 / 2726 / 433
Регистрация: 09.09.2017
Сообщений: 12,079
13.06.2026, 19:59
Цитата Сообщение от sergey_67 Посмотреть сообщение
C:\Users\SERGEY\Pictures\Для электрплиты\Проект 2\Проект 2\main.c
Опять пробелы в путях
Цитата Сообщение от sergey_67 Посмотреть сообщение
main.c 24
На 21 строке уже есть закрывающая скобка. Где парная к ней открывающая? Такое ощущение, что там раньше было условие или что-то вроде того. Условие вы удалили, а закрывающую скобку нет.
Остальные ошибки следуют из этой.
0
1 / 1 / 1
Регистрация: 12.03.2019
Сообщений: 89
13.06.2026, 20:50
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Опять пробелы в путях
sergey_67, в подобных программах проект и весь путь до него рекомендуется, чтобы были только английские буквы и без пробелов, последние обычно заменяют на "_", например так: "Project_2". В данном случае будет и так работать, но далеко не во всех программах вам может так повезти.

Добавлено через 3 минуты
Цитата Сообщение от sergey_67 Посмотреть сообщение
expected identifier or '(' before '}' token
В main.c на 21 строке удалите скобку "}"
0
1 / 1 / 1
Регистрация: 19.10.2025
Сообщений: 186
13.06.2026, 21:30  [ТС]
Цитата Сообщение от Artem_Proger Посмотреть сообщение
в подобных программах проект и весь путь до него рекомендуется, чтобы были только английские буквы и без пробелов, последние обычно заменяют на "_", например так: "Project_2". В данном случае будет и так работать, но далеко не во всех программах вам может так повезти.
Ну тогда всё по новой . Простое переименование ни к чему не приводит .
0
1 / 1 / 1
Регистрация: 12.03.2019
Сообщений: 89
13.06.2026, 21:39
Цитата Сообщение от sergey_67 Посмотреть сообщение
переименование ни к чему не приводит .
То есть? Просто лишнюю скобку из кода уберите и скомпилируйте, сейчас не обязательно переименовывать проект
0
244 / 106 / 22
Регистрация: 29.02.2016
Сообщений: 533
13.06.2026, 21:42
Цитата Сообщение от sergey_67 Посмотреть сообщение
Ну тогда всё по новой . Простое переименование ни к чему не приводит .
Закройте студию. Просто переименуте всю цепочку директорий на латиницу без пробелов. И откройте этот проект из диалога открытия в студии.
0
1 / 1 / 1
Регистрация: 19.10.2025
Сообщений: 186
13.06.2026, 22:19  [ТС]
Цитата Сообщение от stele Посмотреть сообщение
И откройте этот проект из диалога открытия в студии.
Сделал всё по новой . Так запоминается лучше .
Скомпилировал , закинул hex в протеус ( естественно схему упростил ) . И заметил , что нет разделительной точки между часами и минутами . Обычно точка секунды показывает .
0
244 / 106 / 22
Регистрация: 29.02.2016
Сообщений: 533
13.06.2026, 22:39
Цитата Сообщение от sergey_67 Посмотреть сообщение
Обычно точка секунды показывает .
А у вас сколько секунд в отображаемом времени?

Добавлено через 4 минуты
sergey_67, И когда исправите прерывание таймера на счёт секунд, вынесите из него вызов функции вывода на дисплей. Обработка прерывания должна быть максимально быстрой. Посчитали, установили флаг изменения времени. В основном цикле вывели. Так будет красившее и правильнее.
0
1507 / 524 / 76
Регистрация: 22.09.2023
Сообщений: 1,656
14.06.2026, 00:29
Цитата Сообщение от Rius Посмотреть сообщение
Те, кто их не ставят, не работают в области, где за их отсутствие прилетает по шапке.
Я не буду с вами спорить. "Надевайте презерватив, смазывайте подсолнечным маслом, надевайте второй, смазывайте йодом, сверху бинтуйте, пропитывайте эпоксидкой и никаких половых связей!".
Надеюсь, питание вы всегда резервируете и в каждом термометре контроллер дублируете, причем они исполняют программы, делающие одно и то же, но написанные на разных языках?
0
Эксперт .NET
 Аватар для Rius
13683 / 7863 / 1702
Регистрация: 25.05.2015
Сообщений: 23,877
Записей в блоге: 14
14.06.2026, 07:22
А не надо со мной спорить.
Всего лишь не надо нести типичную чушь едиков - "не надо мне - не надо никому":
Цитата Сообщение от Dushevny Посмотреть сообщение
У современных эта схема (Power-on-reset//POR, Brown-out-reset/BOR) встроена в контроллер и снаружи не требуется. А те, кто их продолжает ставить сейчас, по прошествии 20 лет - просто не понимают их предназначения.
У каждой области свои требования (или их отсутствие).
0
1507 / 524 / 76
Регистрация: 22.09.2023
Сообщений: 1,656
14.06.2026, 12:43
Цитата Сообщение от Rius Посмотреть сообщение
Всего лишь не надо нести типичную чушь едиков - "не надо мне - не надо никому":
Все-таки отвечу. Никому не требуется чесать левой ногой правое ухо. Читайте по губам: в устройства, в который действительно требуется дублирование внутреннего монитора питания внешним, AVR не ставят. В устройствах на AVR дублирование внутреннего монитора питания не требуется. Никогда. Никому. Нигде. Потому что внутренний делает то же самое и даже лучше - потому что он контролирует напряжение не где-то рядом на плате, а в тех точках, из которых непосредственно берется питание ядра и установка внешнего - бесполезная трата денег и площади платы. Если в устройстве, которому требуется дублирование внешнего монитора питания оказался AVR - к квалификации разработчика такого устройства еще больше вопросов.
0
1 / 1 / 1
Регистрация: 19.10.2025
Сообщений: 186
14.06.2026, 17:53  [ТС]
Заказал 5шт ATMEGA16-16AU ATMEGA16-16AUR думаю , что один то камень будет рабочий .
Ждать только долго ( видимо озон заказывает в Китае ). Есть время порыться в интернете , может и найду то что мне надо . Сам я такую программу не напишу .Нужны базовые знания , а у меня их нет . Впрочем попрактикуюсь с Atmel Studio и Proteus .
0
1 / 1 / 1
Регистрация: 19.10.2025
Сообщений: 186
22.06.2026, 16:38  [ТС]
Переустановил винду ( материнку менял ) . Установил Atmel Studio 7 и не могу создать проект . Выскакивает ошибка .
Вот что не так ?
Миниатюры
Atmel Studio 7. Установка Avrdude. Первый проект  
0
2163 / 1241 / 511
Регистрация: 11.10.2018
Сообщений: 6,358
22.06.2026, 17:01
По стандартному пути поставили? Администраторские права выдали программе?

Добавлено через 2 минуты
И какая Windows?

Добавлено через 9 минут
Путь к проекту должен быть без русских букв.
0
1 / 1 / 1
Регистрация: 19.10.2025
Сообщений: 186
22.06.2026, 17:13  [ТС]
Цитата Сообщение от FFPowerMan Посмотреть сообщение
По стандартному пути поставили? Администраторские права выдали программе?
Стоит в Program Files (x86) . Права админа вроде как есть .
Цитата Сообщение от FFPowerMan Посмотреть сообщение
И какая Windows?
Windows 7 64bit максимальная
Цитата Сообщение от FFPowerMan Посмотреть сообщение
Путь к проекту должен быть без русских букв.
Русские буквы и пробелы отсутствуют .
0
244 / 106 / 22
Регистрация: 29.02.2016
Сообщений: 533
22.06.2026, 17:16
sergey_67, если память не изменяет, там надо ставить зависимости для студии, их ставили?
0
2163 / 1241 / 511
Регистрация: 11.10.2018
Сообщений: 6,358
22.06.2026, 17:29
Зависимости не надо ставить. Новый проект не через мастер создается. Просто щелкаете "New Project" на первоначальном экране и появляется окно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.06.2026, 17:29

Atmel Studio консольный проект?
В Visual studio можно создать проект &quot;Консольное приложение&quot;, которое позволяет после ввода...

Почему AVR Studio 4, а не Atmel Studio 6?
По какой причине большинство специалистов по AVR микроконтроллерам в основном используют AVR Studyo...

Atmega64: первый раз МК считывается AVRDUDE, нажимаю второй раз - уже ошибка
Здравствуйте, форумчане. Я новичок в AVR. Прошу помочь с МК Atmega64. А именно, подключил всё,...

Как в AVR Studio назначить горячую клавишу для avrdude?
Сорри за нубский вопрос, но я что-то в студии не нашёл подобного. Хочется чтоб по горячей клавише...

Atmel Studio 6.1. AVR240, работа с EEPROM
перехожу с Си на асм прошу помочь разобраться: код работы с EEPROM взял из апноты 240 Атмела...


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

Или воспользуйтесь поиском по форуму:
120
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru