Здраствуйте коллеги))
Я зделал часы со стандартной функцыи по работе с LED дисплеем, функцыю увидел на http://www.pcports.ru/articles/avr4.php
Проблема в том что как выбираю время или минуты, светиться только один сегмент, помогите устранить ету проблему.
И посоветуйте как его лутше доделать, столит ли менять частоту на 16 МГц?
Прилагаю есходник (Code Vision AVR) и протеус.
Я неспециалист в програмировании, но у тебя неправильно сделана динамическая индикация чисел, принцип правильный , но не там она стоит. Получаеться пока кнопки не трогаеш у тебя индикация показывает нормально получаеться загораються по программе 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;
}
Подпрограмму разложения десятичного числа нужно будет записать выше подпрограммы обработки прерывания иначе компилятор будет выдавать ошибку.
Можеш попробывать просто заменить свой код вывода чисел моим только обьяви переменную А. если он будет работать значит правильно написал тогда переноси его в прерывания как я написал и будет у тебя все работать так как должно.
Отпишешся о результате интересно помогло ли тебе то что я тут написал.
Последний раз редактировалось sheva_s Сб фев 07, 2009 14:43:31, всего редактировалось 1 раз.
А вот у меня появилась идея , чтобы в бесконечном цыкле были только обработки кнопок, а для индикацыи использовать второй таймер. Попробую зделать и скажу)
Я установил опрос кнопок в 1 таймер там где и считает секунды, а вывод в бесконечном цыкле, долго правде время настраивать но вполне нормально работает))
Тарас писал(а):KIRK99 у тебя нет для 4 символов а только для 3-х
Да там при елементарном знании Си можно за 10минут увеличить число символов и до 6.
Тарас писал(а):Я установил опрос кнопок в 1 таймер там где и считает секунды, а вывод в бесконечном цыкле, долго правде время настраивать но вполне нормально работает))
Таймер который ведёт отсчёт, не должен быть нечем занят кроме как подсчёта времени. опрос кнопок лутче засунуть в таймер который выводит динамическую индикацию, или в основную программу.
Тарас писал(а):Я установил опрос кнопок в 1 таймер там где и считает секунды, а вывод в бесконечном цыкле, долго правде время настраивать но вполне нормально работает))
Попробуй увеличить частоту прерывания таймера с 1 раза в секунду до двух тогда опрос кнопок будет производиться 2 раза в секунду, а секунду считаеш так прошло 2 прерывания значит прошла 1 секунда, и будут кнопки обрабатываться быстрее. Убери с прерывания строку sec++; перенастрой таймер что бы он срабатывал 2 раза в секунду,
обьяви глобальную переменную к примеру А и в прерывании допиши такую строку.