26.10.2022, 22:03
|
|
Частый гость
Регистрация: 19.11.2011
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Не могу понять, где ошибка в программе
Спасибо всем. Задачу решил. Заменил ожидание
Цитата:
|
if((k1==20)&&(!PIND.3))
|
на задержку , так же и следующее ожидание и грамотно расставил круглые скобки.
Окончательный вариант:
Цитата:
|
while (1)
{
// Place your code here
if(!PIND.3)
{ TIMSK=0x02,PORTB=k1;
delay_ms(2000);
if(!PIND.3)
{sec=sec+1,PORTB=k1;}
delay_ms(2000);
if(!PIND.3)
{ TIMSK=0x00,k1=0,sec=sec+9,PORTB=k1;}
while(!PIND.3) {}
}
}
}
|
|
|
|
|
26.10.2022, 22:11
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,257
Сказал спасибо: 11,169
Сказали Спасибо 3,858 раз(а) в 2,928 сообщении(ях)
|
Re: Не могу понять, где ошибка в программе
Valer 5, а если в течении этих 2*2s Вам потом нужно будет что-то еще обрабатывать?
Вы просто создали задел проблем на будущее…
Именно про это было у Лермонтова: "Смешались в кучу кони, люди…"
PS Таким стилем страдают 99% скетчей Arduino… Может стоит просто перейти на их платформу…
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
Последний раз редактировалось mike-y-k; 27.10.2022 в 14:01.
|
|
|
Сказали "Спасибо" mike-y-k
|
|
|
27.10.2022, 16:45
|
|
Частый гость
Регистрация: 19.11.2011
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Не могу понять, где ошибка в программе
mike-y-k, а что означает " 2*2s" ?
|
|
|
|
27.10.2022, 17:00
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.02.2005
Адрес: Минск, Беларусь
Сообщений: 8,007
Сказал спасибо: 2,767
Сказали Спасибо 2,711 раз(а) в 2,005 сообщении(ях)
|
Re: Не могу понять, где ошибка в программе
Сообщение от Valer 5
|
2*2s
|
это дважды по 2 секунды.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо Yuri222 за это сообщение:
|
|
|
27.10.2022, 17:24
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,033
Сказал спасибо: 2,559
Сказали Спасибо 11,881 раз(а) в 5,958 сообщении(ях)
|
Re: Не могу понять, где ошибка в программе
Сообщение от Valer 5
|
Задачу решил.
|
Строго говоря, это не решение задачи. Как правило, это не основная задача, а маленькое действие в основной Задаче. Вы, наверное, обратили внимание, что delay_ms(2000) это тупая загрузка процессора, во время которой возможны только обработки прерываний, которые будут искажать время задержки?
Задачу можно считать решенной при нормальной реализации, а не костылями.
Заработало? Хорошо. А теперь разбирайтесь, почему первый вариант не работает.
ПС И лучше работать с реальным железом, а не с Протезом. Часто бывают стоны (при работе с контроллерами) - "В Протезе работает, в железе - нет!" и наоборот.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
Последний раз редактировалось akegor; 27.10.2022 в 17:29.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо akegor за это сообщение:
|
|
|
27.10.2022, 21:05
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,257
Сказал спасибо: 11,169
Сказали Спасибо 3,858 раз(а) в 2,928 сообщении(ях)
|
Re: Не могу понять, где ошибка в программе
Valer 5, у Вас там два delay по 2000ms=2s каждый, итого 2*2s или всего 4s…
И это глубоко порочная практика…
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
Сказали "Спасибо" mike-y-k
|
|
|
27.10.2022, 22:01
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.12.2007
Адрес: Екатеринбург
Сообщений: 2,729
Сказал спасибо: 2,435
Сказали Спасибо 893 раз(а) в 580 сообщении(ях)
|
Re: Не могу понять, где ошибка в программе
Реализовать задержку хотя бы через таймер.
|
|
|
|
27.10.2022, 22:17
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,257
Сказал спасибо: 11,169
Сказали Спасибо 3,858 раз(а) в 2,928 сообщении(ях)
|
Re: Не могу понять, где ошибка в программе
baiderin, так изначально в цикле опроса состояния порта ТС так и пытался, но не справился с железом…
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
01.11.2022, 17:52
|
|
Гражданин KAZUS.RU
Регистрация: 16.06.2005
Сообщений: 944
Сказал спасибо: 25
Сказали Спасибо 174 раз(а) в 123 сообщении(ях)
|
Сообщение от Valer 5
|
Где я не прав?
|
В небрежности ТЗ. Сначала определись, короткое нажатие - это сколько времени удерживается кнопка? Длинное нажатие - это сколько времени кнопка удерживается?
Затем определись с частотой проца - одно дело он будет работать на 8 МГц, и совершенно другое, 1 МГц. От частоты будет зависеть длительность одного тика таймера, а значит и промежутки времени, которые ты сможешь им отсчитывать. Допустим, при частоте 1 Мгц и делителе 1024, один тик будет занимать примерно 1 мс, а при 8 Мгц, один тик, при том же делителе, будет 128 мкс.
Определившись с временными интервалами и частотой, выбери счётчик, который будешь использовать. Например, выбрав таймер0 при частоте 1МГц, максимальное время, что ты сможешь отсчитать, будет 256 мс. Выбрав же таймер1, максимальное время 65536 мс. И получается, что чтобы отсчитать секунду, при использовании таймера0, тебе потребуется дополнительная переменная - счётчик переполнений. И соответствующий код для обработки этой переменной в прерывании и главном теле программы. Если же ты будешь использовать таймер1, то задав его потолок в 1000, получишь прерывание раз в секунду без всяких дополнительных переменных и кода для их обработки.
Выше перечисленное необходимо для простейшего случая, условно говоря, для проверки алгоритма симуляцией в протеусе. В реальной жизни есть такое явление - дребезг контактов.
ЗЫ: Совет. Судя по коду, кнопка, подаёт землю на PD3, а это внешнее прерывание INT1, а значит хорошо бы использовать это прерывание, убрав программный опрос пина в главном теле программы. Универсальность при таком решении страдает (на другом контроллере кнопка может не висеть на пине с прерыванием), но в данном конкретном случае, код получается проще и меньше по объёму.
Сообщение от Valer 5
|
Окончательный вариант:
|
Данный код может выглядеть рабочим только если коротким считать нажатие в 2с, а длинным - более 2с. При этом прерывание переполнения таймера после его разрешения будет вызвано несколько раз, при условии, что частота контроллера 1МГц. В случае 8МГц, или вообще 20МГц, прерывание будет вызвано очень много раз.
Вот ты опрашиваешь кнопку, она нажата. Разрешаешь прерывания таймера. Сразу сваливаешься в него - флаг-то установлен, потому что таймер должен считать, а если он считать не будет, то и прерывание никогда не произойдёт, даже если разрешено. Т.е. таймер у тебя запущен и тикает с момента его настройки, а значит переполнение уже было, флаг прерывания установился, и не сбросился, потому что автоматически сбрасывается при выходе из прерывания, а так как оно запрещено, то этого не случается. Вернувшись из прерывания, зависаешь ничего не делая 2с. За эти 2с таймер переполняется ещё 8 раз, соответственно 8 раз вызывается прерывание. За 2с можно отпустить-нажать кнопку несколько раз, но ты об этом не узнаешь (и соответственно не прибавишь несколько единиц к переменной), потому что ты просто ждёшь 2с. Но допустим, кнопку удерживают 2с, делая длинное нажатие. В этом случае sek увеличивается на 1. Снова 2с паузы, за которые случится ещё 8 заходов в прерывание таймера. Кнопку продолжают удерживать. Соответственно, запрещается прерывание, к1 обнуляется, к sek добавляется ещё 9, после чего начинается бесконечный цикл, пока кнопка удерживается.
Последний раз редактировалось mike-y-k; 01.11.2022 в 18:19.
Причина: 6.6
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 17:53.
|
|