реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Опрос датчика
Freeze Anti
сообщение Nov 9 2007, 06:19
Сообщение #1


Частый гость
**

Группа: Новичок
Сообщений: 153
Регистрация: 29-03-07
Из: Саратов
Пользователь №: 26 613



Здравствуйте.
У меня есть такая проблема. Мне надо узнать показания датчика, а потом - сравнить их с теми, которые будут через 15 сек.
Используемая микросхема - ATMega32.


--------------------
!!! All you need is LOVE !!!
Go to the top of the page
 
+Quote Post
alexander55
сообщение Nov 9 2007, 06:45
Сообщение #2


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(Freeze Anti @ Nov 9 2007, 09:19) *
У меня есть такая проблема. Мне надо узнать показания датчика, а потом - сравнить их с теми, которые будут через 15 сек.

Здесь нет проблем. Считайте показания датчика, а потом - сравните их с теми, которые будут через 15 сек.


Цитата(Freeze Anti @ Nov 9 2007, 09:19) *
Используемая микросхема - ATMega32.

Вопрос задайте в AVR.
Go to the top of the page
 
+Quote Post
Freeze Anti
сообщение Nov 9 2007, 06:55
Сообщение #3


Частый гость
**

Группа: Новичок
Сообщений: 153
Регистрация: 29-03-07
Из: Саратов
Пользователь №: 26 613



Так проблема в том, что мне необходимо измерить эти 15сек. Остальная часть программы при этом должна работать.

Если я некорректно выбрал тему, то возможно админы ее перенесут?..


--------------------
!!! All you need is LOVE !!!
Go to the top of the page
 
+Quote Post
NickNich
сообщение Nov 9 2007, 07:12
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 375
Регистрация: 8-11-05
Пользователь №: 10 593



Цитата(Freeze Anti @ Nov 9 2007, 09:55) *
Так проблема в том, что мне необходимо измерить эти 15сек. Остальная часть программы при этом должна работать.


Вам знакомы понятия "таймер" и "прерывание"?
Go to the top of the page
 
+Quote Post
alexander55
сообщение Nov 9 2007, 09:57
Сообщение #5


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(Freeze Anti @ Nov 9 2007, 09:55) *
Так проблема в том, что мне необходимо измерить эти 15сек. Остальная часть программы при этом должна работать.

Если я некорректно выбрал тему, то возможно админы ее перенесут?..

Понятно.
Запустите таймер. По прерыванию от таймера считайте эти прерывания. Вы получите системное время.
Все. biggrin.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 9 2007, 22:28
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Freeze Anti @ Nov 9 2007, 08:55) *
Так проблема в том, что мне необходимо измерить эти 15сек. Остальная часть программы при этом должна работать.
Вот тут выкладывал пример одной из реализаций. Надо только правильно выбрать размер переменной для счетчика времени.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Bird2
сообщение Nov 10 2007, 19:27
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 80
Регистрация: 19-12-06
Пользователь №: 23 672



Другой вариант: использовать внешние часы реального времени (RTC), например DS1307 и по шине i2c опрашивать периодически время. При этом можно не только получить интервал, но и просто системное время с энергонезависимым питанием и календарем. Для новичка должно быть интересно...
З.Ы. Если в процессоре встроенный RTC, то можно и без часов, тогда устанавливаем прерывание на RTC = 1 секунде. Календарь формируем сами, если заинтересовало wink.gif
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 10 2007, 19:56
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Freeze Anti @ Nov 9 2007, 11:55) *
Так проблема в том, что мне необходимо измерить эти 15сек. Остальная часть программы при этом должна работать.

Настраиваете таймер на определенный интервал времени, соответствующий минимально необходимому. В процедуре прерывания от таймера увеличиваете переменную, выделенную под счетчик временных интервалов на величину интервала вызова прерывания. В основной программе во временную переменную запоминаете текущее значение переменной временных интервалов и затем сравниваете разницу между текущим и запомненным значениями. Если эта разница превысила заданный интервал, то это означает, что время ожидания закончилось.
Для счета времени обычно подходят миллисекундные интервалы (от 1 до 100мс). Соответственно на такой интервал нужно настраивать таймер и прерывания от него. На это же значение нужно увеличивать переменную счетчика временных интервалов, тогда ее значение у вас будет всегда выражено в миллисекундах, а не в каких-то абстрактно-попугайских "тиках" таймера. При этом 16-разрядной беззнаковой переменной хватает для организации счетчика интервалов с временем переполнения больше 1 минуты. Для отсчета бОльших интервалов времени можно использовать 32-разрядную переменную. С помощью такого (32-битного) счетчика в миллисекундных отсчетах можно измерить интервал времени больше, чем 1,5 месяца.
Еще раз обращаю внимание, что в прерывании счетчик времени нужно увеличивать не на 1, а на число соответствующее периоду вызова прерываний, выраженное в миллисекундах (ну или секундах)! Не наступайте на уже пройденные чужие грабли хотя бы в этом месте wink.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 09:43
Рейтинг@Mail.ru


Страница сгенерированна за 0.01405 секунд с 7
ELECTRONIX ©2004-2016