Страница 1 из 1

mega8 таймер для управления нагрузкой

Добавлено: Вт апр 13, 2010 10:47:21
SoulKeeper
Доброго времени суток, Уважаемые Форумчане!
я только начинаю осваивать мк поэтому прошу ногами сильно не пинать.
встал вопрос в разработке первого устройства. почитал обучалку. многое понятно но больше пока что непонятно. посему вопрошаю:

суть устройства: 4 семисегментника в динамической индикации, клавиатура из 3х кнопок,
твердотельное реле, 2 светодиода. (обвязку не описываю, устройство в железе уже готово, дело встало в прошивке) нужно чтоб при подаче питания на индикацию выводилось последнее установленное значение времени. при нажатии "старт" запускается обратный отсчет и включается твердотельное. по окончании времени реле отключает нагрузку. оставшиеся 2 кнопки для установки времени(шаг 5 секунд, при удержании "скоростная перемотка" {это отдельный вопрос}). прощу помочь составить алгоритм работы этой хитрой приблуды :)

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

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

заранее спасибо. прощу прощения за ламерские вопросы.

Re: mega8 таймер для управления нагрузкой

Добавлено: Вт апр 13, 2010 11:06:18
Mamonth
В сохранении предидущих установленных значений Вам поможет энергонезависимая память - ЕЕПРОМ. Открывайте даташит на МК и смотрите как с ним работать.

Тактовая частота с секундами связана очень просто F=1/T . Т.е. если МК работает с тактовой 15 МГц например, то в секунду он выполняет 15 млн операций, а каждая операция выполняется 66 нСек... вот отсуда и пляшите. :)

Удачи!

Re: mega8 таймер для управления нагрузкой

Добавлено: Вт апр 13, 2010 15:24:05
pyzhman
SoulKeeper писал(а):вопрос номер раз: как описать сам таймер обратного отсчета?

Определяете переменную. При установке времени засылаете в нее количество времени для счета. При отсчете уменьшаете ее и проверяете на ноль. Когда достигли нуля, то свистим, моргаем, пищим.

SoulKeeper писал(а):вопрос номер два: я по неопытности подключил семисегментники к пинам разных портов (b и C) можно ли программно это учесть или придется переделывать железо?

Можно и даже нужно. Чем и хороши программируемые вещи. Как удобно трассировать плату!

На третий вопрос ответ уже дан уважаемым Mamonth.

Re: mega8 таймер для управления нагрузкой

Добавлено: Вт апр 13, 2010 15:42:41
SoulKeeper
спасибо что откликнулись :) буду пробовать.

по поводу алгоритма работы есть мысли?

Re: mega8 таймер для управления нагрузкой

Добавлено: Вт апр 13, 2010 16:33:12
pyzhman
Вы бы представили свой вариант. Дабы оттолкнуться от чего. А-то как-то неинтересно в одни ворота...

Re: mega8 таймер для управления нагрузкой

Добавлено: Вт апр 13, 2010 17:51:50
SoulKeeper
мне видится это всё примерно так:
1)векторы прерываний, настройка стека, портов
2)главный цикл
2.1 вызываем индикацию (на ней какое то значение предварительно вбитое в еепром, предположим 10.00 минут)
2.2 вызываем опрос клавиатуры
2.2.1 если нажата старт - запускаем обратный отсчет.
2.2.2 если нажата клавиша минус - уменьшаем значение таймера на 5 секунд
2.2.3 если нажат плюс - то соответственнно увеличиваем на 5 секунд
2.2.4 если ничего не нажато - ждём старта.

индикация: ну тут вроде как понятно, массив, таблица истинности, декодер, вывод


я никогда не программировал для МК...вообще никогда не программировал :) я технолог по профессии :)
чесно говоря мне смутно представляется порядок действий, поэтому и прошу совета.

я НЕ предлагаю сделать ЗА меня. я хочу разобраться САМ. я почитал форум, посмотрел некоторые исходники, но там всё так завернуто...много нюансов всяких. курю дш по меге пытаюсь вникнуть.

мне кажется надо сначала написать толковый алгоритм, а потом уже переложить в асм проще будет.

Re: mega8 таймер для управления нагрузкой

Добавлено: Вт апр 13, 2010 19:24:22
pyzhman
Ваш алгоритм – решение в лоб. Когда начнете писать, то это раздуется так, что сам черт ногу сломит. Мое видение следующее. Поскольку используется динамическая индикация, то надо привязать ее к четким временным параметрам. Опять же опрос клавиатуры. С целью устранения дребезга контактов (надеюсь в курсе, что это такое) ее тоже желательно привязать к опросу через определенные интервалы. Поэтому все эти вещи привязываем к таймеру, например к timer0, а вернее к обработчику его прерывания по переполнению. Вопрос в том, как часто вызывать это прерывание. Имеем 4 индикатора. Частота обновления должна быть 50 Гц – знаете, наверное, почему. Т.е. за 20 мсек должны обновиться все четыре. Итого, на каждый индикатор по 5 мсек. Принимаем время вызова прерывания от timer0 5 мсек. Кстати этого же времени достаточно для борьбы с дребезгом. Именно на это время и настраиваем timer0 при инициализации. Алгоритм обработки прерывания м.б. следующий с учетом счета времени:
1. сохраняем используемые регистры.
2. берем следующий для отображения индикатор.
3. выводим на него информацию.
4. сохраняем предыдущее состояние кнопок.
5. считываем состояние кнопок.
6. если предыдущее состояние и текущее равны, то рассчитываем что нажато и что отпущено. По нажатым кнопкам формируем соответствующие флаги.
7. если взведен флаг старта, то уменьшаем время.
8. если время истекло, то выключаем реле и сбрасываем флаг старта.
9. восстанавливаем используемые регистры.
Если пишем в Си, то п.1 и 2 исключаем, все пройдет автоматом.

Основное тело м.б. таким:
1. Инициализация портов и таймера.
2. считывание данных из ЕЕПРОМ.
3. ожидание нажатия кнопок.
4. если старт, то взводим флаг старта и включаем реле.
5. если «-», то уменьшаем время на N и записываем его в ЕЕПРОМ.
6. если «+», то увеличиваем время на N N и записываем его в ЕЕПРОМ.
7. уходим на п.3
Примерно так. Надеюсь ясно изъяснился. :write:

Re: mega8 таймер для управления нагрузкой

Добавлено: Чт апр 15, 2010 13:12:41
SoulKeeper
спасибо за развернутый ответ. в принципе всё ясно на данный момент...начал писать фирмварь, вот вы говорите по настраиваем таймер0 на переполнение на 5мсек...каким образом? кварц стоит 12МГц, соответственно период 83нСек (если я правильно посчитал)
то ближайшее значение по переполнению 5.439 мсек. (с предделителем 256). если я правильно курю даташит то 0 таймер не имеет прерывания компаратора...только по переполнению. значит нужно взять 16битный таймер 1 и инициализировать прерывание компаратора...на 5 мсек, правильно?

Re: mega8 таймер для управления нагрузкой

Добавлено: Чт апр 15, 2010 15:19:33
pyzhman
Можно гибко менять время прерывания по переполнению, изменяя значение регистра TCNT0. В вашем случае в обработчике прерывания надо поставить команду TCNT0= 0x16 и будет вам счастье - время счета от 0х16 до 0хFF около 5 мсек.

Re: mega8 таймер для управления нагрузкой

Добавлено: Чт апр 15, 2010 18:33:28
SoulKeeper
господин Mamonth, вы писали что можно программно учесть то что у меня сегменты индикотора подвешены к пинам разного порта..можно узнать как? весь вечер голову ломаю. у меня получается следующая картина:

A - PB4
B - PB0
C - PB3
D - PD5
E - PB2
F - PD6
G - PB1
DP - PD7

сел писать массив с таблицей истинности семисегментного декодера и встал.... получается нужно вывести 2 байта в 2 порта, так чтоли? т.е. как бы 2 части одного числа. о_О или это как то по другому можно сделать?

поискал подобные проблемы у народа...ничего путного не нашел. видимо все нормальные коты (или их хозяева) вешают индикацию на 1 порт)

Re: mega8 таймер для управления нагрузкой

Добавлено: Ср апр 21, 2010 10:37:10
pyzhman
Я бы сделал так:
.
.
.
const char segm[]= {0x7D, 0x09, 0x37, 0x3B, 0x4B, 0x7A, 0x7E, 0x19, 0x7F, 0x7B};//0...9
char data;//какую цифру надо отобразить
bit DP;//значение запятой
.
.
.
PORTB= PORTB & 0xE0 | (segm[data] & 0x1F);
PORTD= PORTD & 0x1F | (segm[data] & 0xE0);
PORTD.7= DP;

Re:

Добавлено: Ср апр 21, 2010 11:51:13
pyzhman
_noise писал(а):И исправлять (настраивать) по ситуации.

Не есть ли это как раз частным случаем? То, что вы предложили, уважаемый коллега, - табличное программирование. Имеет право быть. Равно как и все остальные. Право заказчика выбирать. :beer: