CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1644
Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск

Сообщение mixon46 »

хочу сделать секундомер с четырмя семисигментами. не могу составить алгоритм. нужно что бы по нажатию кнопки начинался счет. таймеры не используем. задержки. задержка 0.1 сек. по достижению десяти по 0.1 сек добавляем следующий десяток. считаем секунды. по достижению 60 сек начинаем считать минуты. далее 60 мин и считаем часы. 4 сигментника. индикация динамическая. с алгоритмом что то запутался. при еще одном нажатии кнопки секундомер останавливается. зацикливается. еще одно нажатие и сброс. задачка для меня тяжеленькая но я справлюсь. просто алгаритм этот и еще индикация динамическая пугает
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

mixon46 писал(а):таймеры не используем
Ну и напрасно.
Настройте таймер на 1 мс, в нём реализуйте динамическую индикацию и там же отсчитывайте свои интервалы. 1000 раз вызвался обработчик - прошла секунда.
Туда же и опрос кнопок запихните.
Контактная информация:
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1644
Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск

Сообщение mixon46 »

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

void main (void)
{...

...
...

while (1)
{
PORTB=0b00111111;
delay_ms (100);
PORTB=0b00100100;
delay_ms (100);

и так далее до 9.
}
}



могу сравнивать. переменную ввести. надо алгоритм. хотя бы для двух сигментов. главное понять как добавлять следующий десяток
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

mixon46 писал(а):я таймеры еще не проходил
Ну вот, настало самое время их изучить. Ибо текущая задача без них превратиться в долгий и геморройный путь :)
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1644
Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск

Сообщение mixon46 »

ладно. а как можно было бы упростить перебор цыфр на сигменте что бы не писать 10 строчек. прибавлять там регистр +1 или еще как то. мне бы это надо знать
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Непонятно, что Вы хотите упростить :dont_know: Тот код, который Вы показали - это всего лишь вывод данных в порт и очень далёк от динамической индикации.
В сети полно статей на эту тему, поищите...
Контактная информация:
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1644
Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск

Сообщение mixon46 »

да что неясного. у меня два семисигментника. они подключены к порту B. их минусы подключены через транзисторы к двум портам и управляются по очереди через порт D1 и D2. к D0 подключена кнопка. алгоритм такой. на двух сигментах по нулям. по нажатию кнопки мк начинает считать и выводить одновременно на сигмент цыфры по возврастающей. соответственно когда на одном сигменте цыфра дойдет до 9 и с следующим счетом на другом сигменте прибавится единица и счет продолжится.



00
кнопка была нажата и пошел счет
01
02
03
04
05
06
07
08
09
далее счет начинается с 10 тоесть прибавляем следующий десяток. и так каждый раз когда дойдет до x9
10
11
12
13 и так далее



и вот я не могу чет сообразить как бы это написать програмно
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Сообщение pokk »

mixon46, по смотрите в сторону преобразования в двоично-десятичный формат.
вкратце после преобразования каждый разряд будет находится в своих перемененных. в вашем случае простейшее преобразование будет делением на 10. т.е у вас есть переменная которая принимает значение от 00 до 99 (к примеру 54)
после деления 10 целую часть (5) выводите на первый индикатор а остаток (4) на второй.

Либо вообще сделать 2 переменных

Код: Выделить всё

a++;
if(a>9){
  a=0;
  b++;
}

Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

А динамическую индикацию неизменного числа уже реализовали?
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1644
Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск

Сообщение mixon46 »

пока ничего не сделал. в сторону массивов и переменных клонит. некогда было делать пока что
Нашел транзистор. Понюхал.
Сообщения: 170
Зарегистрирован: Вс мар 30, 2014 21:41:24
Откуда: Украина

Сообщение sanyo.95 »

Здравствуйте, есть задача разложить пятизначное число на разряды. Делаю так:

Код: Выделить всё

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;
 }
После этой функции - вывод на lcd1100
Но в Протеусе тупит ужасно, может есть какой другой способ сделать это, с меньшими затратами ресурсов МК. Или это нормально?
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Что значит "тупит" ? Если тормозит, то скорее всего не из-за куска кода, а из-за низкой производительности ПК.
Контактная информация:
Нашел транзистор. Понюхал.
Сообщения: 170
Зарегистрирован: Вс мар 30, 2014 21:41:24
Откуда: Украина

Сообщение sanyo.95 »

Аlex писал(а):Что значит "тупит" ? Если тормозит, то скорее всего не из-за куска кода, а из-за низкой производительности ПК.
Да пк слабоват, но без этой строчки

Код: Выделить всё

while (s>=10000){s-=10000;c4++;}
работает отлично.
На железе только вечером могу попробовать. Я просто предположил что если ПК тормозит, то МК тоже будет тяжело, просто в программе еще куча функций кроме этой, и хотелось бы минимально загружать контроллер, вот и спрашиваю нужно менять эту функцию или так нормально будет работать?
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18682
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

так и хочется сказать на великом и могучем все, что я думаю по этому поводу "разбиения по разрядам"... :twisted:
мало того, что есть itoa, оптимальнее которой вряд ли у кого хватит тямки сделать, так есть и тривиальнейший алгоритм, который, если вспомнить школьную математику, прост, как колумбово яйцо! специально ведь статью даже сделал по этой теме: Вывод чисел на дисплей
так нет же, каждый норовит изобрести свой виласипет, да еще и ромбовидными колесами с карданным приводом... :(
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Нашел транзистор. Понюхал.
Сообщения: 170
Зарегистрирован: Вс мар 30, 2014 21:41:24
Откуда: Украина

Сообщение sanyo.95 »

Спасибо, буду разбираться.
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Да нормальный способ, ненамного хуже других.Самый простой, конечно, atoi, можно и обычным делением или побитовым шаманством. По скорости способ вычитания степеней деяти уделывает многих, включая тое же atoi, побитовое шаманство и (вот это совсем не удивительно) sprintf.
Грызет канифоль
Сообщения: 289
Зарегистрирован: Ср дек 01, 2010 23:24:16

Сообщение t@nki$t »

Добрый вечер. При попытке считать МК выдает следующее. Програматор AVR910. В програмировании ноль. Что делать дальше? Заранее спасибо.
Вложения
Fo_6zXgMLfI.jpg
(40.02 КБ) 466 скачиваний
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

А считать пытаетесь AT90S2313? Не?
Docendo discimus
Контактная информация:
Грызет канифоль
Сообщения: 289
Зарегистрирован: Ср дек 01, 2010 23:24:16

Сообщение t@nki$t »

Пытаюсь считать ATtiny 2313.
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Кажется, программатор найти не может, или он выдает неожиданные ответы. Можно проверить, каким com-портом он себя считает (avrprog вроде только до 4 считать умеет), можно проверить контакты и монтаж, можно ресетнуть его во время работы.
Ответить

Вернуться в «AVR»