роботы
робототехника
микроконтроллеры
Главная
Как сделать робота
Новости
Спорт
Статьи
Wiki
Форум
Downloads
Ссылки
Контакты  


 Страниц (5): « 1 2 3 4 [5]   

> Без описания
Andrey 2004
Отправлено: 17 Марта, 2019 - 14:19:45
Post Id



Лейтенант


Сообщений всего: 35
Дата рег-ции: Дек. 2018  





Я тут призадумался...
А можно сделать так чтобы при нажатии кнопки менялась пауза (при этом работая с делеем без таймера ), дело в том что если в скобки _deley_ms() ставишь переменную, то компилятор начинает материться, если задаешь значение например U через дефаин то все работает, но менять значения U уже нельзя Замешательство . Значит нужно изучать таймеры??
 
 Top
Predator Супермодератор
Отправлено: 17 Марта, 2019 - 14:35:20
Post Id


Супермодератор


Сообщений всего: 1222
Дата рег-ции: Июль 2012  





у функции _delay_ms() есть один ядреный недостаток: процессор крутится в этой функции и никак не может узнать, что-же там с кнопками.
итак рекомендую:
1) разобрать прерывания: для начала повесить прерывание на кнопку, чтобы обработчик заставил переключить светодиод, при этом в основной программе главный цикл пустой.
2) разобраться с дребезгом, чтобы одно нажатие было одним нажатием.
3) завести таймер: переключать светодиод по прерыванию от таймера.

для целевого количества миганий, для подсчета количества уже мигнутых ... нужно позаводить глобальных переменных.
 
 Top
Andrey 2004
Отправлено: 17 Марта, 2019 - 16:23:28
Post Id



Лейтенант


Сообщений всего: 35
Дата рег-ции: Дек. 2018  





хорошо, на счет делея вроде понял, но а что с этой проблемой делать
Andrey 2004 пишет:
Проблема в том что у меня или получается бесконечный цикл (при первом нажатии кнопки цикл замыкается и не реагирует на дальнейшие нажатия);
Или получается сделать все это при помощи For где я действительно могу менять переменную i
,но при этом светодиод мигает до тех пор пока не достигнет значения переменной i а затем гаснет до следующего нажатия кнопки.

Здесь я не знаю о чем и думать, вроде все операторы более менее знаю, а подходящего варианта не нашел . Замешательство
 
 Top
Predator Супермодератор
Отправлено: 17 Марта, 2019 - 16:59:28
Post Id


Супермодератор


Сообщений всего: 1222
Дата рег-ции: Июль 2012  





тут надо конкретно вашу программу смотреть - собственно даже не операторы, а алгоритм.
и да, теперь вы переходите на следующий уровень: от написания операторов к программированию (переход от быдлокодера к программисту).


подозреваю, что в бесконечном цикле крутится по причине того, что внутри цикла в принципе не опрашивает кнопку.
 
 Top
Andrey 2004
Отправлено: 17 Марта, 2019 - 17:03:40
Post Id



Лейтенант


Сообщений всего: 35
Дата рег-ции: Дек. 2018  





CODE:
#define F_CPU 8000000UL //16MHz
#include <avr/io.h>
#include <util/delay.h>
#define l 10
volatile unsigned char i;
volatile unsigned char p;
int main(void) {
DDRB = 0xFF;
PORTB = 0x00;
DDRD=0x00;
PORTD=0xFF;
i=0;
while(1)
{




if (PIND & (1<<1))
{

_delay_ms(5);

if (PIND & (1<<1))
{
while (PIND & (1<<1)) {}
i++;
_delay_ms(10);

}
}


for(int p=0;p<i;p++)
{
PORTB=0b00000010;
_delay_ms(50);
PORTB=0b00000000;
_delay_ms(50);
}




}








}

Вот код от которого я "пляшу"
(Добавление)
сейчас скину свои неудачные варианты
(Добавление)
В принципе все мои попытки сводятся к одному соединить фор который может считать кол во
миганий и ваил который зацикливает что либо.Вот один из моих "кодов":
CODE:
#define F_CPU 8000000UL //16MHz
#include <avr/io.h>
#include <util/delay.h>
#define l 10
volatile unsigned char i;
volatile unsigned char p;
int main(void) {
DDRB = 0xFF;
PORTB = 0x00;
DDRD=0x00;
PORTD=0xFF;
i=0;
while(1)
{
if (PIND & (1<<1))
{

_delay_ms(5);

if (PIND & (1<<1))
{
while (PIND & (1<<1)) {}
i++;
_delay_ms(10);

}
}

while (PIND & (1<<1))
{
for (p=0;p<i;p++)
{

PORTB=0b00000010;
_delay_ms(50);
PORTB=0b00000000;
_delay_ms(50);
if (PIND & (1<<1))
{
i++;
}
_delay_ms(200);
}
}
}
}
 
 Top
Predator Супермодератор
Отправлено: 18 Марта, 2019 - 11:08:34
Post Id


Супермодератор


Сообщений всего: 1222
Дата рег-ции: Июль 2012  





В первом случае у вас происходит проверка нажатия кнопки, после отпускания фиксируется факт нажатия и только тогда программа продолжает работать дальше.
Есть еще нюанс: в процессе мигания светодиодом (в цикле p=0;p<i;p++) проверка кнопки не происходит, то есть нужно нажать и держать пока не промигается.

Во втором случае чуть хуже: вы проверяете нажатие кнопки, после отпускания фиксируется факт нажатия и только тогда программа продолжает работать дальше. (пока как в первом случае)
А дальше, через 10 мс, в случае нажатой кнопки вы начинаете мигать, иначе снова проверять нажатие фиксировать. В общем чтобы начать мигать надо отпустить кнопку и за 10 мс успеть обратно нажать. Рекомендую перевести эту задачу на другую кнопку.
 
 Top
Andrey 2004
Отправлено: 20 Марта, 2019 - 20:10:48
Post Id



Лейтенант


Сообщений всего: 35
Дата рег-ции: Дек. 2018  





Благодарю за помощь!!!
Но мне кажется, что для решения моей последней задачи нужно изучить прерывания.
Тогда без лишних мучений можно будет написать этот код правильно.

(Отредактировано автором: 20 Марта, 2019 - 20:34:14)

 
 Top
Страниц (5): « 1 2 3 4 [5]
« С чего начать? »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown