Не могу понять, где ошибка в программе
25.10.2022, 17:56
|
|
|
Частый гость
Регистрация: 19.11.2011
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Не могу понять, где ошибка в программе
Написал часть программы для обработки нажатия кнопки для Attiny2313, при котором должно изменяться значение одной переменной. При коротком нажатии однократном или многократном соответственно изменение значения на 1 или равно количеству нажатий. При долгом нажатии изменение на 10 . Чтобы не вводить весь код, описываю словами:
1. В таймере Т0 в прерывании увеличивается на 1 переменная k, при этом прерывание запрещено.
2. В main, while (1) при обработке нажатия кнопки разрешается прерывание Т0;
|
Код:
|
while (1)
{
// Place your code here
if(!PIND.3)
{ TIMSK=0x02,PORTB=k1;}
if((k1==20)&&(!PIND.3)) {k2=k1, sec++;}
// if((k1==40)&&(!PIND.3))
// {TIMSK=0x00,sec+=10-1,k1=0;}
if(PIND.3) {TIMSK=0x00,k1=0;}
} |
k1 считается в Т0, k2 показывает выполнение 3ей строки программы,
sec++ должна увеличиваться на единицу, последняя строка останавливает прерывание.
При симуляции в Протеус7 и удержании кнопки на PIND.3 более 4 сек. для прохождения более 20 имп. sec›30. Где я не прав?
Прошу очень не ругать, т.к. программировать учусь.
Пишу и компилирую в CVAVR.
|
|
|
|
25.10.2022, 19:05
|
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО/МО
Сообщений: 12,284
Сказал спасибо: 11,860
Сказали Спасибо 4,159 раз(а) в 3,177 сообщении(ях)
|
Re: Не могу понять, где ошибка в программе
Valer 5, а как связаны T0 и нажатие кнопки?
Может стоит сменить логику обработки?
Например прерывание по нажатию и отпусканию кнопки…
А внутри того прерывания разбираться с длительностью и решать вопрос при отпускании о величине инкремента счетчика…
PS Вы бы логику алгоритма управления кнопками расписали, может там и другие варианты возможны…
Например энкодер, которым можно параметр без заморочек менять в обе стороны - там всего-то код Грея разобрать нужно будет…
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
Последний раз редактировалось mike-y-k; 25.10.2022 в 20:41.
|
|
|
|
25.10.2022, 20:39
|
|
|
Частый гость
Регистрация: 19.11.2011
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Не могу понять, где ошибка в программе
mike-y-k
При нажатии кнопки запускается таймер Т0. В каждом прерывании увеличивается переменная k1, которая говорит о прошедшем, после нажатия кнопки, времени. В
while при прошествии 20 прерываний (примерно 2 сек) переменная sec должна увеличиваться на 1. Далее до отпускания кнопки ничего не должно меняться. При отпускании кнопки прерывания запрещается, k1 обнуляется и при следующем нажатии всё повторяется. Как мне кажется.
Последний раз редактировалось mike-y-k; 25.10.2022 в 20:43.
Причина: 7.15
|
|
|
|
25.10.2022, 20:52
|
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО/МО
Сообщений: 12,284
Сказал спасибо: 11,860
Сказали Спасибо 4,159 раз(а) в 3,177 сообщении(ях)
|
Re: Не могу понять, где ошибка в программе
А если таймер всегда тикает с некоторым интервалом и инкрементирует в некоторой переменной время?
При нажатии кнопки по прерыванию от нажатия сохранили отсчет таймера в переменной, при отпускании посчитали разницу по времени, по величине разницы поменяли значение в счетчике нажатий, если времени прошло мало - отбросили как дребезг контактов и ждем следующего отпускания кнопки…
Алгоритм должен быть минимально зависим от размеров кода в основном цикле программы…
И разрешение прерываний принято делать в обработчике, обычно при выходе и с минимумом команд в нем…
PS Вам очень поможет раздел Конечных Автоматов (Finite-State Machine) из Теории Алгоритмов…
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
Последний раз редактировалось mike-y-k; 25.10.2022 в 21:17.
|
|
|
|
26.10.2022, 11:52
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 10.05.2005
Адрес: Саратов.ru
Сообщений: 1,550
Сказал спасибо: 384
Сказали Спасибо 735 раз(а) в 416 сообщении(ях)
|
Re: Не могу понять, где ошибка в программе
Valer 5,
Как объявлена переменная k1?
Так как она изменяется в прерывании и проверяется в цикле, то должна быть объявлена с ключевым словом volatile, ибо могут быть чудеса оптимизации.
|
|
|
|
Сказали "Спасибо" AJScorp
|
|
|
26.10.2022, 12:05
|
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,313
Сказал спасибо: 2,633
Сказали Спасибо 12,076 раз(а) в 6,082 сообщении(ях)
|
Re: Не могу понять, где ошибка в программе
Сообщение от AJScorp
|
|
Как объявлена переменная k1?
|
Да, это очень важно, когда "кефаль думает за вас"(из рекламы).
На всякий случай, добавлю для Valer 5: никаких "по умолчанию" и неявных преобразований, только всё ручками. Нюансы умолчаний и неявных преобразований могут меняться от версии к версии одного и того же компилятора и при использовании другого.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
26.10.2022, 14:26
|
|
|
Частый гость
Регистрация: 19.11.2011
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Не могу понять, где ошибка в программе
AJScorp, переменная объявлена
|
Код:
|
volatile unsigned int k1=0; |
Последний раз редактировалось mike-y-k; 26.10.2022 в 14:32.
Причина: 7.15, оформление
|
|
|
|
26.10.2022, 15:08
|
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО/МО
Сообщений: 12,284
Сказал спасибо: 11,860
Сказали Спасибо 4,159 раз(а) в 3,177 сообщении(ях)
|
Re: Не могу понять, где ошибка в программе
Valer 5, таки задействуйте 6 или 7 ногу как INT0/INT1 и разбирайтесь с состоянием кнопки по прерыванию при постоянно работающем 8 или 16-битном таймере
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
26.10.2022, 18:08
|
|
|
Частый гость
Регистрация: 19.11.2011
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Не могу понять, где ошибка в программе
|
Цитата:
|
|
Valer 5, таки задействуйте 6 или 7 ногу как INT0/INT1 и разбирайтесь с состоянием кнопки по прерыванию при постоянно работающем 8 или 16-битном таймере
|
mike-y-k, я писал, что при коротком нажатии надо увеличить переменную на 1, а при длинном на 10. При постоянно работающем прерывании трудно нажать на требуемый интервал, потребуется сложная обработка. А так при отпущенной кнопке прерывания запрещены, при нажатии начинается прерывания, если их больше 20 в переменную записывается 1. Дальше у меня в виде комментариев записано условие для прибавления 10.
|
|
|
|
26.10.2022, 19:02
|
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО/МО
Сообщений: 12,284
Сказал спасибо: 11,860
Сказали Спасибо 4,159 раз(а) в 3,177 сообщении(ях)
|
Re: Не могу понять, где ошибка в программе
Valer 5, прерывание по edge все решает - читаем состояние порта и при нужном уровне разбираемся с таймером. При нажатии запоминаем текущий таймер или обнуляем его, при отпускании - вычисляем или читаем длительность.
Алгоритм таки стоит основывать изначально на оптимальном выборе из возможностей аппаратуры…
Это для очень больших и быстрых можно немного расслабиться…
Я выше уже на макал на конечные автоматы - тут именно их случай в чистом виде…
Перед написанием кода стоит изучить все особенности целевого МК и расписать весь алгоритм на основе целевого железа, а уже потом диаграмму состояний оформить кодом…
Чем меньше МК, тем это правило существеннее влияет…
В ограниченных ресурсах памяти каждый байт кода значим, а при ограниченной скорости - каждый такт…
Поэтому часто итоговая прошивка допиливается и вылизывается на ассемблере…
С использованием прерывания от кнопки Вы сможете даже дребезг контактов спокойно обработать…
Время работы обработчика ≈10 тактов максимум или 10µs на 1MHz, 1µs на 10MHz, 500ns на 20MHz
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
Последний раз редактировалось mike-y-k; 26.10.2022 в 19:07.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 18:15.
|
|