CodeVision AVR в вопросах и ответах
- mixon46
- Говорящий с текстолитом
- Сообщения: 1644
- Зарегистрирован: Сб фев 18, 2012 15:42:29
- Откуда: Курск
Re: CodeVision AVR в вопросах и ответах
хочу сделать секундомер с четырмя семисигментами. не могу составить алгоритм. нужно что бы по нажатию кнопки начинался счет. таймеры не используем. задержки. задержка 0.1 сек. по достижению десяти по 0.1 сек добавляем следующий десяток. считаем секунды. по достижению 60 сек начинаем считать минуты. далее 60 мин и считаем часы. 4 сигментника. индикация динамическая. с алгоритмом что то запутался. при еще одном нажатии кнопки секундомер останавливается. зацикливается. еще одно нажатие и сброс. задачка для меня тяжеленькая но я справлюсь. просто алгаритм этот и еще индикация динамическая пугает
- Реклама
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Ну и напрасно.mixon46 писал(а):таймеры не используем
Настройте таймер на 1 мс, в нём реализуйте динамическую индикацию и там же отсчитывайте свои интервалы. 1000 раз вызвался обработчик - прошла секунда.
Туда же и опрос кнопок запихните.
- mixon46
- Говорящий с текстолитом
- Сообщения: 1644
- Зарегистрирован: Сб фев 18, 2012 15:42:29
- Откуда: Курск
Re: CodeVision AVR в вопросах и ответах
я таймеры еще не проходил. вот занимаюсь. научился цыфру выводить на сигментник. вот чисто для того что бы понять как можно было бы осуществить прибавление следующего разряда. пока что могу только так выводить
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.
}
}
могу сравнивать. переменную ввести. надо алгоритм. хотя бы для двух сигментов. главное понять как добавлять следующий десяток
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Ну вот, настало самое время их изучить. Ибо текущая задача без них превратиться в долгий и геморройный путьmixon46 писал(а):я таймеры еще не проходил
- mixon46
- Говорящий с текстолитом
- Сообщения: 1644
- Зарегистрирован: Сб фев 18, 2012 15:42:29
- Откуда: Курск
Re: CodeVision AVR в вопросах и ответах
ладно. а как можно было бы упростить перебор цыфр на сигменте что бы не писать 10 строчек. прибавлять там регистр +1 или еще как то. мне бы это надо знать
- Реклама
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Непонятно, что Вы хотите упростить
Тот код, который Вы показали - это всего лишь вывод данных в порт и очень далёк от динамической индикации.
В сети полно статей на эту тему, поищите...
В сети полно статей на эту тему, поищите...
- mixon46
- Говорящий с текстолитом
- Сообщения: 1644
- Зарегистрирован: Сб фев 18, 2012 15:42:29
- Откуда: Курск
Re: CodeVision AVR в вопросах и ответах
да что неясного. у меня два семисигментника. они подключены к порту 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 и так далее
и вот я не могу чет сообразить как бы это написать програмно
Re: CodeVision AVR в вопросах и ответах
mixon46, по смотрите в сторону преобразования в двоично-десятичный формат.
вкратце после преобразования каждый разряд будет находится в своих перемененных. в вашем случае простейшее преобразование будет делением на 10. т.е у вас есть переменная которая принимает значение от 00 до 99 (к примеру 54)
после деления 10 целую часть (5) выводите на первый индикатор а остаток (4) на второй.
Либо вообще сделать 2 переменных
вкратце после преобразования каждый разряд будет находится в своих перемененных. в вашем случае простейшее преобразование будет делением на 10. т.е у вас есть переменная которая принимает значение от 00 до 99 (к примеру 54)
после деления 10 целую часть (5) выводите на первый индикатор а остаток (4) на второй.
Либо вообще сделать 2 переменных
Код: Выделить всё
a++;
if(a>9){
a=0;
b++;
}
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: CodeVision AVR в вопросах и ответах
А динамическую индикацию неизменного числа уже реализовали?
- mixon46
- Говорящий с текстолитом
- Сообщения: 1644
- Зарегистрирован: Сб фев 18, 2012 15:42:29
- Откуда: Курск
Re: CodeVision AVR в вопросах и ответах
пока ничего не сделал. в сторону массивов и переменных клонит. некогда было делать пока что
-
sanyo.95
- Нашел транзистор. Понюхал.
- Сообщения: 170
- Зарегистрирован: Вс мар 30, 2014 21:41:24
- Откуда: Украина
Re: CodeVision AVR в вопросах и ответах
Здравствуйте, есть задача разложить пятизначное число на разряды. Делаю так:
После этой функции - вывод на 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
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Что значит "тупит" ? Если тормозит, то скорее всего не из-за куска кода, а из-за низкой производительности ПК.
-
sanyo.95
- Нашел транзистор. Понюхал.
- Сообщения: 170
- Зарегистрирован: Вс мар 30, 2014 21:41:24
- Откуда: Украина
Re: CodeVision AVR в вопросах и ответах
Да пк слабоват, но без этой строчкиАlex писал(а):Что значит "тупит" ? Если тормозит, то скорее всего не из-за куска кода, а из-за низкой производительности ПК.
Код: Выделить всё
while (s>=10000){s-=10000;c4++;}На железе только вечером могу попробовать. Я просто предположил что если ПК тормозит, то МК тоже будет тяжело, просто в программе еще куча функций кроме этой, и хотелось бы минимально загружать контроллер, вот и спрашиваю нужно менять эту функцию или так нормально будет работать?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18647
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
так и хочется сказать на великом и могучем все, что я думаю по этому поводу "разбиения по разрядам"...
мало того, что есть itoa, оптимальнее которой вряд ли у кого хватит тямки сделать, так есть и тривиальнейший алгоритм, который, если вспомнить школьную математику, прост, как колумбово яйцо! специально ведь статью даже сделал по этой теме: Вывод чисел на дисплей
так нет же, каждый норовит изобрести свой виласипет, да еще и ромбовидными колесами с карданным приводом...
мало того, что есть itoa, оптимальнее которой вряд ли у кого хватит тямки сделать, так есть и тривиальнейший алгоритм, который, если вспомнить школьную математику, прост, как колумбово яйцо! специально ведь статью даже сделал по этой теме: Вывод чисел на дисплей
так нет же, каждый норовит изобрести свой виласипет, да еще и ромбовидными колесами с карданным приводом...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
-
sanyo.95
- Нашел транзистор. Понюхал.
- Сообщения: 170
- Зарегистрирован: Вс мар 30, 2014 21:41:24
- Откуда: Украина
Re: CodeVision AVR в вопросах и ответах
Спасибо, буду разбираться.
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: CodeVision AVR в вопросах и ответах
Да нормальный способ, ненамного хуже других.Самый простой, конечно, atoi, можно и обычным делением или побитовым шаманством. По скорости способ вычитания степеней деяти уделывает многих, включая тое же atoi, побитовое шаманство и (вот это совсем не удивительно) sprintf.
Re: CodeVision AVR в вопросах и ответах
Добрый вечер. При попытке считать МК выдает следующее. Програматор AVR910. В програмировании ноль. Что делать дальше? Заранее спасибо.
- Вложения
-
- Fo_6zXgMLfI.jpg
- (40.02 КБ) 466 скачиваний
Re: CodeVision AVR в вопросах и ответах
Пытаюсь считать ATtiny 2313.
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: CodeVision AVR в вопросах и ответах
Кажется, программатор найти не может, или он выдает неожиданные ответы. Можно проверить, каким com-портом он себя считает (avrprog вроде только до 4 считать умеет), можно проверить контакты и монтаж, можно ресетнуть его во время работы.


