Страница 1 из 1
Простые LED часы на ATMega8. Помогите оптимизовать код.
Добавлено: Чт фев 05, 2009 19:45:28
Тарас
Здраствуйте коллеги))
Я зделал часы со стандартной функцыи по работе с LED дисплеем, функцыю увидел на
http://www.pcports.ru/articles/avr4.php
Проблема в том что как выбираю время или минуты, светиться только один сегмент, помогите устранить ету проблему.
И посоветуйте как его лутше доделать, столит ли менять частоту на 16 МГц?
Прилагаю есходник (Code Vision AVR) и протеус.

Добавлено: Сб фев 07, 2009 03:18:43
sheva_s
Я неспециалист в програмировании, но у тебя неправильно сделана динамическая индикация чисел, принцип правильный , но не там она стоит. Получаеться пока кнопки не трогаеш у тебя индикация показывает нормально получаеться загораються по программе 1-2-3-4 индикатор и после идет обработка кнопок пока нетрогаеш все нормально только нажал идет задержка 1/4 сек. так в программе написано для обработки кнопки и при этом у тебя горит 4-й индикатор как последний который включился и горит он эти 1/4 секунды далее если держиш кнопку опять у тебя включаються первые 3 индикатора свечение которого наверное незамечаеш так как задержка на индикацию стоит 5 миллисекунд и сново загораеться 4 индикатор и пока очередь дойдет до 1 индикатора происходит обработка кнопки с задержкой 1/4 сек.
Я бы ее перенес индикацию в прерывание можно в то что у тебя есть правда оно настроено на 1 гц сделай к примеру 400 гц и введи еще 1 переменную чтобы считала количество прерываний насчитала 400 прерываний значит прошла 1 секунда. В прерывании обрабатывай индикаторы следующим образом:
на каждый индикатор отводи по 100 герц тобто каждый индикатор у тебя будет включаться по 100 раз в секунду в куче это будет 400 герц.
Алгоритм такой заводиш переменную А и при каждом прерывании прибавляеш к ней 1 далее сравниваеш получившеесе число с числом номера цифры и включаеш этот индикатор остальные при этом погашеные. Выходим с прерывания. При следующем прерывании сново пребавляем 1 к А выключаем все индикаторы, сравниваем А с числом и включаем нужный разряд. Если у тебя 4 разряда значит А должна считать от 1-4, когда станет 5 присваиваем значение 1.
Примерно так должно это выглядеть.
Код: Выделить всё
if (a==5) a=1; else a++;
switch (a) {
case 1 : {Display(hour);PORTB=254;PORTD=Disp6;}; break;
case 2 : {Display(hour);PORTB=253;PORTD=Disp7;}; break;часов
case 3 : {Display(min);PORTB=251;PORTD=Disp6;}; break;
case 4 : {Display(min);PORTB=247;PORTD=Disp7;}; break;
}
Подпрограмму разложения десятичного числа нужно будет записать выше подпрограммы обработки прерывания иначе компилятор будет выдавать ошибку.
Можеш попробывать просто заменить свой код вывода чисел моим только обьяви переменную А. если он будет работать значит правильно написал тогда переноси его в прерывания как я написал и будет у тебя все работать так как должно.
Отпишешся о результате интересно помогло ли тебе то что я тут написал.
Добавлено: Сб фев 07, 2009 12:51:13
Krik99
Пример динамической индикации с использованием таймера есть у меня на сайте под кнопкой "WWW".
Добавлено: Сб фев 07, 2009 13:22:45
Тарас
А вот у меня появилась идея

, чтобы в бесконечном цыкле были только обработки кнопок, а для индикацыи использовать второй таймер. Попробую зделать и скажу)
KIRK99 у тебя нет для 4 символов

а только для 3-х
Добавлено: Сб фев 07, 2009 14:42:58
sheva_s
Можно использовать второй таймер это даже будет лучшим вариантом.
Добавлено: Вс фев 08, 2009 14:53:19
Тарас
Я установил опрос кнопок в 1 таймер там где и считает секунды, а вывод в бесконечном цыкле, долго правде время настраивать но вполне нормально работает))
Добавлено: Вс фев 08, 2009 19:26:21
Pippeytz
А кварц на 16мгц зачем?
Добавлено: Вс фев 08, 2009 21:02:14
Krik99
Тарас писал(а):KIRK99 у тебя нет для 4 символов

а только для 3-х
Да там при елементарном знании Си можно за 10минут увеличить число символов и до 6.
Тарас писал(а):Я установил опрос кнопок в 1 таймер там где и считает секунды, а вывод в бесконечном цыкле, долго правде время настраивать но вполне нормально работает))
Таймер который ведёт отсчёт, не должен быть нечем занят кроме как подсчёта времени. опрос кнопок лутче засунуть в таймер который выводит динамическую индикацию, или в основную программу.
Добавлено: Пн фев 09, 2009 09:56:26
sheva_s
Тарас писал(а):Я установил опрос кнопок в 1 таймер там где и считает секунды, а вывод в бесконечном цыкле, долго правде время настраивать но вполне нормально работает))
Попробуй увеличить частоту прерывания таймера с 1 раза в секунду до двух тогда опрос кнопок будет производиться 2 раза в секунду, а секунду считаеш так прошло 2 прерывания значит прошла 1 секунда, и будут кнопки обрабатываться быстрее. Убери с прерывания строку sec++; перенастрой таймер что бы он срабатывал 2 раза в секунду,
обьяви глобальную переменную к примеру А и в прерывании допиши такую строку.
if (A==2) (A=0; sec++; ); else A++;