Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
AZVR
0 / 0 / 0
Регистрация: 12.01.2018
Сообщений: 2
1

Attiny 2313 простая задачка с индикацией

12.01.2018, 15:34. Просмотров 386. Ответов 2

Задача состоит вот в чем:
На основе микроконтроллера Atmel Atiny2313 необходимо разработать микропроцессорное устройство, имеющее 4 кнопки, два 7-мисегментных индикатора.
Кнопка 1 задает направление слева направо, кнопка 2- справа налево, кнопка 3 запуск индикации верхних вертикальных сегментов обоих индикаторов по порядку циклически в обратном направлении, 4 - остановка индикации.

У меня получилось вот что:
Нажимая первую кнопку, нолик вырисавывается только на первом индикаторе. Если потом нажать любую другую клавишу, ничего не произойдет.
Проверить другие кнопки удается только после СТОП И ЗАПУСКа еще раз. Также и на второй клавише нолик вырисовывается только уже на втором индикаторе.
Опять же СТОП и ЗАПУСК. При проверке третьей кнопки загораются оба индикатора одновременно (сначала левые верхние сегменты, потом правые) и не гаснут.
С четвертой кнопкой совсем не понятно, так как после загорания сегменты гаснут(при нажатии 1 или 2 кнопки), когда нажата кнопка 3 - при нажатии 4й кнопки индикация не прекращается.
(Разрабатываю в AVR Studio 5.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
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
#define F_CPU8000000 
#include <avr/io.h>
#include <util/delay.h>
 
void preset (){  //порт B: B0-B7 как выход(сегменты индикатора)
 
DDRB = 0xFF; //0b11111111 PORTB OUT
PORTB = 0x00; //0b00000000; PORTB OFF
 
//порт D: D0-D3 как вход(кнопки) и D4-D5 как выход(выбор индикаторов)
DDRD=0x00;
PORTD |=0xFF; // подключение внутренних подтягивающих резисторов
}
 
int main(void)
{
   
 
 while(1)
    {
        if ((PIND & 0x01)==0x01)// если нажата кнопка 1 бегунок по часовой
        {PORTA = 0x02;//1 инд
            PORTB = 0x08;
            _delay_ms(200);
            PORTB = 0x10;
            _delay_ms(200);
            PORTB = 0x20;
            _delay_ms(200);
            PORTB = 0x01;
            _delay_ms(200);
            PORTB = 0x02;
            _delay_ms(200);
            PORTB = 0x04;
            _delay_ms(200);
        PORTA = 0x01;// 2 инд
            PORTB = 0x08;
            _delay_ms(200);
            PORTB = 0x10;
            _delay_ms(200);
            PORTB = 0x20;
            _delay_ms(200);
            PORTB = 0x01;
            _delay_ms(200);
            PORTB = 0x02;
            _delay_ms(200);
            PORTB = 0x04;
            _delay_ms(200);
        }
                
            
    if ((PIND & 0x02)==0x02) // если нажата кнопка 2 бегунок против часовой
    {
        PORTA = 0x01;// 2 инд
            PORTB = 0x04;
            _delay_ms(200);
            PORTB = 0x02;
            _delay_ms(200);
            PORTB = 0x01;
            _delay_ms(200);
            PORTB = 0x20;
            _delay_ms(200);
            PORTB = 0x10;
            _delay_ms(200);
            PORTB = 0x08;
            _delay_ms(200);
                
        PORTA = 0x02;//1 инд
            PORTB = 0x04;
            _delay_ms(200);
            PORTB = 0x02;
            _delay_ms(200);
            PORTB = 0x01;
            _delay_ms(200);
            PORTB = 0x20;
            _delay_ms(200);
            PORTB = 0x10;
            _delay_ms(200);
            PORTB = 0x08;
            _delay_ms(200);
    }
 
    
    if ((PIND & 0x04)==0x04) // при нажатии к3 циклическое включение верхних вертикальных сегментов
    {
        PORTD = 0x20;//1 инд
            PORTB = 0x20;
            _delay_ms(200);
            PORTB = 0x02;
            _delay_ms(200);
            
        PORTD = 0x10;// 2 инд
            PORTB = 0x20;
            _delay_ms(200);
            PORTB = 0x02;       
            _delay_ms(200);
        
    }
    
    
    if ((PIND & 0x08)==0x08)
     {
     PORTB=0x00; 
     PORTA=0x00; // при нажатии кнопки 4 обнулении индикации
 }
    } 
return 0;
}


И схема в Proteus 8:

Attiny 2313 простая задачка с индикацией
0
Вложения
Тип файла: txt Коддд.txt (2.0 Кб, 1 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.01.2018, 15:34
Ответы с готовыми решениями:

ATtiny 2313
Добрый день, возникли трудности с работой с МК. Это мой первый практический опыт в паянии и работе...

AtTiny 2313, прерывания
Доброго времени суток. Решил освоить программирование МК и сразу же столкнулся с проблемой, которую...

Термостат на ATTiny 2313
Собираю термостат в Протеусе на Attiny 2313. Имеется код на ассемблере (5.txt) но компилятор...

Attiny 2313 не прошивается
Attiny 2313 пытаюсь прошить через arduino nano но ни как не могу подключил тут на nano есть...

Работа с UART (Си, ATtiny 2313)
Дорогие формчане и знатаки по микроконтролёрам я Новичок в этом деле. У меня есть вопрос, есть...

2
pyzhman
796 / 488 / 68
Регистрация: 15.05.2012
Сообщений: 2,775
12.01.2018, 17:14 2
Цитата Сообщение от AZVR Посмотреть сообщение
слева направо
Что слева направо? Что справа налево?
Цитата Сообщение от AZVR Посмотреть сообщение
по порядку циклически в обратном направлении
Что по порядку? В обратном какому направлении?

R12 и R13 убрать.
Цитата Сообщение от AZVR Посмотреть сообщение
Если потом нажать любую
Перед нажатием нужно подождать 6 сек по вашему алгоритму.
C
1
2
D4-D5 как выход(выбор индикаторов)
DDRD=0x00;
С какого перепуга?

и т.д.
0
AZVR
0 / 0 / 0
Регистрация: 12.01.2018
Сообщений: 2
13.01.2018, 16:33  [ТС] 3
Согласна с вашими замечаниями. Как отредактировать описание не знаю.
Слева направо: имеется в виду, что должны загораться сегменты индикаторов как бы ноликом по часовой стрелке сначала первый, а потом второй.
Я опечаталась, прошу простить. Не в обратном, а в выбранном направлении, у меня это слева направо. То есть загорается сначала верхний левый сегмент первого индикатора, потом правый верхний его же, потом верхний левый второго и правый верхний второго.
Действительно, с какого перепуга?! У меня для этих целей порт А.
Я решила уже, все получилось. Решение загружу попозже, когда защищу работу.

Кстати, пробовала удалять резисторы 12 и 13, просто сигнал не проходит.

Может кто-нибудь подскажет, в каком редакторе рисуют принципиальные схемы таких устройств? нужно оформить по ескд
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.01.2018, 16:33

Использование таймера в ATTiny 2313
#include &lt;avr/io.h&gt; #include &lt;avr/interrupt.h&gt; unsigned char rab; ISR(TIMER1_COMPA_vect) { ...

ATtiny 2313. Контроль освещения
Требуется написать программу на Assembler или на С++ Программа не для рабочего микропроцессора,...

Attiny 2313 замерзает внутренний тактовый
Объект: Attiny 2313 20SU. Имеются несколько одинаковых девайсов, заточенных на внутренний такт, 8...


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

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

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