Главная arrow Форум  
23.03.2019 г.
Главная
Проекты
Статьи
Начинающим
Архив новостей
Ссылки
Контакты
Поиск
Файлы
Форум
Карта сайта
Авторизация





Забыли пароль?
Ещё не зарегистрированы? Регистрация
Поддержи наш сайт!
Через WebMoney

 R785211844650
 Z210696637574
 E368177590409

Простые устройстваОтличные товары по превосходным ценамОтличные товары по превосходным ценам
Форум ARV Research
Добро пожаловать, Гость
Пожалуйста Вход или Регистрация.
Забыли пароль?
ДИНАМИЧЕСКАЯ ИНДИКАЦИЯ (1 просматривает)
_GEN_GOTOBOTTOM Ответить

TOPIC: ДИНАМИЧЕСКАЯ ИНДИКАЦИЯ

#4283
KCA (Пользователь)
Новичок
Постов: 8
graphgraph
ДИНАМИЧЕСКАЯ ИНДИКАЦИЯ 20.01.2010 15:49 Репутация: 0  
Здравствуйте Роман Викторович!
Попробовал Ваши примеры кода из статей ДИНАМИЧЕСКАЯ ИНДИКАЦИЯ и ВЫВОД СИМВОЛОВ.
Работает, НО странное дело (по крайней мере для меня), правильно работает только с предделителем 8 таймера0.
А это (кварц 4Мгц) 50Кгц. что никак не вяжется с тем что написано у Вас :
Человеческий глаз воспринимает мерцание с частотой более 25 Гц, как непрерывное свечение. Индикаторов у нас 6, каждый из них должен мерцать с такой частотой, значит, обновление информации на дисплее должно происходить с частотой 25×6 = 150 Гц или более. Теперь рассчитаем значение предделителя таймера: поделим тактовую частоту МК на 256 (Timer 0 у всех AVR восьмибитный, а значит, переполняется, досчитав до 256) – это и будет желаемое значение предделителя таймера.

Со всеми остальными значениями предделителя индикаторы мерцают и высвечивают что попало.

Или я настолько тупой что невижу очевидного?
Пожалуйста обьясните почему так у меня получается.

Мой код во вложеном архиве

Спасибо Сергей.
File Attachment:
File name: __________________-2842775b59ac3b962e7c00e1c949d270.rar
File size:2837 bytes
  Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
#4288
ARV (Администратор)
Администратор
Постов: 2384
graph
В ответ на: ДИНАМИЧЕСКАЯ ИНДИКАЦИЯ 20.01.2010 19:02 Репутация: 175  
ну давайте попробуем посчитать...

таймер переполняется у вас с частотой 4000000/8/256=1953 Гц. индикаторов у вас 4, значит, каждый будет мигать с частотой 1953/4=488 Гц.

откуда вы взяли цифру 50 кГц?!

если сделаете предделитель таймера, предположим, не 8, а 64, то частота понизится пропорционально и составит 488/8=61 Гц, что вполне нормально для динамической индикации, но дальнейшее увеличение предделителя уже недопустимо. уменьшение предделителя хуже для индикации не сделает - это очевидно.

почему у вас индикатор показывает ерунду - это второй вопрос, на который пока я ответа не дам, ибо не понимаю, в чем проблема. то, как вы работаете с АЦП и прочим мне не очень понравилось...

Содержимое поста отредактировано: ARV, в: 20.01.2010 19:03
Не стыдно не знать, стыдно не учиться
  Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
#4289
KCA (Пользователь)
Новичок
Постов: 8
graphgraph
В ответ на: ДИНАМИЧЕСКАЯ ИНДИКАЦИЯ 21.01.2010 01:31 Репутация: 0  
Спасибо за ответ!
Вы спросили:
откуда вы взяли цифру 50 кГц?!
Наверное Вы поняли что я начинающий, и по этой причине, а также из за своей невнимательности,
я просто 4Мгц разделил на 8 (коэффициент предделителя) вот и получил 50Кгц, (к стати 500 кгц - опечатка)
ну и успокоился на этом

далее
Вы писали:
если сделаете предделитель таймера, предположим, не 8, а 64, то частота понизится пропорционально и составит 488/8=61 Гц, что вполне нормально для динамической индикации
Я пробовал 64 - мерцают. Даже пробовал таймер2 с предделителем 32 - все равно мерцают индикаторы, хотя и быстрее.

и еще
Вы писали:
как вы работаете с АЦП и прочим мне не очень понравилось... ну как добрые люди научили так и делал.
Если Вы считаете что можно правильнее то научите пожалуйста, я только рад буду!
Только тогда коментариев побольше, ато до меня как то туго доходит

Спасибо за разьяснения!
Сергей.

Содержимое поста отредактировано: KCA, в: 21.01.2010 01:38
  Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
#4291
ARV (Администратор)
Администратор
Постов: 2384
graph
В ответ на: ДИНАМИЧЕСКАЯ ИНДИКАЦИЯ 21.01.2010 22:10 Репутация: 175  
у AVR для любого таймера не может быть предделителя 32 - ряд возможных значений таков: 1-8-64-256-1024 откуда вы взяли предделитель 32?

по поводу АЦП. не знаю, кто вас мог такому научить: в обработчике прерывания таймера ставить флаг "начать замер", а в обработчике прерывания по завершению АЦП ставить флаг "данные готовы"... это цирк какой-то! зачем к этому процессу приплетать таймер? зачем вам вообще прерывания от АЦП, если вы там только сигнализируете о конце преобразования?! просто в основном цикле программы запускаете преобразование АЦП в любой момент, ждете, пока в регистре состояния АЦП не упадет флаг ADSC, после чего читаете значение регистров ADC - и все. после этого, не джожидаясь всяких флагов можно снова запускать АЦП на следующее преобразование...
Не стыдно не знать, стыдно не учиться
  Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
#4292
KCA (Пользователь)
Новичок
Постов: 8
graphgraph
В ответ на: ДИНАМИЧЕСКАЯ ИНДИКАЦИЯ 22.01.2010 01:24 Репутация: 0  
Вы спросили:
откуда вы взяли предделитель 32?
Вот отсюда: http://eugenemcu.ru/publ/1/5-1-0-48

Да собственно и остальное тоже с этого сайта.
Евгений давольно много и терпеливо мне помогает,
и я ему за это очень благодарен!

Я и к Вашим советам обязательно прислушаюсь, в часности по поводу АЦП.
Просто слишком новое для меня это программирование, и не все сразу доходит.

Спасибо за разьяснения!
Сергей.
  Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
#4293
ARV (Администратор)
Администратор
Постов: 2384
graph
В ответ на: ДИНАМИЧЕСКАЯ ИНДИКАЦИЯ 22.01.2010 08:18 Репутация: 175  
KCA писал(а):
Вы спросили:
откуда вы взяли предделитель 32?
Вот отсюда: http://eugenemcu.ru/publ/1/5-1-0-48
Да собственно и остальное тоже с этого сайта.
судя по всему, вы взяли совсем не все оттуда. надо внимательно читать, что написано: ведь по ссылке сразу указано, для каких именно таймеров в каких конкретно контроллерах допустимы данные коэффициенты деления! вы берете 0-й таймер меги16, а для него не существует предделителя 32. вы уж повнимательнее разберитесь с этим делом

а если на том сайте вам на самом деле рекомендуют таким извращенным способом работать с АЦП (без особых причин так поступать) - лучше не пользоваться такими рекомендациями.
Не стыдно не знать, стыдно не учиться
  Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
#4300
KCA (Пользователь)
Новичок
Постов: 8
graphgraph
В ответ на: ДИНАМИЧЕСКАЯ ИНДИКАЦИЯ 25.01.2010 16:18 Репутация: 0  
Здравствуйте Роман Викторович!

Следуя Вашим рекомендациям, переделал свой вольтметр.
Запуск АЦП сначала поместил в основной цикл, все вроде работает, однако мерцает десятичная точка.
Попробовал перенести запуск АЦП в обработчик прерывания таймера, вроде стало меньше мерцать,
но все равно заметно.
И что интересно, мерцает поразному в зависимости от положения движка переменного резистора с которого подаю измеряемое напряжение.
Новый вариант программы во вложении. Покритикуйте еще, может удастся еще что улучшить.
К стати о том что деление на 1024 можно, да и нужно, заменить сдвигом я знаю, а что еще надо бы подправить?

Заранее спасибо.
Сергей.
File Attachment:
File name: __________________.rar
File size:2339 bytes


Содержимое поста отредактировано: KCA, в: 25.01.2010 16:19
  Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
#4301
ARV (Администратор)
Администратор
Постов: 2384
graph
В ответ на: ДИНАМИЧЕСКАЯ ИНДИКАЦИЯ 25.01.2010 19:11 Репутация: 175  
прежде всего, не стоит засорять форум бесконечными "здравствуйте-спасибо-до свидания", это не частная переписка
во-вторых, мне кажется. с АЦП, как и со всем прочим, следует работать наиболее простым и интуитивно понятным способом: надо сделать функцию, которая будет возвращать значение АЦП. Например, так:
Code:

 #define REF (1<<REFS0) /* тут надо задать желаемый источник опорного напряжения*/ // функция измерения при помощи АЦП unsigned int get_adc(unsigned char chanel){    ADMUX REF | (chanel 0x07); // устанавливаем заданный канал АЦП    ADCSRA |= 1<<ADSC// запускаем измерение    while(ADCSRA & (1<<ADSC)); // ждем, пока не закончится замер    return ADCW// возвращаем результат }


вот и все: никаких прерываний, никаких таймеров, ничего из этой ерунды. при желании внутри функции можно сразу и промасштабировать результат - это дело вкуса.

использовать прерывания от АЦП и/или запуск измерения по таймеру надо в системах, где важно обеспечить равномерность поступления отсчетов, например, системы обработки звука в реальном времени, а для всяких вольтметров это абсолютно ни к чему.

Содержимое поста отредактировано: ARV, в: 25.01.2010 19:13
Не стыдно не знать, стыдно не учиться
  Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
#4303
KCA (Пользователь)
Новичок
Постов: 8
graphgraph
В ответ на: ДИНАМИЧЕСКАЯ ИНДИКАЦИЯ 26.01.2010 01:37 Репутация: 0  
Собственно примерно такую же функцию, как Вы показали, мне и выдал генератор начального кода CVAVR.
Но я очевидно не совсем правильно понял Ваши рекомендации

А что до "здравствуйте-спасибо-до свидания" - так я просто пытался быть вежливым.
  Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
#4363
Iohan (Пользователь)
Новичок
Постов: 2
graphgraph
В ответ на: ДИНАМИЧЕСКАЯ ИНДИКАЦИЯ 07.02.2010 19:30 Репутация: 0  
while(ADCSRA & (1<<ADSC)); // ждем, пока не закончится замер
А мне умные люди конструкции типа while (аппаратнозависимое условие) рекомендовали не использовать во взрослых программах. Потому что если не "дождетесь пока закончиться замер" по каким-то аппаратным причинам, то зависнет фон и вся Ваша музыка.
Во вторых, зачем столько времени висеть в while() особенно при низкой частоте преобразования АЦП. Вдруг в последствии в фоне появятся более интересные дела?

Предложенная молодым программа, высвобождает фон!

Если программа обещает со временем разрастись, то какая будет периодичность запуска АЦП? Пока не выполниться весь фон? Тогда сколько он будет выполняться, бум щитать на каркуляторе?

Содержимое поста отредактировано: Iohan, в: 07.02.2010 19:48

Содержимое поста отредактировано: Iohan, в: 07.02.2010 19:56
  Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
_GEN_GOTOTOP Ответить
© Copyright 2007 Best of Joomla, Работает на FireBoardполучить последние сообщения прямо на Ваш рабочий стол