Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
slatan2003
4 / 4 / 0
Регистрация: 16.12.2009
Сообщений: 54
1

Одиночный импульс

12.04.2016, 12:44. Просмотров 1104. Ответов 20
Метки нет (Все метки)

Добрый день.
Интересует "кусочек" кода.
При появлении 1 на выходном порту нужно сформировать одиночный (1сек) импульс на выходе и дальше должен появиться 0 и оставаться до ресета МК.
Пока код имеет такой вид:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DDRD = 0x00;    //ВХОД
PORTD = 0xFF; 
DDRB = 0xFF;   //ВЫХОД
PORTB = 0x00; 
while(1)
{
// опрос кнопки
if ((PIND & (1 << PD0)) ==0) //опрос кнопки
{
_delay_ms(150); // дребезг
PORTB |= (1<<PB0);  // вкл. светодиод (горорит до ресета МК)
{}
}
 
// формиование одиночного имульса
if ((PINB & (1 << PB1)) ==1) 
{
 
{}
}
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.04.2016, 12:44
Ответы с готовыми решениями:

Импульс тока в Меге
&lt;Изображение удалено&gt; &lt;Изображение удалено&gt; Обнаружил непонятный процесс в Мега8....

Сформировать импульс заданной длительности на ATmega 8535
Доброго времени суток. У меня такая проблема. Не получается сформировать импульс длительностью в 20...

Сформировать одиночный импульс длительностью 40 мкс
Будте добры, помогите решить задачку ft = 2мГц таймер Т2 сформировать на вход С1 импульс...

Прямоугольный импульс. Добавить шум , исказить и восстановить прямоугольный импульс
Здравствуйте, у меня есть прямоугольный импульс, но не получается задать шум, исказить, а после...

Одиночный импульсный сигнал
такая проблема есть программа для импульсного сигнала. собственно вот она clear all; Ts = 0.05; T...

20
generation472
19 / 19 / 7
Регистрация: 04.11.2011
Сообщений: 564
Записей в блоге: 1
12.04.2016, 14:20 2
slatan2003, А почему не используете прерывание?
0
pyzhman
1156 / 512 / 75
Регистрация: 15.05.2012
Сообщений: 2,925
12.04.2016, 15:04 3
Прерывание слишком жирно для такой задачи.
C
1
2
3
4
while(!(PIND & (1<<PD0))); // ждем появления "1"
PORTB |= 1<<PB1;
_delay_ms(1000);
PORTB &= !(1<<PB1);
Добавлено через 2 минуты
Да и дребезг, судя по описанию, тут ни при делах.
0
slatan2003
4 / 4 / 0
Регистрация: 16.12.2009
Сообщений: 54
12.04.2016, 16:28  [ТС] 4
У меня на выходе PB0 - формируется "1" при нажатии на кнопку ,и остается там до сброса МК, эта часть
А на выходе PB1- нужно сформировать одиночный (1сек) импульс, и оставить "0" тоже до сброса МК.

Добавлено через 10 минут
У меня на выходе PB0 - формируется "1" при нажатии на кнопку ,и остается там до сброса МК,
-Эта часть работает.
А на выходе PB1- нужно сформировать одиночный (1сек) импульс, и оставить "0" тоже до сброса МК.
-Эту нужно написать.
0
12.04.2016, 16:28
ValeryS
Модератор
7906 / 5883 / 773
Регистрация: 14.02.2011
Сообщений: 20,235
Завершенные тесты: 1
12.04.2016, 16:33 5
Цитата Сообщение от slatan2003 Посмотреть сообщение
А на выходе PB1-
Цитата Сообщение от slatan2003 Посмотреть сообщение
DDRB = 0xFF; * //ВЫХОД
Цитата Сообщение от slatan2003 Посмотреть сообщение
PINB & (1 << PB1))
это как???
0
slatan2003
4 / 4 / 0
Регистрация: 16.12.2009
Сообщений: 54
12.04.2016, 16:52  [ТС] 6
Это мои порты_
C
1
2
3
4
DDRD = 0x00; // Порт D вход
PORTD = 0xFF; // Подключаем подтягивающие резисторы
DDRB = 0xFF; // Порт B выход
PORTB = 0x00; // Лог. 0 на выходе
Это обработка нажатия на кнопку (подкл. к порту D)
C
1
2
3
4
5
6
if ((PIND & (1 << PD1)) ==0) 
{
_delay_ms(150);
PORTB |= (1<<PB1);
{}
}
0
ValeryS
Модератор
7906 / 5883 / 773
Регистрация: 14.02.2011
Сообщений: 20,235
Завершенные тесты: 1
12.04.2016, 18:20 7
slatan2003, теги выделения кода не забывай ставить

я спросил как ты с порта который настроен на выход считываешь данные? а главное зачем?
Цитата Сообщение от slatan2003 Посмотреть сообщение
if ((PINB & (1 << PB1)) ==1)

если тебе нужен только один импульс и больше ничего то решается это как-то так

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DDRD = 0x00;    //ВХОД
PORTD = 0xFF; 
DDRB = 0xFF;   //ВЫХОД
PORTB = 0x00; 
 
 
while(PIND & (1 << PD0)) !=0); // ждем нажатия кнопки 
// формирование одиночного импульса
PORTB.1=1;
_delay_ms(1000);
PORTB.1=0;
 
while(1)
{
}
1
slatan2003
4 / 4 / 0
Регистрация: 16.12.2009
Сообщений: 54
12.04.2016, 18:42  [ТС] 8
Это я B перепутал с D.
C#
1
if ((PINB & (1 << PB1)) ==1)
А по поводу
C#
1
2
3
PORTB.1=1;
_delay_ms(1000);
PORTB.1=0;
Этот вариант не подходит т.к. если кнопка на входе МК останется нажатой то на выходе импульсы будут идти постоянно.
0
ValeryS
Модератор
7906 / 5883 / 773
Регистрация: 14.02.2011
Сообщений: 20,235
Завершенные тесты: 1
12.04.2016, 19:46 9
Цитата Сообщение от slatan2003 Посмотреть сообщение
Этот вариант не подходит т.к. если кнопка на входе МК останется нажатой то на выходе импульсы будут идти постоянно.
может внимательней посмотришь?
в главном цикле ничего не исполняется
0
slatan2003
4 / 4 / 0
Регистрация: 16.12.2009
Сообщений: 54
12.04.2016, 20:24  [ТС] 10
может внимательней посмотришь?
в главном цикле ничего не исполняется
При таком исполнении МК после ресета формирует одиночный импульс сразу, без нажатия на кнопку. а потом, при нажатии кнопки уже ничего не происходит....
C
1
2
3
4
5
while ((PIND & (1 << PD0)) ==0);
_delay_ms(200);
PORTC |= (1<<PC0);
_delay_ms(500);
PORTC &= ~ (1<<PC0);
0
ValeryS
Модератор
7906 / 5883 / 773
Регистрация: 14.02.2011
Сообщений: 20,235
Завершенные тесты: 1
12.04.2016, 21:31 11
Цитата Сообщение от slatan2003 Посмотреть сообщение
while ((PIND & (1 << PD0)) ==0);
Цитата Сообщение от ValeryS Посмотреть сообщение
while(PIND & (1 << PD0)) !=0); // ждем нажатия кнопки
разницу видишь?
2
slatan2003
4 / 4 / 0
Регистрация: 16.12.2009
Сообщений: 54
13.04.2016, 09:15  [ТС] 12
Этот вариант с != работает. но тоже не то. У меня 6 входов и 2х6 выходов. а такая функция работает только последовательно т.е. до срабатывания порта 0, 1-й порт не работает.
Утром пришла в голову мысль -
C
1
2
3
4
5
6
7
8
if(((PINB & (1 << PB0)) ==0) && ((PIND & (1 << PD0)) ==0)) // пока 0 на вых, и 0 на вх.
{
_delay_ms(200); // дребезг
PORTB |= (1<<PB0); // включаем и оставляем
PORTC |= (1<<PC0); // включаем на 0,5сек
_delay_ms(500);
PORTC &= ~ (1<<PC0); // выключаем
}
Надеюсь на отсутствие "скрытых" ошибок
0
ValeryS
Модератор
7906 / 5883 / 773
Регистрация: 14.02.2011
Сообщений: 20,235
Завершенные тесты: 1
13.04.2016, 10:34 13
Цитата Сообщение от slatan2003 Посмотреть сообщение
Этот вариант с != работает. но тоже не то.
что просил
Цитата Сообщение от slatan2003 Посмотреть сообщение
При появлении 1 на выходном порту нужно сформировать одиночный (1сек) импульс на выходе и дальше должен появиться 0 и оставаться до ресета МК.
я сразу предупредил
Цитата Сообщение от ValeryS Посмотреть сообщение
Цитата Сообщение от slatan2003 Посмотреть сообщение
пока 0 на вых
если тебе нужен только один импульс и больше ничего

Цитата Сообщение от slatan2003 Посмотреть сообщение
PINB & (1 << PB0))
Цитата Сообщение от slatan2003 Посмотреть сообщение
// пока 0 на вых
для данных на выходе нужно использовать PORT
Цитата Сообщение от slatan2003 Посмотреть сообщение
У меня 6 входов и 2х6 выходов. а такая функция работает только последовательно т.е. до срабатывания порта 0, 1-й порт не работает.
для этого нужно сначала описать алгоритм, а до этого ТЗ(Техническое Задание)
сколько входов, сколько выходов, реакция системы
И только потом кодировать

Не по теме:

Цитата Сообщение от slatan2003 Посмотреть сообщение
C#
ты разве на шарпе пишешь?
для кода на Си есть кнопочка C

0
slatan2003
4 / 4 / 0
Регистрация: 16.12.2009
Сообщений: 54
14.04.2016, 09:17  [ТС] 14
Да уж.. Тех. задание надо действительно формулировать более точно. Просто если описать ВЕСЬ алгоритм, то боюсь получится длинная "книга".
Можно еще один вопрос в продолжении этого проекта.
Строка
C
1
if ( (PINB&(1<<PB2)==0)&&(PIND&(1<<PD2)==0) )
Порт PB2-выход , PD2-вход (кнопки). Нужно добавить условие, что-бы кнопка №2 (PD2) срабатывала только после нажатие на пред идущую №1 (PD1) Дополнил условие
C
1
if ( (((PIND&(1<<PD2))==0)&&((PORTB&(1<<PB2))==0)) && ((PORTB&(1<<PB1))==1)  )
но что-то не работает. (Кстати_Тестирую этот проект пока в Протеусе)
0
Voland_
1724 / 1063 / 104
Регистрация: 04.01.2010
Сообщений: 3,638
14.04.2016, 10:16 15
... и опять вы наступаете на те же грабли. Сравниваете регистр выхода (PORTB) вместо PINB, отвечающего за вход.
Но! в вашем описании есть слово "после". Это означает, что сначала нужно отследить (дождаться) нажатия кнопки PD1, а затем уже ждать остальные кнопки.

ЗЫ: конечно, это если я понял правильно ваше задание согласно описанию. В одну строчку кода это едва ли получится вместить.
1
slatan2003
4 / 4 / 0
Регистрация: 16.12.2009
Сообщений: 54
14.04.2016, 10:41  [ТС] 16
Логика работы такая
Нажали кнопку №1.
-условие- 0 на входе 1 (порт подтянут резистором к +) и 0 на выходе 1.
-результат- 1 на выходе 1 до сброса МК.
Нажали кнопку №2.
-условие- 0 на входе 2 и 0 выходе 2 и 1 на выходе 1
-результат- 1 на выходе 2 до сброса МК.
т.е. кнопка 2 не будет работать пока не отработала кнопка 1 . и так нужно задавать последовательность 6 кнопок.
0
ValeryS
Модератор
7906 / 5883 / 773
Регистрация: 14.02.2011
Сообщений: 20,235
Завершенные тесты: 1
14.04.2016, 10:47 17
Цитата Сообщение от slatan2003 Посмотреть сообщение
(PORTB&(1<<PB2))
неужели так удобней писать, чем POTB.1?
Цитата Сообщение от slatan2003 Посмотреть сообщение
Кстати_Тестирую этот проект пока в Протеусе
прекрасно, там есть возможность пройти по шагам.
иногда зело помогает
устакиниваются хотелки и реальное положение дел


вот еще один подход
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
char flagBut1=1;
 
.............................
// главный цикл
while (1)
{
if(PIND.1==0 && flagBut1)
{
PORTB.1=1;
_delay_ms(1000);
PORTB.1=0;
flagBut1=0;
}
............................
 
}
здесь уже можно ввести много кнопок, заведя нужное количество флагов
но тоже имеет недостаток, система зависает, на 1 секунду, при нажатии на кнопку
для того чтобы не было зависаний, можно ввести многопоточность, например опрос кнопок делать в прерывании таймера
1
slatan2003
4 / 4 / 0
Регистрация: 16.12.2009
Сообщений: 54
14.04.2016, 15:08  [ТС] 18
здесь уже можно ввести много кнопок, заведя нужное количество флагов
но тоже имеет недостаток, система зависает, на 1 секунду, при нажатии на кнопку
У меня на входе стоят конечные выключатели, и некоторые в процессе рабочего цикла могут замкнуться и остаться замкнутыми (до полного окончания процесса управления).
0
ValeryS
Модератор
7906 / 5883 / 773
Регистрация: 14.02.2011
Сообщений: 20,235
Завершенные тесты: 1
14.04.2016, 20:24 19
перенес часть постов вот сюда(создал новую тему)
Конструкции PORTB.1 PIND.2 и подобные
0
slatan2003
4 / 4 / 0
Регистрация: 16.12.2009
Сообщений: 54
14.04.2016, 21:22  [ТС] 20
РЕШИЛ СВОЮ ЗАДАЧУ ТАК !!!!!!!
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
char Flag0=0;
char Flag1=0;
char Flag2=0;
while(1)
{
//кнопка-0
if (((PIND&(1<<PD0))==0)&&((PORTB&(1<<PB0))==0))
{
Flag0=1;
_delay_ms(100);
PORTB |= (1<<PB0);
PORTC |= (1<<PC0);
_delay_ms(900);
PORTC &= ~ (1<<PC0);
}
//кнопка-1
if ( (((PIND&(1<<PD1))==0)&&((PORTB&(1<<PB1))==0)) && (Flag0==1)  )
{
Flag1=1;
_delay_ms(100);
PORTB |= (1<<PB1);
PORTC |= (1<<PC1);
_delay_ms(900);
PORTC &= ~ (1<<PC1);
}
//кнопка-2
if ( (((PIND&(1<<PD2))==0)&&((PORTB&(1<<PB2))==0)) && (Flag1==1)  )
{
Flag2=1;
_delay_ms(100);
PORTB |= (1<<PB2);
PORTC |= (1<<PC2);
_delay_ms(900);
PORTC &= ~ (1<<PC2);
}
В протеусе работает. Вот только я так и не понял до конца что делает оператор Flag.
0
14.04.2016, 21:22
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.04.2016, 21:22

Listview мультивыбор и одиночный
Добрый день. Есть код, который выводит в listview папки и файлы на СД карте. Сообственно проблема...

Одиночный символ «решетка» (#)
Одиночный символ «решетка» (#) нужен для того, чтобы: A Подключать внешние библиотеки B...

Assembler одиночный символ из буфера
Добрый вечер. Ситуация такова: У меня есть поле для ввода строки (editbox1). Значения, которые я...


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

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

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