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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
0867532
Встал на лапы
Сообщения: 142
Зарегистрирован: Сб май 25, 2013 21:14:11
Откуда: Москва
Контактная информация:

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

Сообщение 0867532 »

Greymand писал(а):Здравствуйте уважаемые!

Так вот,как сделать чтобы цифра мигала с периодом 0,5-1 сек?

Можно ещё одно прерывание по таймеру поставить, и мигание точки в него положить.
Если возникнут вопросы - посмотрите на мой аватар.
Greymand
Родился
Сообщения: 5
Зарегистрирован: Пн окт 07, 2013 09:20:53

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

Сообщение Greymand »

Эмм..Непонимаю)
Точка ж тоже динамически показывается.
Если я хочу зажечь точку после первого индикатора,я должен ее включать только тогда,когда включается именно первый индикатор.
Тогда она будет гореть постоянно.
Вот входим мы в прерывание,которое сделали для динамической индикации.
И там,как я понимаю,надо сделать так,чтобы в N-ом количестве прерываний зажигать точку вместе с первым индикатором,а в остальных-зажигать первый индикатор без точки...
Тока как это грамотно сделать,не знаю(
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

Greymand писал(а):И там,как я понимаю,надо сделать так,чтобы в N-ом количестве прерываний зажигать точку вместе с первым индикатором,а в остальных-зажигать первый индикатор без точки...
Тока как это грамотно сделать,не знаю(
Обычный счётчик (переменная), считающий кол-во входов. По счётчику уже судим - зажигать после гашения индикатор или нет.

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

void ind_upd(void){  // Входим 1 раз в 1 Ms
static unsigned int cnt_mig=0;  // Счётчик вхождений
static unsigned char fl_mig=0;  // Флаг включения индикаторов

if(++cnt_mig>1000)   cnt_mig=0;
fl_mig = cnt_mig<500;

Гасим индикаторы();

if(++ind_num>=3) ind_num=0;

if(! fl_mig) return;   // Если флаг сброшен - выходим из ф-ии без включения индикаторов

switсh(ind_num){
  case 0:
  .........
  break;
  case 1:
  .........
  break;
  case 2:
  .........
  break;
}

}
Как-то, приблизительно, так... :solder:
Константы 500 и 1000 можно менять в зависимости от необходимой интенсивности мигания и частоты обновления индикации.
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

Greymand писал(а):Здравствуйте уважаемые!
Сильно не пинайте,новичек я.
Есть,вообщем,динамическая индикация.Три разряда и точка.
Кода под рукой нет,но вообщем,логика такая:
Прерывание таймера;
Гасим все;
i++;
swith(i)
case 1: включаем первый индикатор;выводим циферку1;
case 2: включаем второй;выводим циферку2;
case 3: включаем третий,выводим циферку3;i=0;зажигаем точку;

Так вот,как сделать чтобы цифра мигала с периодом 0,5-1 сек?


берешь еще один таймер , допустим Т2
настраиваешь его так, чтобы он давал прерывание, например по переполнению, через 500мс
в телее обработчика этого прерывания пишешь

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

ststic char blink;
blink=^blink;

ну а в своем коде добавляешь слудующее

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

Гасим все;
выводим новое значение;
if(++i>=4)i=0;
swith(i)
case 0: if(blink==1)включаем первый индикатор;// данный разряд будет мигать
case 1: включаем второй;
case 2: включаем третий;
case 3: зажигаем точку;

как то так :))
Tell Me The Truth
Marchello
Встал на лапы
Сообщения: 114
Зарегистрирован: Чт ноя 24, 2011 12:39:13

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

Сообщение Marchello »

А как же ответ на мой вопрос?! Как сделать так чтобы при корректировке текущего времени подчеркивалось время или часы в зависимости от того что именно корректируется! Как корректировать я уже понял, а вот как вывести подчерк под значением времени или минуты ну никак не соображу!
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

Marchello, я читал что есть определенная ф-ция которая делает мигание курсора, но более точно ничего сказать не могу так как сам еще ни разу не запускал дисплей.
Tell Me The Truth
Marchello
Встал на лапы
Сообщения: 114
Зарегистрирован: Чт ноя 24, 2011 12:39:13

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

Сообщение Marchello »

На сколько я понял за курсор в виде подчеркивания отвечает функция _lcd_write_data (0x0d); но куда ее вставлять и вообще как ею пользоваться не могу сообразить! Единственное что смог сделать так это хаотичное мерцание курсора по всему экрану!
Greymand
Родился
Сообщения: 5
Зарегистрирован: Пн окт 07, 2013 09:20:53

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

Сообщение Greymand »

Аlex писал(а):
Greymand писал(а):И там,как я понимаю,надо сделать так,чтобы в N-ом количестве прерываний зажигать точку вместе с первым индикатором,а в остальных-зажигать первый индикатор без точки...
Тока как это грамотно сделать,не знаю(
Обычный счётчик (переменная), считающий кол-во входов. По счётчику уже судим - зажигать после гашения индикатор или нет.
Как-то, приблизительно, так... :solder:
Константы 500 и 1000 можно менять в зависимости от необходимой интенсивности мигания и частоты обновления индикации.

Спасибо большое!
Получилось)
dimmar
Открыл глаза
Сообщения: 78
Зарегистрирован: Чт июл 07, 2011 14:42:13

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

Сообщение dimmar »

Всем добрый день. В программировании я новичок, поэтому не рассказывайте какой из меня программист, сам знаю. Стоит вот такая задача:
у МК одна нога выход на ней единица и она управляет устройством. к трём другим подключены кнопки.
Одна основная кнопка при нажатии которой на выходе появляется ноль на определённое время, не зависимо от времени удержания этой кнопки.
вот код который это реализует. Не знаю правильно ли он у меня написан, но в протеусе работает.
while (1) // Главный цикл

{

if (!PINB.3) // если нажата кнопка на pinB3
{
delay_ms(20); // антидребезговая задержка
PORTB.0=0; // установить на ноге PB0 ноль
delay_ms(100); // подождать 100ms,(продолжительность импульса)
DDRB.0=0; // сделать ногу PB0 входом.
PORTB.0=1; // установить на ноге 0 единицу

if (PINB.3==1) // если на ноге PB3 появиття 1 (единица) то
{
delay_ms(20); // антидребезговая задержка
DDRB.0=1; // ногу PB0 сделать выходом и
PORTB.0=1; // записать на ногу PB0 1 (единицу)
};

}
Теперь мне надо при нажатии на вторую кнопку
If (!PINB.2){ увеличивать продолжительность импульса }
а при нажатии на третью
if(!PINB.1){ уменьшать },
с шагом допустим 10ms. Можно ли это сделать с выше изложенным кодом или нужен другой алгоритм? Дальше будет стоять последняя задача: записать полученные изменения в EEPROM.
Что поиск рулит знаю. Забанен во всех поисковых системах.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

Заведите переменную, которая будет хранить время продолжительности единички при нажатии кнопки №1. Опрашивайте кнопки №2,3 и изменяйте эту переменную, в зависимости от нажатой кнопки.
Алгоритм прост до безобразия...

ЗЫ: Про кнопки есть отдельная тема, почитайте её, там и примеры есть.
Marchello
Встал на лапы
Сообщения: 114
Зарегистрирован: Чт ноя 24, 2011 12:39:13

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

Сообщение Marchello »

А на мой вопрос мне так никто и не ответит на счет мигающего курсора?!
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

Marchello, Вы теперь через каждый пост будете вставлять свой ответ ?
Покурите даташит на контроллер своего дисплея, там есть возможность помигать курсором - уже Вам ответили выше.
dimmar
Открыл глаза
Сообщения: 78
Зарегистрирован: Чт июл 07, 2011 14:42:13

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

Сообщение dimmar »

Аlex писал(а):Заведите переменную, которая будет хранить время продолжительности единички при нажатии кнопки №1. Опрашивайте кнопки №2,3 и изменяйте эту переменную, в зависимости от нажатой кнопки.
Алгоритм прост до безобразия...

ЗЫ: Про кнопки есть отдельная тема, почитайте её, там и примеры есть.


Та к в том то всё и дело, что для новичка он оказался не очень прост.
Допустим я обозначу переменную time и задам ей значение и при нажатии кнопки я буду это значение уменьшать или увеличивать, тут понятно. Но уменя время импульса задано задержкой delay_ms(100), и как эту задержку привязать к переменной я не понимаю.

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

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

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

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

delay_ms(time);
не ? :)

Или так

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

void _delay(unsigned int ms){
while(ms--)  delay_ms(1);
}

.............
.............

_delay(time);
Marchello
Встал на лапы
Сообщения: 114
Зарегистрирован: Чт ноя 24, 2011 12:39:13

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

Сообщение Marchello »

Ок! Вопрос №2

Задаю массив - int loc_array[5][2] = {{8,1}, {11,1}, {8,2}, {11,2}, {14,2}}; в котором значения это x и y которые необходимо будет указывать в lcd_gotoxy ()

Как мне в lcd_gotoxy () прописать значение массива?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

http://yandex.ru/yandsearch?clid=9582&t ... D0%B8&lr=2
Неужели это сложно сделать самому ?
Marchello
Встал на лапы
Сообщения: 114
Зарегистрирован: Чт ноя 24, 2011 12:39:13

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

Сообщение Marchello »

В том то и дело, что не сложно, проблема в том, что мне как новичку который никогда в жизни не программировал очень трудно разобраться в терминологии и в структуре той или иной функции. Поэтому я и обращаюсь к вам!
Marchello
Встал на лапы
Сообщения: 114
Зарегистрирован: Чт ноя 24, 2011 12:39:13

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

Сообщение Marchello »

И все равно ничего не понял! Может все таки кто нибудь подскажет как в lcd_gotoxy (); вставить значение x,y из массива int loc_array[5][2] = {{8,1}, {11,1}, {8,2}, {11,2}, {14,2}}; где {8 это x, 1 это y}, {11 это x, 1 это y} одним словом значения записанные в массив это координаты x,y
Аватара пользователя
*Trigger*
Друг Кота
Сообщения: 3059
Зарегистрирован: Пн май 11, 2009 14:15:00
Откуда: СПб

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

Сообщение *Trigger* »

Наверное, так:

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

lcd_gotoxy(loc_array[a][0], loc_array[a][1]); //a - номер пары координат
Этот пост оказался полезен? Не поленись, нажми Изображение слева!
:) :)) :)))
Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

Marchello писал(а):мне трудно разобраться в терминологии и в структуре той или иной функции.
В какой терминологии ? Вам слово "массив" неизвестно ? Вы же его сами произносили.
На самом деле всё просто. Берёте учебник, садитесь и читаете ... читаете ... читаете ... "до посинения". Такие элементарные вопросы есть в любой книге по Си.
Если Вас отправляют в гугл, это не значит, что Вас оскорбляют, издеваются, унижают и т.д... Значит этот вопрос тищу раз пережёван и ответы лежат в свободном доступе в интернете. Вам нужно просто сидеть и гуглить до тех пор, пока не найдёте ответ на свой вопрос.
И не стоит говорить фразу "я ничего не понял". Назревает сразу-же вопрс - что конкретно Вы не поняли ? Где это "то", что Вы не поняли ? Дайте ссылку на текст, в котором Вам что-то не понятно.
А так, складывается впечатление, что Вы ничего даже не искали и не читали, успокаивая себя словами "я новичок, я всё равно ничего не пойму..."...
Учитесь пользоваться литературой, она - сила ! :kill:
Ответить

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