Кстати, если я правильно понял, то у вас прерывание по переполнению не вызывалось, не так ли? А вы не забыли установить флаг разрешения прерывания?
Таймеры/счётчики в AVR
gavrasio, SREG самый обычный регистр ввода-вывода, хоть и имеет особую роль, связанную с управлением ходом программы. Его можно спокойно прочитать, скинуть в стек, а потом достать и восстановить. Было бы удивительно, если бы этого нельзя было сделать. Флаги периферии же внутренние биты состояния внешних для ядра МК устройств. Они отражают состояние или готовность аппаратных процессов, так что было бы весьма удивительно, если бы можно было изменить флаг, не затронув процесс.
Кстати, если я правильно понял, то у вас прерывание по переполнению не вызывалось, не так ли? А вы не забыли установить флаг разрешения прерывания?
Кстати, если я правильно понял, то у вас прерывание по переполнению не вызывалось, не так ли? А вы не забыли установить флаг разрешения прерывания?
- Реклама
- Сообщения: 162
- Зарегистрирован: Пн июн 01, 2015 15:23:01
B@R5uk писал(а):Чушь полная! То же мне программист нашёлся.
Крутые программисты здесь не сидят, - тут более-менее на одном уровне. А есть и такие, что инициализацию портов микроконтроллера делают с привлечением "Классов".
Я бы так не сказал, но это моё чисто субъективное мнение.gavrasio писал(а):тут более-менее на одном уровне
- Сообщения: 162
- Зарегистрирован: Пн июн 01, 2015 15:23:01
- Сообщения: 162
- Зарегистрирован: Пн июн 01, 2015 15:23:01
Работаете в Асе? Те, кто пишет в Си могут Вас не понять.Но объясняете всё дохотчиво.B@R5uk писал(а):gavrasio, SREG самый обычный регистр ввода-вывода, хоть и имеет особую роль, связанную с управлением ходом программы. Его можно спокойно прочитать, скинуть в стек, а потом достать и восстановить. Было бы удивительно, если бы этого нельзя было сделать. Флаги периферии же внутренние биты состояния внешних для ядра МК устройств. Они отражают состояние или готовность аппаратных процессов, так что было бы весьма удивительно, если бы можно было изменить флаг, не затронув процесс.
- Реклама
скорее наоборот: работающие исключительно в "асе" могут не понять сишников, но в области микроконтроллеров найти "сишника", не понимающего ассемблер целевой платформы - это надо очень сильно постаратьсяgavrasio писал(а):Работаете в Асе? Те, кто пишет в Си могут Вас не понять.Но объясняете всё дохотчиво.
разумеется, мое замечание не распространяется на категорию начинающих и горе-программистов: первые могут не понять в силу малоопытности, а вторые - в силу тупости.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Всё же интересует момент про "системную функцию while" и её заточенность на ловлю прерываний. С такимм новостями как-то бессмысленно обсуждать остальное.
- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
А, по моему, с этой то функцией, как раз все и ясно. Как автор высказывания не дошел до функции "точка с запятой", которая "ловит" конец строки в исходном тексте, удивительно.
Ну, как не понимающего... Глядя на дизассемблерный листинг, я примерно догадываюсь, что там делает большинство команд, хотя ассемблером АВР никогда плотно не интересовался. Вставку в сишный код, скорее всего, напишу глядя в мануал, а программу целиком наверное нет. Это если сходу. Если посидеть-поковыряться, то и программу наверное напишу, только это еще не требовалось ни разу.ARV писал(а):но в области микроконтроллеров найти "сишника", не понимающего ассемблер целевой платформы
- Сообщения: 162
- Зарегистрирован: Пн июн 01, 2015 15:23:01
Вас смущает запись while(1); Перепишите вот так:a5021 писал(а):А, по моему, с этой то функцией, как раз все и ясно. Как автор высказывания не дошел до функции "точка с запятой", которая "ловит" конец строки в исходном тексте, удивительно.
whille(1)
;
Точка с запятой говорит, что это есть пустой оператор. Можете проверить на компиляторе, - он определит, где есть функция, а где пустой оператор. Без пустого оператора while(1) не будет знать, что ей надо что-то делать.
точка с запятой скорее обозначает конец оператора, как в русском языке точка - конец предложения. пустой оператор в таком разрезе это две подряд идущие точки с запятой. бред, конечно...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
- Сообщения: 162
- Зарегистрирован: Пн июн 01, 2015 15:23:01
a5021 писал(а):Мне проверять не нужно. Я хорошо вижу, где функция, а где дисфункция.
Вот результат компиляции( код 0 - компиляция успешная). Обратите внимание, где находится пустой оператор( внизу листинга).
Хотя, может Вы и правы. Все операторы есть своего рода функциями, интерфейсы к которым прописаны в библиотеках. И если их назвали операторами, значит так и должно быть.
Последний раз редактировалось gavrasio Вт окт 06, 2015 21:22:33, всего редактировалось 1 раз.
gavrasio, вы метете пургу.
while(1);
и
while(1)
;
абсолютно, с бесконечной точностью эквивалентные записи, и результат компиляции будет безупречно идентичным для обоих этих вариантов.
точка с запятой - это НЕ ОПЕРАТОР!!! вот вообще, нисколечно, даже на чуть-чуть НЕ ОПЕРАТОР!!! абсолютно НЕ ОПЕРАТОР!!!
когда вы уже прочтете книжку, чтобы пользоваться ПРАВИЛЬНОЙ ТЕРМИНОЛОГИЕЙ, а не выдумывать свою собственную, не соприкасающуюся с истиной?!
while(1);
и
while(1)
;
абсолютно, с бесконечной точностью эквивалентные записи, и результат компиляции будет безупречно идентичным для обоих этих вариантов.
точка с запятой - это НЕ ОПЕРАТОР!!! вот вообще, нисколечно, даже на чуть-чуть НЕ ОПЕРАТОР!!! абсолютно НЕ ОПЕРАТОР!!!
когда вы уже прочтете книжку, чтобы пользоваться ПРАВИЛЬНОЙ ТЕРМИНОЛОГИЕЙ, а не выдумывать свою собственную, не соприкасающуюся с истиной?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 162
- Зарегистрирован: Пн июн 01, 2015 15:23:01
ARV писал(а):gavrasio, вы метете пургу.
while(1);
и
while(1)
;
абсолютно, с бесконечной точностью эквивалентные записи, и результат компиляции будет безупречно идентичным для обоих этих вариантов.
точка с запятой - это НЕ ОПЕРАТОР!!! вот вообще, нисколечно, даже на чуть-чуть НЕ ОПЕРАТОР!!! абсолютно НЕ ОПЕРАТОР!!!
когда вы уже прочтете книжку, чтобы пользоваться ПРАВИЛЬНОЙ ТЕРМИНОЛОГИЕЙ, а не выдумывать свою собственную, не соприкасающуюся с истиной?!
Но книжку всё равно почитаю, - полезное дело. Графика плохая, - читается с трудом.
- Сообщения: 162
- Зарегистрирован: Пн июн 01, 2015 15:23:01
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 1
- Зарегистрирован: Чт окт 08, 2015 10:45:05
Прошу помощи, алгоритм простой, а ума немогу дать. Нужно в течении секунды посчитать количество нажатий кнопки.
А секунда откуда отсчитывается? От первого нажатия или от какого-то другого события? Кроме того, нажатия кнопки считать -- это вам не хухры-мухры, посмотрите для начала в теме "Помогите опросить кнопку" сколько народ над проблемой дребезга контактов бьётся.
Если вкратце, то запускаете таймер с периодом 0,1 секунды, каждый раз по срабатыванию запоминаете текущее состояние и сравниваете с предыдущим. Считаете количество переходов из нуля в единицу (или наоборот). Там же отсчитываете время. Соответственно, нажатий может быть зафиксировано не более 10 (с этими временными параметрами).
Если вкратце, то запускаете таймер с периодом 0,1 секунды, каждый раз по срабатыванию запоминаете текущее состояние и сравниваете с предыдущим. Считаете количество переходов из нуля в единицу (или наоборот). Там же отсчитываете время. Соответственно, нажатий может быть зафиксировано не более 10 (с этими временными параметрами).
- Сообщения: 469
- Зарегистрирован: Вс авг 30, 2015 03:52:59
Не совсем корректное решение, так как основано на предположении, что все нажатия длиннее 0,1сек. В частности, нажатия полностью укладывающиеся между двух срабатываний таймера, вообще не будут учитываться. Лучше все же обрабатывать и прерывания от смены уровня. Дребезг давить программно. Как было справедливо отмечено, методов его подавления много, выбирать нужно исходя из конкретной задачи. Если кроме такого подсчета, м/к больше ничем не занят, то можно и прямо в прерывании это сделать. При смене младшего бита счетчика секунд, подбивать частную сумму и сохранять результаты подсчета, скажем, в массив для последующего отчета.B@R5uk писал(а):запускаете таймер с периодом 0,1 секунды, каждый раз по срабатыванию запоминаете текущее состояние и сравниваете с предыдущим.
Корректное или нет, это вопрошающему решать, моё дело лишь предложить. Может он дребезг хочет посчитать, тогда вообще никакого подавления не надо, а кнопку на счётный вход второго таймера надо повесить (с интервалом 1 сек считывать показания и вычитать из нового старое). А если и делать подавление, то как раз в той теме, на которую я давал ссылку, многие решения так или иначе сводятся к предложенному мной варианту.Pnjom-Penb писал(а):Не совсем корректное решение, так как основано на предположении, что все нажатия длиннее 0,1 сек.



