AVL 0 9 июня, 2007 Опубликовано 9 июня, 2007 (изменено) · Жалоба Цитата из учебника по С: "Если глобальная переменная не проинициализирована явным образом, она инициализируется значением 0". Мне не трудно проинициализировать. Я только хочу разобраться. Это не всегда правда. Если ОЗУ до выполнения Вашей программы не было инициализировано и конкретно используемый Вами C-компилятор не добавляет в машинный код код инициализации глобальных переменных, для которых не заданы в исходном тексте начальные значения, эти переменные будут содержать мусор. Вы можете провести эксперимент. Включите питание и с помощью средств отладки сразу после старта main() посмотрите содержимое памяти в области расположения глобальных переменных. P.S. Например, C-компилятор, которым пользуюсь я, не инициализирует переменные, которые не проинициализированы явным образом. Отсюда вывод, чтобы там ни было написано в книге, лучше делать инициализацию, из соображений совместимости. Изменено 9 июня, 2007 пользователем AVL Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 9 июня, 2007 Опубликовано 9 июня, 2007 · Жалоба P.S. Например, C-компилятор, которым пользуюсь я, не инициализирует переменные, которые не проинициализированы явным образом. Отсюда вывод, чтобы там ни было написано в книге, лучше делать инициализацию, из соображений совместимости. Насчет инициализации глобальных alux прав. А ваш компилятор в таком случае (если вы именно про глобальные переменные пишете) не соответствует стандарту ASNI C (ISO/IEC 9899:1999), как вы вообще им пользуетесь-то? :07: конкретно используемый Вами C-компилятор не добавляет в машинный код код инициализации глобальных переменных, для которых не заданы в исходном тексте начальные значения, эти переменные будут содержать мусор. Вот этот блок инициализации, включаемый компилятором в старт-ап, и "чистит" глобальные переменные, если явно не заданы значения для их инициализации. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alux 0 9 июня, 2007 Опубликовано 9 июня, 2007 · Жалоба Предделитель какого обработчика был No_prescaling? И вопрос. Вы сделали, что я рекомендовал (см.ниже)? Предделитель таймера. Значит так. Проблема действительно была связана с предделителем. В исходном коде, No_Prescaling: display(hundred/ten/one); digit(++znak); было наложение разрядов. Решение проблемы: 1)Предделитель =1024, 2)либо Ваш вариант display(15) /// не обязательно digit(++znak); display(hundred/ten/one); Предложенный Вами вариант работает и с No_Prescaling. Спасибо огромное. Вывод - ночью надо спать :) ...еще бы получить ответ про опорное напряжение и необходимость выключения индикаторов в прерывании АЦП. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AVL 0 9 июня, 2007 Опубликовано 9 июня, 2007 · Жалоба Насчет инициализации глобальных alux прав. А ваш компилятор в таком случае (если вы именно про глобальные переменные пишете) не соответствует стандарту ASNI C (ISO/IEC 9899:1999), как вы вообще им пользуетесь-то? :07: Согласен, если компилятор отвечает требованиям стандарта ASNI C (ISO/IEC 9899:1999), то глобальные переменные будут проинициализированы. Но не все компиляторы полностью отвечают требованиям этого стандарта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 9 июня, 2007 Опубликовано 9 июня, 2007 · Жалоба 2)опорное напряжение (+2.5В) на TL431 по качеству отличается от внутреннего, который в микроконтроллере, например в Меге8 ? Я использовал внешний, потому-что у Меги48 внутренний +1.1В. На TL431A можно сделать опорное напряжение со точностью (начальный разброс 2,47В...2,52В) и стабильностью (не более 50ppm/C) не хуже 2%. Внутренняя опора ATMega8 имеет только разброс начального значения напряжения больше 5% (2,3В...2,7В), а временнАя температурная нестабильность вообще не указана. Выводы сделаете сами? ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alux 0 9 июня, 2007 Опубликовано 9 июня, 2007 · Жалоба Выводы сделаете сами? ;) Да, спасибо. А на счет необходимости выключения индикации в прерывании АЦП? Для более точного результата? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 9 июня, 2007 Опубликовано 9 июня, 2007 · Жалоба А на счет необходимости выключения индикации в прерывании АЦП? Для более точного результата? Статическую индикацию выключать не требуется. А вот "ногодрыжечество" во время оцифровки крайне нежелательно. Т.е. во время работы АЦП нежелательно, чтобы изменялись состояния каких-либо пинов МК, т.к. импульсные токи, возникающие при этом, могут давать помехи и приводить к искажению результатов оцифровки. Следовательно динамическую индикацию нужно как-то синхронизировать с выборками АЦП. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alux 0 9 июня, 2007 Опубликовано 9 июня, 2007 · Жалоба А вот "ногодрыжечество" во время оцифровки крайне нежелательно. Т.е. во время работы АЦП нежелательно, чтобы изменялись состояния каких-либо пинов МК, т.к. импульсные токи, возникающие при этом, могут давать помехи и приводить к искажению результатов оцифровки. Следовательно динамическую индикацию нужно как-то синхронизировать с выборками АЦП. Во время преобразования АЦП никаких изменений состояний пина не предвидится. Просто в разные моменты времени будут зажжены разные сегменты, что приведет к разным просадкам напряжения питания с вытекающими из этого изменения опорного напряжения. Ворос в следующем: насколько это будет критично? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AVL 0 9 июня, 2007 Опубликовано 9 июня, 2007 · Жалоба И еще один момент. В программе используется прерывание АЦП. В нем я обычно гашу индикацию, чтобы не "плавал" источник питания, к которому привязано опорное напряжение. Хотя в качестве опорного используется TL431 и схема измерения ratiometric. #pragma vector=ADC_vect __interrupt void ADC_ISR(void) { digit(0); //выключить индикатор accum = ADC; digit(znak); //восстановить индикатор } // End of ADC_ISR Такое отключение (в обработчике __interrupt void ADC_ISR(void) ) Вам ничего не даст. Когда управление передается обработчику прерывания __interrupt void ADC_ISR(void), АЦП уже все посчитал. То есть из обработчика отключение индикации можно убрать. Если требуется высокая точность измерения, то, конечно, динамическая индикация во время измерения будет давать помехи. Но не только индикация, переключение реле тоже. Если идти дальше, то помехи дают даже переключения внутри микроконтроллера. Для того, чтобы устранить главный источник помех (последствия управления пинами), на время работы АЦП не изменяйте состояния выходных пинов. Время преобразования АЦП составляет от 13 до 260 мкс (в зависимости от того, какой режим Вы выбрали). А еще лучше, переходите в SLEEP режим до начала преобразования АЦП, а просыпайтесь по прерыванию от АЦП. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 9 июня, 2007 Опубликовано 9 июня, 2007 · Жалоба Просто в разные моменты времени будут зажжены разные сегменты, что приведет к разным просадкам напряжения питания с вытекающими из этого изменения опорного напряжения. Какие просадки напряжения? Где оно "просаживается"? Причем тут опора? "Нич-ч-чего не понимаю" (с) м/ф "Следствие ведут колобки" :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alux 0 9 июня, 2007 Опубликовано 9 июня, 2007 · Жалоба Для того, чтобы устранить главный источник помех (последствия управления пинами), на время работы АЦП не изменяйте состояния выходных пинов. Время преобразования АЦП составляет от 13 до 260 мкс (в зависимости от того, какой режим Вы выбрали). А еще лучше, переходите в SLEEP режим до начала преобразования АЦП, а просыпайтесь по прерыванию от АЦП. Одно уточнение. Не щелкать выводами во время выборки входного сигнала или во время всего преобразования? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AVL 0 9 июня, 2007 Опубликовано 9 июня, 2007 · Жалоба Одно уточнение. Не щелкать выводами во время выборки входного сигнала или во время всего преобразования? всего преобразования Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alux 0 9 июня, 2007 Опубликовано 9 июня, 2007 · Жалоба Какие просадки напряжения? Где оно "просаживается"? Причем тут опора? "Нич-ч-чего не понимаю" (с) м/ф "Следствие ведут колобки" :) Ну что здесь не понятного? Преобразования АЦП, на мой взгляд, лучше проводить в одинаковых условиях. Возьмем крайние случаи: одно преобразование произошло, когда все сегменты зажжены. Ток потребления составляет 120мА. Второе преобразование произошло , когда все сегменты потушены. Ток 30мА. Неужели напряжение питание в обеих случаях останется постоянным? Уверен, что нет. А раз нет, значит значения АЦП будут отличаться при одинаковом входном воздействии. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 9 июня, 2007 Опубликовано 9 июня, 2007 · Жалоба Неужели напряжение питание в обеих случаях останется постоянным? Уверен, что нет. А для чего тогда вы стабилизатор напряжения питания поставили? ;) При правильной трассировке печатной платы ток потребления светодиодного индикатора на результат работы АЦП сколь-либо существенно влиять не будет. Но можно конечно сделать и наоборот :) Результат работы АЦП в большей степени зависит от параметров опорного напряжения (ну и входных цепей - мультиплексора/буфера/усилителя - тоже). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alux 0 9 июня, 2007 Опубликовано 9 июня, 2007 · Жалоба А для чего тогда вы стабилизатор напряжения питания поставили? ;) При правильной трассировке печатной платы ток потребления светодиодного индикатора на результат работы АЦП сколь-либо существенно влиять не будет. Но можно конечно сделать и наоборот :) Результат работы АЦП в большей степени зависит от параметров опорного напряжения (ну и входных цепей - мультиплексора/буфера/усилителя - тоже). Все относительно. Параметры опорного напряжения в некоторой мере тоже зависят от напряжения питания. Вопрос только насколько? Согласен, что этим изменением можно в первом приближении пренепречь. К тому же схема опорного напряжения ratiometric, т.е. изменение напряжения питания приведет к пропорциональному изменению опорного напряжения. И это не скажется на результате измерения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться