CodeVision AVR в вопросах и ответах
хочу сделать секундомер с четырмя семисигментами. не могу составить алгоритм. нужно что бы по нажатию кнопки начинался счет. таймеры не используем. задержки. задержка 0.1 сек. по достижению десяти по 0.1 сек добавляем следующий десяток. считаем секунды. по достижению 60 сек начинаем считать минуты. далее 60 мин и считаем часы. 4 сигментника. индикация динамическая. с алгоритмом что то запутался. при еще одном нажатии кнопки секундомер останавливается. зацикливается. еще одно нажатие и сброс. задачка для меня тяжеленькая но я справлюсь. просто алгаритм этот и еще индикация динамическая пугает
- Реклама
Ну и напрасно.mixon46 писал(а):таймеры не используем
Настройте таймер на 1 мс, в нём реализуйте динамическую индикацию и там же отсчитывайте свои интервалы. 1000 раз вызвался обработчик - прошла секунда.
Туда же и опрос кнопок запихните.
я таймеры еще не проходил. вот занимаюсь. научился цыфру выводить на сигментник. вот чисто для того что бы понять как можно было бы осуществить прибавление следующего разряда. пока что могу только так выводить
void main (void)
{...
...
...
while (1)
{
PORTB=0b00111111;
delay_ms (100);
PORTB=0b00100100;
delay_ms (100);
и так далее до 9.
}
}
могу сравнивать. переменную ввести. надо алгоритм. хотя бы для двух сигментов. главное понять как добавлять следующий десяток
void main (void)
{...
...
...
while (1)
{
PORTB=0b00111111;
delay_ms (100);
PORTB=0b00100100;
delay_ms (100);
и так далее до 9.
}
}
могу сравнивать. переменную ввести. надо алгоритм. хотя бы для двух сигментов. главное понять как добавлять следующий десяток
Ну вот, настало самое время их изучить. Ибо текущая задача без них превратиться в долгий и геморройный путьmixon46 писал(а):я таймеры еще не проходил
ладно. а как можно было бы упростить перебор цыфр на сигменте что бы не писать 10 строчек. прибавлять там регистр +1 или еще как то. мне бы это надо знать
- Реклама
Непонятно, что Вы хотите упростить
Тот код, который Вы показали - это всего лишь вывод данных в порт и очень далёк от динамической индикации.
В сети полно статей на эту тему, поищите...
В сети полно статей на эту тему, поищите...
да что неясного. у меня два семисигментника. они подключены к порту B. их минусы подключены через транзисторы к двум портам и управляются по очереди через порт D1 и D2. к D0 подключена кнопка. алгоритм такой. на двух сигментах по нулям. по нажатию кнопки мк начинает считать и выводить одновременно на сигмент цыфры по возврастающей. соответственно когда на одном сигменте цыфра дойдет до 9 и с следующим счетом на другом сигменте прибавится единица и счет продолжится.
00
кнопка была нажата и пошел счет
01
02
03
04
05
06
07
08
09
далее счет начинается с 10 тоесть прибавляем следующий десяток. и так каждый раз когда дойдет до x9
10
11
12
13 и так далее
и вот я не могу чет сообразить как бы это написать програмно
00
кнопка была нажата и пошел счет
01
02
03
04
05
06
07
08
09
далее счет начинается с 10 тоесть прибавляем следующий десяток. и так каждый раз когда дойдет до x9
10
11
12
13 и так далее
и вот я не могу чет сообразить как бы это написать програмно
- Сообщения: 574
- Зарегистрирован: Вт ноя 02, 2010 17:46:37
mixon46, по смотрите в сторону преобразования в двоично-десятичный формат.
вкратце после преобразования каждый разряд будет находится в своих перемененных. в вашем случае простейшее преобразование будет делением на 10. т.е у вас есть переменная которая принимает значение от 00 до 99 (к примеру 54)
после деления 10 целую часть (5) выводите на первый индикатор а остаток (4) на второй.
Либо вообще сделать 2 переменных
вкратце после преобразования каждый разряд будет находится в своих перемененных. в вашем случае простейшее преобразование будет делением на 10. т.е у вас есть переменная которая принимает значение от 00 до 99 (к примеру 54)
после деления 10 целую часть (5) выводите на первый индикатор а остаток (4) на второй.
Либо вообще сделать 2 переменных
Код: Выделить всё
a++;
if(a>9){
a=0;
b++;
}
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
пока ничего не сделал. в сторону массивов и переменных клонит. некогда было делать пока что
Здравствуйте, есть задача разложить пятизначное число на разряды. Делаю так:
После этой функции - вывод на lcd1100
Но в Протеусе тупит ужасно, может есть какой другой способ сделать это, с меньшими затратами ресурсов МК. Или это нормально?
Код: Выделить всё
void bcd(unsigned int s) // функция разложения
{
c4=0;c3=0;c2=0;c1=0;
while (s>=10000){s-=10000;c4++;}
while (s>=1000){s-=1000;c3++;}
while (s>=100){s-=100;c2++;}
while (s>=10){s-=10;c1++;}
c0=s;
}Но в Протеусе тупит ужасно, может есть какой другой способ сделать это, с меньшими затратами ресурсов МК. Или это нормально?
Что значит "тупит" ? Если тормозит, то скорее всего не из-за куска кода, а из-за низкой производительности ПК.
Да пк слабоват, но без этой строчкиАlex писал(а):Что значит "тупит" ? Если тормозит, то скорее всего не из-за куска кода, а из-за низкой производительности ПК.
Код: Выделить всё
while (s>=10000){s-=10000;c4++;}На железе только вечером могу попробовать. Я просто предположил что если ПК тормозит, то МК тоже будет тяжело, просто в программе еще куча функций кроме этой, и хотелось бы минимально загружать контроллер, вот и спрашиваю нужно менять эту функцию или так нормально будет работать?
так и хочется сказать на великом и могучем все, что я думаю по этому поводу "разбиения по разрядам"...
мало того, что есть itoa, оптимальнее которой вряд ли у кого хватит тямки сделать, так есть и тривиальнейший алгоритм, который, если вспомнить школьную математику, прост, как колумбово яйцо! специально ведь статью даже сделал по этой теме: Вывод чисел на дисплей
так нет же, каждый норовит изобрести свой виласипет, да еще и ромбовидными колесами с карданным приводом...
мало того, что есть itoa, оптимальнее которой вряд ли у кого хватит тямки сделать, так есть и тривиальнейший алгоритм, который, если вспомнить школьную математику, прост, как колумбово яйцо! специально ведь статью даже сделал по этой теме: Вывод чисел на дисплей
так нет же, каждый норовит изобрести свой виласипет, да еще и ромбовидными колесами с карданным приводом...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Да нормальный способ, ненамного хуже других.Самый простой, конечно, atoi, можно и обычным делением или побитовым шаманством. По скорости способ вычитания степеней деяти уделывает многих, включая тое же atoi, побитовое шаманство и (вот это совсем не удивительно) sprintf.
- Сообщения: 289
- Зарегистрирован: Ср дек 01, 2010 23:24:16
Добрый вечер. При попытке считать МК выдает следующее. Програматор AVR910. В програмировании ноль. Что делать дальше? Заранее спасибо.
- Вложения
-
- Fo_6zXgMLfI.jpg
- (40.02 КБ) 466 скачиваний
А считать пытаетесь AT90S2313? Не?
Docendo discimus
- Сообщения: 289
- Зарегистрирован: Ср дек 01, 2010 23:24:16
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Кажется, программатор найти не может, или он выдает неожиданные ответы. Можно проверить, каким com-портом он себя считает (avrprog вроде только до 4 считать умеет), можно проверить контакты и монтаж, можно ресетнуть его во время работы.


