Счётчик импульсов

Обсуждаем рождающиеся мысли и результаты экспериментов.

Счётчик импульсов

Сообщение Maxiik » 31 янв 2010, 18:30

Доброго времени суток !!!
Хочу сделать счётчик импульсов с катушки зажигания машины.
Счётчик должен считать импульсы и выводить результат на семисегментные светодиодные индикаторы.
Щас схему нарисую и выложу :)
Помогите пожалуста с програмной частью, а именно с функцией подсчёта импульсов и инециализацией таймеров.
Просто я много почитал, но не совсем понял как это работает...(я про начальные настройки таймеров и другими настройками)
На словах алгоритм работы программы я представляю так :
Таймер_1 считает количество импульсов ;
Таймер_2 отсчитывает время (N секунды) по истечении которого вызывается прерывание таймера_1;
Процедура обработки прерывания:
{
читаем значение таймера_1 и присваиваем некой пременной;
выводим значение этой переменной на индикаторы;
}

Прошу извенить меня если сморозил какую-нибудь чушь, так как я только учусь работать с МК.
Помогите с написанием кода, пожалуста !!!
Зарание очень благодарен !!!

p.s. я использую контроллер ATmega8
Аватара пользователя
Maxiik
 
Сообщения: 262
Зарегистрирован: 28 сен 2009, 21:54
Откуда: Петербург
прог. языки: С++
ФИО: Бирюк Максим Викторович

Re: Счётчик импульсов

Сообщение Master » 31 янв 2010, 20:09

Достаточно одного таймера и другой алгоритм.
На одну из ногу прерываний (пусть это будет INT0) поступает сигнал импульса. С каждым новым импульсом у нас счетчик импульсов увеличивается на N=N+1
Таймер настроен выводить значения каждые 10 секунд. Т. е. по истечении 10 сек, наступает прерывание по переполнению таймера и он выводи на индикатор значение N, а затем обнуляет N.
И все повторяется по новой.
Аватара пользователя
Master
 
Сообщения: 4468
Зарегистрирован: 21 дек 2006, 19:56
Откуда: Украина, г.Одесса
прог. языки: Delphi и С

Re: Счётчик импульсов

Сообщение Maxiik » 31 янв 2010, 22:11

Понятно. Спасибо !!!
А можно вас попросить написать кусочек кода который вызывает это прерывание INT0, для примера.
хотябы на словах: что там нужно инициализировать и как настроить таймер чтобы он выдавал прерывание каждые 10 секунд ???
И ещё такой вопрос: что такое маска совпадения ?
Зарание спасибо !!!
Аватара пользователя
Maxiik
 
Сообщения: 262
Зарегистрирован: 28 сен 2009, 21:54
Откуда: Петербург
прог. языки: С++
ФИО: Бирюк Максим Викторович

Re: Счётчик импульсов

Сообщение Master » 31 янв 2010, 22:20

На CVavr пойдет?
Какой кварц?
Аватара пользователя
Master
 
Сообщения: 4468
Зарегистрирован: 21 дек 2006, 19:56
Откуда: Украина, г.Одесса
прог. языки: Delphi и С

Re: Счётчик импульсов

Сообщение Maxiik » 31 янв 2010, 22:51

Да, будет очень здорово !!!
я сейчас начал изучать CVAVR, а раньше WINAVR пользовался :)
Кварц на 8 Мгц.
Огромное спасибо !!!!!!!!!
Аватара пользователя
Maxiik
 
Сообщения: 262
Зарегистрирован: 28 сен 2009, 21:54
Откуда: Петербург
прог. языки: С++
ФИО: Бирюк Максим Викторович

Re: Счётчик импульсов

Сообщение Master » 01 фев 2010, 10:18

Вот пример для срабатывания 16-битного таймера по прерыванию каждые 1000 мс (1 с).
Внизу в архиве таблица, создал ее давно какие там формулы не помню. Просто вбиваешь внизу в зеленое поле частоту кварца в Гц, а ниже время в мс которое должен отсчитать таймер.

Добавлено спустя 8 минут 56 секунд:
Цифры в желтом поле переводишь в 16-иричную систему и забиваем в поле Value.
Вложения
таймера.zip
(2.86 КиБ) Скачиваний: 4
123.JPG
Аватара пользователя
Master
 
Сообщения: 4468
Зарегистрирован: 21 дек 2006, 19:56
Откуда: Украина, г.Одесса
прог. языки: Delphi и С

Re: Счётчик импульсов

Сообщение Maxiik » 09 фев 2010, 14:54

Подскажите пожалуста !!!
Сделал так чтобы по прерыванию INT0 переменная N увеличивалась на еденицу.
Таймер-1 настроил так чтобы по совпадению с регистром А (Comp. A )вызывалось прерывание которое
сравнивает N с записаными числами и зажигает соответствующие светодиоды... После чего N обнуляется и прерывание заканчивается.
***
Проблема состоит в том , что всё работает очень криво, даже можно сказать вообще не работает :(
Диодики мигают сами по себе и как-то не зависит от того, сколько раз я подам сигнал на INT0
Я хотел узнать в чём может быть проблема ???
Может быть в "дребезге контактов" ???
Существуют какие-нибудь приорететы в прерываниях? ...может пока подаётся сигнал на прерывание INT0 срабатывает прерывание таймера по опросу переменной N. Эти прерывания могут конфликтовать между собой ???
Зарание спасибо большое !!!
Аватара пользователя
Maxiik
 
Сообщения: 262
Зарегистрирован: 28 сен 2009, 21:54
Откуда: Петербург
прог. языки: С++
ФИО: Бирюк Максим Викторович

Re: Счётчик импульсов

Сообщение Master » 09 фев 2010, 15:46

Сигнал на INT0 откуда идет, если с кнопки, то будет дребезг, нужно будет паузу выдерживать 10-100мс.
Приоритеты в прерывания существуют.
Прерывания между собой не конфликтуют.
Код бы выложил с каментами где что.
И зачем компаратор используется в прерывании?
Аватара пользователя
Master
 
Сообщения: 4468
Зарегистрирован: 21 дек 2006, 19:56
Откуда: Украина, г.Одесса
прог. языки: Delphi и С

Re: Счётчик импульсов

Сообщение Maxiik » 09 фев 2010, 22:57

Вот исходник написаный в CVAVR
Вложения
_1.rar
исходник
(2.95 КиБ) Скачиваний: 5
Аватара пользователя
Maxiik
 
Сообщения: 262
Зарегистрирован: 28 сен 2009, 21:54
Откуда: Петербург
прог. языки: С++
ФИО: Бирюк Максим Викторович

Re: Счётчик импульсов

Сообщение yak-40 » 09 фев 2010, 23:54

Насколько я понимаю, что-бы разрешить прерывание от 1-го таймера надо писАть TIMSK=0x04; ну или TIMSK=0x14;

Добавлено спустя 2 минуты 20 секунд:
Если сигнал на внешнее прерывание идёт с кнопки, то надо настроить прерывание по нарастающему фронту сигнала, и обязательно защитится от дребезга контакта.
- Этот человек - не человек! это робот!
- Как? уже делают?!
- Делают!!!
Аватара пользователя
yak-40
 
Сообщения: 3037
Зарегистрирован: 23 окт 2007, 22:03
Откуда: Москва
прог. языки: С
ФИО: Евгений Яковец

Re: Счётчик импульсов

Сообщение Master » 10 фев 2010, 15:18

Maxiik, сигнал по импульсу по верхнему уровню или по нижнему?
Аватара пользователя
Master
 
Сообщения: 4468
Зарегистрирован: 21 дек 2006, 19:56
Откуда: Украина, г.Одесса
прог. языки: Delphi и С

Re: Счётчик импульсов

Сообщение Maxiik » 10 фев 2010, 17:38

Master, по нижнему уровню...( я так понял, что можно замыкать "-" на INT0 с помощью транзистора ?)
Я просто не совсем понимаю суть спадающего и нарастающего фронтов (((
Аватара пользователя
Maxiik
 
Сообщения: 262
Зарегистрирован: 28 сен 2009, 21:54
Откуда: Петербург
прог. языки: С++
ФИО: Бирюк Максим Викторович

Re: Счётчик импульсов

Сообщение Ворон » 11 фев 2010, 07:59

напруга идет в верх- нарастающий и именно в момент нарастания происходит считывание команды, для ниспадающего командой считается понижение напруги на контакте .. это вродебы называется по фронту импульса...
есть еще запуск при достижения заданого уровня напряжения- это уже вроде бы от логичесого уровня, а не по фронту..
Ворон
 
Сообщения: 1054
Зарегистрирован: 24 ноя 2008, 19:43
Откуда: Казань

Re: Счётчик импульсов

Сообщение yak-40 » 11 фев 2010, 11:57

Maxiik писал(а):Я просто не совсем понимаю суть спадающего и нарастающего фронтов (((

Всё очень просто. В момент нажатия кнопки происходит изменение потенциала на входе от 1 до 0, это спадающий фронт, при отпускании кнопки происходит обратное изменение, это нарастающий фронт. Прерывание надо настраивать именно по фронтам. По уровню нельзя, программа жутко тормозить будет во время нажатия кнопки.
- Этот человек - не человек! это робот!
- Как? уже делают?!
- Делают!!!
Аватара пользователя
yak-40
 
Сообщения: 3037
Зарегистрирован: 23 окт 2007, 22:03
Откуда: Москва
прог. языки: С
ФИО: Евгений Яковец

Re: Счётчик импульсов

Сообщение Master » 11 фев 2010, 13:41

Вот пример настройки прерывания по спадающему уровню. И прерывание таймера1 через каждые 5 сек.
Кварц 8мгц.
Вложения
mega8.JPG
Аватара пользователя
Master
 
Сообщения: 4468
Зарегистрирован: 21 дек 2006, 19:56
Откуда: Украина, г.Одесса
прог. языки: Delphi и С

След.

Вернуться в Идеи

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 26