Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/42: Рейтинг темы: голосов - 42, средняя оценка - 4.57
SENDEJER
5 / 5 / 3
Регистрация: 22.05.2013
Сообщений: 387
1

ATtiny2313. Управление светодиодом

04.10.2013, 22:24. Просмотров 8002. Ответов 7
Метки нет (Все метки)

Пожалуйста помогите доделать программу.

нужно, что бы " Разработать устройство управления одним светодиодным индикатором при помощи одной кнопки. При каждом нажатии кнопки светодиод должен поочередно включаться и мигать. А при повторном нажатии конпки отключаться"

вот мой код программы
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
#define F_CPU 4000000UL // задаем тактовую частоту (кварца) нужно для работы задержки 
//(Attiny2313 есть встроенный тактовый генератор(4/8 МГц/128 кГц).)
 
#include <avr/io.h> //присоединяет к основному тексту программы стандартный текст описания для МК 2313
 
#include <util/delay.h> //Библиотека обработки задержек delay
 
void main (void) // функция не возвращает никакого значения 
//(main- набор команд настройки системы + заготовка главного цикла программы)
 
{       
    PORTB=0xFF;  // инициализация порта В
    
    DDRB=0xFF;   // на вход присваевается FF=11111111
    
    DDRD=0x00;   // на выход 00000000
    
                while(1) //бесконечный цикл (выполняется пока "условие истинно")
 
 
{ ДО ЭТОГО МОМЕНТА ВСЕ РАБОТАЕТ НО ПОСЛЕ НЕГО НЕТ }
 
 
    {
             
             PORTB=PIND;  //присваивание регистра порт В значение регистра порта Д
             
             while (PORTB0==1)  // инициализация порта В)
             {}
             if (PINB0==1)
             {PINB0=0; } 
             else
             {PORTB0=1;}     
             while (PIND0==0) {}
    };
}
НУЖНО ЧЕРЕЗ ЦИКЛ СДЕЛАТЬ ЗАДЕРЖКУ. но никак не выходит.

Добавлено через 18 минут
ПРОГРАММА НА "С"
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.10.2013, 22:24
Ответы с готовыми решениями:

ATmega16. Управление светодиодом
День добрый. Имеется задача-организация управления светодиодом по средствам...

Управление светодиодом от кнопки (VMLab)
Здравствуйте. С программе VMLab нужно смоделировать мигание светодиода с...

Управление светодиодом одной кнопкой
Всем привет, прошу проверить код на правильность, у меня AVR ругается, но по...

Atmega16 управление светодиодом по нажатию двух кнопок
Помогите написать программу. По нажатию кнопки sw1, подключенной к выводу pd2,...

Управление RGB светодиодом - разные Vf у разных цветов.
Уважаемые формучане, оцените реализацию задачи! Нужно рулить одним...

7
Kve
11 / 11 / 1
Регистрация: 21.05.2013
Сообщений: 70
04.10.2013, 23:07 2
Попробуй так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int count = 0;                                    //счетчик количества нажатий кнопки
while (1)
{
if (!(PIND & 0b00000001)            //Проверяет ножку PD0, на наличие сигнала 0
{
delay_ms(10);                            //задержка, для предотвращения дребезга контактов
if (!(PIND & 0b00000001){         
      switch (count)                     
      {
         case 0:   PORTB &= ~0b00000001;         //сбрасывает PB в 0
                      count++;
                      break;
         case 1:  PORTB |= 0b00000001;               //устанавливает в РВ 1
                     count = 0;
                     break;
      }
   }
}
}
1.Вот как-то так. С задержкой поиграйся, можешь меньше поставить, дребезгов, длительностью больше милисекунды не должно быть.

2.По поводу синтаксиса могу быть неточным, давно не работал с авр-студией.

3. Для присваивания какого-то значения в порт, работай не с числами, а битами. И присаивай либо как я написал, либо в студии 5 и 6 есть макрос _BV(БИТ регистра, например PORTA0), он в бит записывает 1.
1
pyzhman
791 / 485 / 66
Регистрация: 15.05.2012
Сообщений: 2,744
05.10.2013, 09:48 3
Моргает только при нажатой кнопке. При отпускании ничего не происходит. Надо по-другому. С памятью о том, что кнопку нажали и отпустили.
1
Kve
11 / 11 / 1
Регистрация: 21.05.2013
Сообщений: 70
05.10.2013, 16:54 4
Тогда в цикле if работай со счетчиком.
За телом этого цикла сомтри значение счетчика, и работай со светодиодом.
Еще можешь задержку добавить после присваивания на РВ0 значения, а секунду-2, чтоб не было повторного считывания нажатия.
Либо добавь цикл после присваивания значений на проверку состояния ножки PD0, т.е. пока кнопка зажата - бесконечный цикл не заканчивается.
1
SENDEJER
5 / 5 / 3
Регистрация: 22.05.2013
Сообщений: 387
05.10.2013, 19:17  [ТС] 5
А как еще можно оформить? более по проще? а то только начал разбираться
0
Kve
11 / 11 / 1
Регистрация: 21.05.2013
Сообщений: 70
06.10.2013, 11:30 6
зайди тогда на Там много материала и как-раз для начинающих. Описано все обычным доступным языком. Почитай, вкури это дело, и у тебя получится
0
Valery__
233 / 223 / 146
Регистрация: 19.03.2012
Сообщений: 369
06.10.2013, 12:40 8
Как вариант
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
#include <tiny2313.h>
#define F_CPU 4000000UL // задаем тактовую частоту (кварца) нужно для работы задержки 
//(Attiny2313 есть встроенный тактовый генератор(4/8 МГц/128 кГц).)
 
#include <io.h> //присоединяет к основному тексту программы стандартный текст описания для МК 2313
#include <delay.h> //Библиотека обработки задержек delay
 
#define out_led PORTD.0  //  выход управления светодиодом
#define in_button PINB.0 // вход кнопки
 
bit flag;
 
void main (void) // функция не возвращает никакого значения 
//(main- набор команд настройки системы + заготовка главного цикла программы)
 
{       
    
    DDRB=0x00;   // на вход присваевается FF=00000000    
    DDRD=0xff;   // на выход 11111111
    PORTD=0xff;  // сброс порта D
    flag=0;
    while(1) //бесконечный цикл (выполняется пока "условие истинно")
    {
             if (!flag)
             {
                out_led=0;
                delay_ms(10);
                out_led=1;
                delay_ms(10);
             }
             if(in_button==0) 
             {
                if(flag)
                    flag=0;
                else
                    flag=1;                        
             }
             while (in_button==0){}//  ожидаем отпускани кнопки               
    };
}
0
Миниатюры
ATtiny2313. Управление светодиодом  
06.10.2013, 12:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.10.2013, 12:40

Управление светодиодом по нажатию кнопки (ATMega32, ASM, Proteus)
Работаю в AVR, через Протеус схему сделал и микроконтроллером. Проблема в том,...

Управление светодиодами на ATtiny2313
Ребята, помогите. Нужно написать программу под ATtiny 2313, где при нажатии...

Управление шаговым двигателем на Attiny2313
нужен программный код на C и С++ Короче имеются две кнопки(влево и...


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

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

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