Поверка секундомеров

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Digital
Открыл глаза
Сообщения: 78
Зарегистрирован: Сб сен 13, 2008 16:23:09
Откуда: Kaluga
Контактная информация:

Сообщение Digital »

Напишу для применения мастера cvavr.
1. Режим таймера1 - Normal. Прерывания от таймера не использовать.
2. Прескалер таймера - на одно из поддерживаемых значений.
3. В поле "Out. B" или "Out. A" включаем режим "Toggle", т.е. переключения. Теперь на соответствующем аппаратном выходе таймера1 будет присутствовать частота (меандр), равная: (fкварца/(прескалер таймера1*2^16))/2.
3. Аппартный вывод таймера1 настроить выходом. Для случая с "Out. B" - это OC1B pin, т.е. вывод 16 МК ATMega8.
Аватара пользователя
Юрий Климчук
Открыл глаза
Сообщения: 48
Зарегистрирован: Вс авг 31, 2008 07:51:22
Откуда: Астрахань

Сообщение Юрий Климчук »

Собрал в железе, но работает не так как нужно, вместо 1 секунды получается где то 7 почему так может быть?
файл с прогой вложил
Как подключить внешнюю частоту вместо кварца? Имеется прецизионный генератор синусойда 8 МГц от 0 до 2 вольт, как не сжеть МК какие хар-ки сигнала: синусойда, прямоугольные импульсы?
номинальное напряжение сигнала?
И фузы вот так должны быть при внешнем сигнале?:
защита
..111111,
Конфигурация
ст 11011001, мл 11100001
Определил с помощью фуз-каркулятора.
Вложения
Taimer_ver2 - 222.rar
(79.01 КБ) 254 скачивания
Начинающий
Аватара пользователя
Digital
Открыл глаза
Сообщения: 78
Зарегистрирован: Сб сен 13, 2008 16:23:09
Откуда: Kaluga
Контактная информация:

Сообщение Digital »

Навскидку, скорее всего тактирование МК ведётся от внутреннего источника тактовой частоты, т.е. RC-генератора 1 МГц. Не включили вы видимо всё-таки внешнее тактирование от кварца. Это легко проверить: отпаять кварц (ну или хоть выводы его замкнуть между собой) и если счёт будет идти, то всё ясно.

П.С. прогу ещё не смотрел.
Последний раз редактировалось Digital Вт апр 21, 2009 18:41:35, всего редактировалось 1 раз.
Аватара пользователя
Digital
Открыл глаза
Сообщения: 78
Зарегистрирован: Сб сен 13, 2008 16:23:09
Откуда: Kaluga
Контактная информация:

Сообщение Digital »

Юрий Климчук писал(а):И фузы вот так должны быть при внешнем сигнале?: защита ..111111, Конфигурация ст 11011001, мл 11100001
Определил с помощью фуз-каркулятора.

Про фьюзы... ИМХО лучше по ДШ фьюзы нужные определять. В нём же и по поводу режимов расписано. С компьютерным переводчиком (хоть онлайн, хоть установленным) вполне сможете разобраться. А с подобными калькуляторами надо быть осторожнее (можно залочить кристалл), т.к. смотря с каким программатором работать с МК. Программные оболочки программаторов не все одинаково воспринимают фьюзы, некоторые с точностью наоборот. Фьюзы защиты лучше не трогайте (пусть по дефолту остаются).

1) Для переключения на внешний источник тактирования, по ДШ (см. стр.24), CKSEL3...0 нужно установить в 0000. Т.е. каждый из 4-х этих фьюзов в ноль. Ещё CKOPT Fuse надо запрограммировать. На стр.30 ДШ показана схема подачи внешнего сигнала тактирования. Но это тактирование вместо кварца.

2) Ещё можно тактировать сам таймер, тут по-другому чуток. Имеется ограничение в 2,5…3,5 такта между инкрементированием счётного регистра таймера и изменением состояния на входе (при 8МГц вполне можно пренебречь). Также внешняя частота должна быть вдвое (а лучше в 2,5 раза) меньше собственно частоты МК. Всё это можно прочитать на стр. 72… ДШ. Про подключение – там же.
**********
Сигнал должен быть - прямоугольных импульсов. Амплитуда - выше уровня логической "1" для данного МК, т.е. должна быть выше примерно 1,8 Вольт при питающем МК напряжении 5 Вольт, но не превышать напряжения питания МК (см. стр.263 ДШ).

Полный ДШ на ATMega8(L), если не скачивали ещё:
http://www.efo.ru/ftp/pub/atmel/_AVR_MC ... _U0808.pdf

ДШ на русском на ATMega128 (вполне справедливо и для младших МК этого семейства с некоторыми поправками естественно). ИМХО может сильно помочь в понимании работы МК:
http://www.gaw.ru/html.cgi/txt/doc/micr ... /index.htm
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Сообщение Барсик »

Юрий Климчук писал(а):Собрал в железе, но работает не так как нужно...

Надо бы всё сделать по-другому. Я уже объяснял в http://radiokot.ru/forum/viewtopic.php?t=14911 как лучше отсчитывать время. Для Вашего случая тоже надо установить для таймера1 режим CTC. Прескалер таймера и число в регистре сравнения, до которого он будет считать, подобрать так, чтобы перезапуск таймера происходил 1 раз в секунду. Настроить прерывание от таймера, которое называется "Compare A Match". Прерывание будет происходить 1 раз в секунду. В обработчике прерывания включить соленоид и уменьшать счётчик времени, и там же, в обработчике, выключить соленоид, когда время дойдёт до нуля.
В главной программе задать время счёта в секундах и дать команду на включение счётчика. Но выполнить команду только в обработчике прерывания. Кстати, в режиме CTC не требуется обнулять счётчик. Он обнуляется сам. Уже устал это повторять...

Юрий Климчук писал(а):Как подключить внешнюю частоту вместо кварца?...

Подать сигнал с Вашего претенциозного генератора через резистор 300 Ом - 1 кОм на вход XTAL1 контроллера. Лучше, чтобы это был меандр, положительные импульсы, амплитудой от 0 до + 5 вольт. Точнее, до напряжения питания микроконтроллера. Если есть только синус с амплитудой до 2 вольт, то на вход подать смещение с делителя напряжения - со входа на + питание и на землю по одному резистору по 10 кОм и последовательно с резистором 500 Ом включить керамический конденсатор 0,01 мкф.
Фьюзы CKSEL 0-3 установить в 0000.
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

Барсик писал(а): претенциозного генератора

Извините за вьедливотсь, но просто глаз резануло.
Прикольный, однако, генератор :) с претензиями.
Вообще правильно прецизионный.
Модератору.
Все, молчу, молчу.
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Сообщение Барсик »

Слово "прецизионный" мне известно... Да я так специально написал :) Автор ветки утверждает, что у него есть какой-то генератор со стабильностью 5 на 10 в минус девять. Т.е. генератор с претензиями... :) ...на эталон частоты. Ну, дык, от этого хуже не будет, даже если генератор с претензиями... :)

Да, кстати. Забыл спросить у автора ветки. Импульс управления соленоидом будет формироваться программно? И на что он похож? Если мне не изменяет память, чтобы запустить механический секундомер, надо нажать и отпустить кнопочку - он затИкает... А чтобы остановить, надо опять нажать и отпустить кнопочку... Или не так?
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Сообщение Барсик »

Поставил я смелый эксперимент. Подавал внешнюю тактовую частоту 8 МГц на ATmega8. Схема в прикошаченном файле.
Подавался синусоидальный сигнал до 2 вольт действующего значения (т.е. 2,8 амплитудой). Генератор больше не выдаёт. Использовался генератор высокой частоты Г4-158.
Делитель для подачи напряжения смещения ( R2, R3 ) расчитывался исходя из пороговых значений напряжений, приведённых в даташите. Согласно даташиту, при напряжении питания 5 вольт, нижний порог (когда считывается 0) примерно равен 1,3 вольта. Верхний порог (когда считывается 1) примерно равен 1,8 вольта. Т.е. гистерезис примерно 0,5 вольта. Делитель расчитывался на 1,5 вольта.
Пытался переменным резистором (вместо R2) подстроить смещение так, чтобы микроконтроллер работал при минимально возможном напряжении генератора. Пороговое напряжение генератора, при котором микроконтроллер ещё работал, получилось 400 мВ амплитудного значения. Сопротивление резистора R2 практически совпало с расчётным - 22 кОм.
Так что 1 - 2 вольта синусоидального сигнала вполне хватает для работы микроконтроллера.

Для проверки использовалась программа, текст которой опять же, в прикошаченном файле.
На таймере1 сделан генератор временных интервалов в 1 секунду. Выход генератора (точнее, регистра сравнения A) выведен на выход микроконтроллера OC1A (нога номер 15) для контроля частоты. На нём будет меандр частотой 0,5 Гц. Таймер работает в режиме CTC. По прерываниям от этого таймера включается/выключается "соленоид". На таймере2 сделан генератор временных интервалов в 1 миллисекунду. Выход генератора выведен, чисто для смеха, на выход микроконтроллера OC2 (нога номер 17). На нём будет меандр частотой 500 Гц. Таймер работает в режиме CTC. По прерываниям от этого таймера отсчитываются интервалы в 1 мс, для формирования длительности импульса включения "соленоида", а также, для формирования временнЫх задержек. Не люблю, знаете ли, функцию "delay". Предпочитаю собственную, привязанную к таймеру.

В заключение, совет. Как только Вы запрограммируете работу микроконтроллера от внешнего тактового генератора, то без этого самого генератора уже нельзя будет его программировать обычным программатором. Поэтому, лучше отлаживать программу при работе от внутреннего генератора 8 МГц, а потом уже перешить фьюзы на внешний.
Вложения
mega8ext.gif
(2.75 КБ) 572 скачивания
secmeter.c
(3.81 КБ) 280 скачиваний
Аватара пользователя
Юрий Климчук
Открыл глаза
Сообщения: 48
Зарегистрирован: Вс авг 31, 2008 07:51:22
Откуда: Астрахань

Сообщение Юрий Климчук »

Все заработало (не был подключен внешний кварц), посчитал отклонение измерением периода включения контрольного светодиода частотомером Ч3-54. Измерял период между положительными фронтами сигнала это 2 секунды период 2000021 мкс, то есть за минуту 630 мкс за час 630х60=37800 мкс и за сутки соответственно 907200 мкс или 0,9 сек, что вполне хватает.
Интересный, но для меня пока запутанный алгоритм использования таймеров предложил "Барсик", я так понимаю, что теперь можно устанавливать время включения электромагнита. Да сразу хочу ответить на вопрос, хотя Барсик и так на него ответил, а сигнал должен быть "1" на короткое время что бы через ключ запустить электромагнит.
Если развивать Ваш алгоритм, поясните уж до конца.
Как привезать кнопки для управления временем таймера и установкой времени срабатывания электромагнита. В программе безконечный цикл и че к чему привязывать так и не разобрался ну конечно есть и не понятные вещи там где 3600 ...+60 ...
Ну я смог только вывести время установки таймера на ЖКИ, пытался сделать так чтобы время согласно алгоритму уменьшалось, не знаю
как сделать
Вообще мой проект Taimer_ver2 - 222.rar выше прикрепленный уже испробован и показал свою работоспособность, но хочется развивать проект и попробывать алгоритм предложенный secmeter.c
Вложения
secmeter_Now.rar
(84.4 КБ) 267 скачиваний
Начинающий
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Сообщение Барсик »

Юрий Климчук писал(а):...но для меня пока запутанный алгоритм использования таймеров...

Алгоритм очень прост. Оба таймера работают в CTC моде, которая хороша тем, что таймер считает до определённого значения (заданного в регистре сравнения OCR) после чего сам перезапускается. Не путать перезапуск с переполнением! Переполнения не происходит! Процесс счёта идёт непрерывно без вмешательства программы. Значения регистров сравнения таймеров подобраны так, что перезапуск происходит каждую секунду у одного, и каждую миллисекунду у другого. Точность временных интервалов определятся только точностью тактовой частоты. При перезапуске таймеров происходят прерывания. В обработчике прерывания от таймера 1 влючается/выключается секундомер. Обработчик прерывания от таймера 2 используется для отсчёта миллисекундных импульсов для формирования импульса соленоида и для работы функции временнОй задержки.
Остаётся в главном цикле программы написать всё остальное :) :) :)

Юрий Климчук писал(а):...Как привезать кнопки для управления временем таймера и установкой времени срабатывания электромагнита. В программе безконечный цикл и че к чему привязывать...

В бесконечном цикле можно проверять состояние устройства. Если выключено, то вызывается функция обработки состояния "выключено". Если включено, то... Посмотрите заготовку в прикошаченном файле.

Юрий Климчук писал(а):...не понятные вещи там где 3600 ...+60 ...

Это что, заклинания (unsigned int) перед hour, min, sec ? Это приведение переменных char к типу int. А то компилятор может использовать арифметику для char, и тогда не хватит точности.
Кстати. В программе небольшая засада. Для отсчёта времени используется переменная unsigned int, максимальное значение которой 65535. Поэтому её хватит только на 18 часов 12 минут и 15 секунд. Если требуется бОльший интервал, то придётся нспользовать long int ...

Да, и ещё. Не понятен Ваш алгоритм работы с устройством, и в частности, сколько кнопок, как на них нажимать, что они должны делать и куда подключены. Судя по Вашей программе, к порту C. Но направление порта почему-то на вывод...
Вложения
secmeter.c
Это ЗАГОТОВКА, а не программа
(5.8 КБ) 277 скачиваний
Аватара пользователя
Digital
Открыл глаза
Сообщения: 78
Зарегистрирован: Сб сен 13, 2008 16:23:09
Откуда: Kaluga
Контактная информация:

Сообщение Digital »

Юрий Климчук писал(а):Измерял период между положительными фронтами сигнала это 2 секунды период 2000021 мкс, то есть за минуту 630 мкс за час 630х60=37800 мкс и за сутки соответственно 907200 мкс или 0,9 сек, что вполне хватает.

А точность до 0,0375 в час вы на какой тактовой частоте МК получили? Подстраивали частоту работы кварца или нет?

Барсик писал(а):Значения регистров сравнения таймеров подобраны так, что перезапуск происходит каждую секунду у одного, и каждую миллисекунду у другого.

А если коэффициенты пересчёта (прескалер*OCR) таймеров не будут кратны один другому, то может быть так, что прерывания пересекутся и одно из них не будет обработано вовремя? Как в таком случае вы обычно поступаете?

Поясните ещё пожалуйста, что достигалось вами в программе secmeter.c запрещением и разрешением всех прерываний в цикле while(1)?
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Сообщение Барсик »

Digital писал(а):...может быть так, что прерывания пересекутся и одно из них не будет обработано вовремя?

Дык они и так пересекаются каждую секунду. Пока одно из них обрабатывается, то прерывания запрещены. Но флаг второго прерывания остаётся торчать. Как только выйдет из первого обработчика, то прерывания становятся разрешёнными, и тут же начнётся обработка второго прерывания.

Digital писал(а):...Поясните ещё пожалуйста, что достигалось вами в программе secmeter.c запрещением и разрешением всех прерываний в цикле while(1)?

Ну, типа, бережёного бог бережёт. Не хочу, чтобы прерывание вдруг случилось, когда я меняю переменные, которые используются в этом прерывании - значение выдержки времени и статус... Оно же меняется не мнгновенно. Из этих двух строчек получается много ассемблерных команд... Кстати, в функции временной задержки я забыл это сделать...
Аватара пользователя
Юрий Климчук
Открыл глаза
Сообщения: 48
Зарегистрирован: Вс авг 31, 2008 07:51:22
Откуда: Астрахань

Сообщение Юрий Климчук »

А точность до 0,0375 в час вы на какой тактовой частоте МК получили? Подстраивали частоту работы кварца или нет?

Ни чего не подстраивал, собрал на макете и измерил.
Digital писал(а):
Не понятен Ваш алгоритм работы с устройством, и в частности, сколько кнопок, как на них нажимать, что они должны делать и куда подключены.

Да ошибку я нашел, поставил как надо
PORTC=0xFF;
DDRC=0x00;
Кн.1 мин+, Кн.2 мин-, Кн.3 час+, Кн.4 час-, кн5 наверно режим (установка таймера иначе соленоид) еще пуск и стоп (сброс)
По алгоритму secmeter.c . ЯЧ понимаю что это заготовка но я так и не понял, пытался все равно не получается как привязать установку таймера и соленойда к кнопкам, как запустить и остановить
счет и не нужно чтобы при включении она уже считала.
meter_on_time = 3600*(unsigned int)hour + 60*(unsigned int)min + (unsigned int)sec; не понял, переменной присваеваем час мин и сек так что ли, а как выводить на ЖКИ и менять отдельно час или мин.
Что бы остановить или запустить счет нужно работать с регистрами таймера или использовать
volatile enum // состояния секундомера
{
off, // выключен
must_on, // надо включить
on, // включён
must_off // надо выключить
}meter_status;
то есть
IF if (PINC.1==0)
{meter_status=must_on} так? ли must_off
это запустит или остановит счет?
Последний раз редактировалось Юрий Климчук Вт апр 28, 2009 06:13:14, всего редактировалось 1 раз.
Начинающий
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Сообщение Барсик »

Мне необходим тайм-аут до завтра. А то я тут случайно тяпнул валерьянки и не могу отвечать на умные вопросы. Могу только мурлыкать :)
Аватара пользователя
Digital
Открыл глаза
Сообщения: 78
Зарегистрирован: Сб сен 13, 2008 16:23:09
Откуда: Kaluga
Контактная информация:

Сообщение Digital »

Юрий Климчук писал(а):Digital писал(а):
Не понятен Ваш алгоритм работы с устройством, и в частности, сколько кнопок, как на них нажимать, что они должны делать и куда подключены.

Это не я :) Это Барсик.
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Сообщение Барсик »

Юрий Климчук писал(а):...как привязать установку таймера и соленойда к кнопкам, как запустить и остановить
счет...

До главного цикла while(1) установить статус meter_status = off. В главном цикле проверять статус.

Код: Выделить всё

while (1)
    {
        //проверяем состояние нашей шарманки
        // в зависимости от этого вызываем соответствующую функцию
        switch(meter_status)
        {
            case off: // выключена
                statusOffExecute(); // вызываем функцию состояния "выключено"
                break;
            case on: // включена и тИкает...
                statusOnExecute(); // вызываем функцию состояния "выключено"
                break;

            default: // в прочих случаях ничего делать не надо.
                break;
         }
    };

Внутри функции statusOffExecute() ждём нажатия на кнопки. Если нажаты кнопки установки времени, то устанавливается время. Если нажата кнопка "старт", то выполняется такой кусок кода, который запускает секундомер:

Код: Выделить всё

// запуск секундомера
#asm("cli") // запрещаем все прерывания
// устанавливаем время
meter_on_time = 3600*(unsigned int)hour + 60*(unsigned int)min + (unsigned int)sec;
// устанавливаем статус
meter_status = must_on;
#asm("sei") // разрешаем прерывания
// Теперь секундомер включится сам, когда надо при первом же прерывании
// выключится тоже сам...

Когда он включится, то статус изменится на "on", и в главном цикле будет вызываться функция statusOnExecute(). Внутри этой функции отображаем время, которое осталось до выключения, и ждём нажатия на кнопку "стоп", если вдруг приспичит прервать процесс...
Аватара пользователя
Юрий Климчук
Открыл глаза
Сообщения: 48
Зарегистрирован: Вс авг 31, 2008 07:51:22
Откуда: Астрахань

Сообщение Юрий Климчук »

Ну вроде запихнул кнопки в последний вариант предложенный тов. Digital, только вот непонятно, это вот такой алгоритм должен быть? или я чтото не так сделал:

Код: Выделить всё

void statusOnExecute(void) // функция обработки состояния "включено"
{
// индикация текущего времени (сколько осталось)
// принудительное выключение по нажатии кнопки
        if (PINC.0==0)    //ХОЧУ ЗАПУСК 
        {timeDelayMs(250);
        meter_status = must_on;} // СТРАБАТЫВАЕТ ТОЛЬКО СВЕТОДИОД СОЛЕНОИДА, должно быть, но время на убыль не пошло
        if (PINC.1==0)     
        //ХОЧУ СТОП, ПРИ УДЕРДЖАНИИ КН. ВРЕМЯ НАЧИНАЕТ УБАВЛЯТСЯ НА ЖКИ, и мигает светодиод соленойда
        {timeDelayMs(250);
        meter_status = off;}
        if (PINC.2==0)
        {timeDelayMs(250);
        min++;}
        if (PINC.3==0)
        {timeDelayMs(250);
        min--;}
        if (PINC.4==0)
        {timeDelayMs(250);
        hour++;}
        if (PINC.5==0)
        {timeDelayMs(250);
        hour--;}
       
        lcd_gotoxy(0,0);
        lcd_putsf("Taimer: ");
        lcd_putchar(hour/10+0x30);
        lcd_putchar(hour%10+0x30);       
        lcd_putchar(':');
        lcd_putchar(min/10+0x30);
        lcd_putchar(min%10+0x30);
        lcd_putchar(':');
        lcd_putchar(sec/10+0x30);
        lcd_putchar(sec%10+0x30);
}


На всякий случай прикрепляю файл с прогой и в протеусе посмотреть, мне уже впринципе не надо изменять внешне кн. время срабатывания соленойда, только время менять необходимо, а вообще минимально время макс 9999 сек так, что 18 час вполне достаточно.
Вложения
secmeter3.rar
(85.88 КБ) 250 скачиваний
Начинающий
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Сообщение Барсик »

Юрий Климчук писал(а):Ну вроде запихнул кнопки в последний вариант предложенный тов. Digital,...

А какой вариант предложил Digital? Вариант - в студию!
Аватара пользователя
Юрий Климчук
Открыл глаза
Сообщения: 48
Зарегистрирован: Вс авг 31, 2008 07:51:22
Откуда: Астрахань

Сообщение Юрий Климчук »

Барсик писал(а):
Юрий Климчук писал(а):Ну вроде запихнул кнопки в последний вариант предложенный тов. Digital,...

А какой вариант предложил Digital? Вариант - в студию!


Да видимо я пересидел над проектом, начал путать все, проект Барсика
Извините!
Начинающий
Аватара пользователя
Digital
Открыл глаза
Сообщения: 78
Зарегистрирован: Сб сен 13, 2008 16:23:09
Откуда: Kaluga
Контактная информация:

Сообщение Digital »

Барсик писал(а):А какой вариант предложил Digital? Вариант - в студию!

Моего варианта нет как такового, я лишь теорию немного осветил вначале, т.к. видел, что с этим проблемы у автора и предложил варианты решения возникающих вопросов на этапе зарождения устройства и т.п. Мне кажется и без моего (несуществующего) варианта неплохо получается :) .

Юрий Климчук писал(а):Да видимо я пересидел над проектом, ...

Отдохните, до тех пор, пока снова не появится желание продолжать проект. И так круто стартанули для начала ИМХО.
Ответить

Вернуться в «AVR»