Jump to content

    
Sign in to follow this  
alux

74HC4094 в качестве расширителя порта

Recommended Posts

Цитата из учебника по С: "Если глобальная переменная не проинициализирована явным образом, она инициализируется значением 0". Мне не трудно проинициализировать. Я только хочу разобраться.

Это не всегда правда. Если ОЗУ до выполнения Вашей программы не было инициализировано и конкретно используемый Вами C-компилятор не добавляет в машинный код код инициализации глобальных переменных, для которых не заданы в исходном тексте начальные значения, эти переменные будут содержать мусор. Вы можете провести эксперимент. Включите питание и с помощью средств отладки сразу после старта main() посмотрите содержимое памяти в области расположения глобальных переменных.

 

P.S. Например, C-компилятор, которым пользуюсь я, не инициализирует переменные, которые не проинициализированы явным образом. Отсюда вывод, чтобы там ни было написано в книге, лучше делать инициализацию, из соображений совместимости.

Edited by AVL

Share this post


Link to post
Share on other sites
P.S. Например, C-компилятор, которым пользуюсь я, не инициализирует переменные, которые не проинициализированы явным образом. Отсюда вывод, чтобы там ни было написано в книге, лучше делать инициализацию, из соображений совместимости.

Насчет инициализации глобальных alux прав. А ваш компилятор в таком случае (если вы именно про глобальные переменные пишете) не соответствует стандарту ASNI C (ISO/IEC 9899:1999), как вы вообще им пользуетесь-то? :07:

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

Вот этот блок инициализации, включаемый компилятором в старт-ап, и "чистит" глобальные переменные, если явно не заданы значения для их инициализации.

Share this post


Link to post
Share on other sites
Предделитель какого обработчика был No_prescaling?

И вопрос. Вы сделали, что я рекомендовал (см.ниже)?

Предделитель таймера. Значит так. Проблема действительно была связана с предделителем. В исходном коде, No_Prescaling:

display(hundred/ten/one);

digit(++znak);

было наложение разрядов. Решение проблемы:

1)Предделитель =1024,

2)либо Ваш вариант

display(15) /// не обязательно

digit(++znak);

display(hundred/ten/one);

Предложенный Вами вариант работает и с No_Prescaling.

Спасибо огромное. Вывод - ночью надо спать :)

 

 

...еще бы получить ответ про опорное напряжение и необходимость выключения индикаторов в прерывании АЦП.

Share this post


Link to post
Share on other sites
Насчет инициализации глобальных alux прав. А ваш компилятор в таком случае (если вы именно про глобальные переменные пишете) не соответствует стандарту ASNI C (ISO/IEC 9899:1999), как вы вообще им пользуетесь-то? :07:

Согласен, если компилятор отвечает требованиям стандарта ASNI C (ISO/IEC 9899:1999), то глобальные переменные будут проинициализированы. Но не все компиляторы полностью отвечают требованиям этого стандарта.

Share this post


Link to post
Share on other sites
2)опорное напряжение (+2.5В) на TL431 по качеству отличается от внутреннего, который в микроконтроллере, например в Меге8 ? Я использовал внешний, потому-что у Меги48 внутренний +1.1В.

На TL431A можно сделать опорное напряжение со точностью (начальный разброс 2,47В...2,52В) и стабильностью (не более 50ppm/C) не хуже 2%. Внутренняя опора ATMega8 имеет только разброс начального значения напряжения больше 5% (2,3В...2,7В), а временнАя температурная нестабильность вообще не указана. Выводы сделаете сами? ;)

Share this post


Link to post
Share on other sites
А на счет необходимости выключения индикации в прерывании АЦП? Для более точного результата?

Статическую индикацию выключать не требуется. А вот "ногодрыжечество" во время оцифровки крайне нежелательно. Т.е. во время работы АЦП нежелательно, чтобы изменялись состояния каких-либо пинов МК, т.к. импульсные токи, возникающие при этом, могут давать помехи и приводить к искажению результатов оцифровки. Следовательно динамическую индикацию нужно как-то синхронизировать с выборками АЦП.

Share this post


Link to post
Share on other sites
А вот "ногодрыжечество" во время оцифровки крайне нежелательно. Т.е. во время работы АЦП нежелательно, чтобы изменялись состояния каких-либо пинов МК, т.к. импульсные токи, возникающие при этом, могут давать помехи и приводить к искажению результатов оцифровки. Следовательно динамическую индикацию нужно как-то синхронизировать с выборками АЦП.

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

Share this post


Link to post
Share on other sites
И еще один момент. В программе используется прерывание АЦП. В нем я обычно гашу индикацию, чтобы не "плавал" источник питания, к которому привязано опорное напряжение. Хотя в качестве опорного используется 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 режим до начала преобразования АЦП, а просыпайтесь по прерыванию от АЦП.

Share this post


Link to post
Share on other sites
Просто в разные моменты времени будут зажжены разные сегменты, что приведет к разным просадкам напряжения питания с вытекающими из этого изменения опорного напряжения.

Какие просадки напряжения? Где оно "просаживается"? Причем тут опора? "Нич-ч-чего не понимаю" (с) м/ф "Следствие ведут колобки" :)

Share this post


Link to post
Share on other sites
Для того, чтобы устранить главный источник помех (последствия управления пинами), на время работы АЦП не изменяйте состояния выходных пинов. Время преобразования АЦП составляет от 13 до 260 мкс (в зависимости от того, какой режим Вы выбрали).

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

Одно уточнение. Не щелкать выводами во время выборки входного сигнала или во время всего преобразования?

Share this post


Link to post
Share on other sites
Одно уточнение. Не щелкать выводами во время выборки входного сигнала или во время всего преобразования?

всего преобразования

Share this post


Link to post
Share on other sites
Какие просадки напряжения? Где оно "просаживается"? Причем тут опора? "Нич-ч-чего не понимаю" (с) м/ф "Следствие ведут колобки" :)

Ну что здесь не понятного? Преобразования АЦП, на мой взгляд, лучше проводить в одинаковых условиях. Возьмем крайние случаи: одно преобразование произошло, когда все сегменты зажжены. Ток потребления составляет 120мА. Второе преобразование произошло , когда все сегменты потушены. Ток 30мА. Неужели напряжение питание в обеих случаях останется постоянным? Уверен, что нет. А раз нет, значит значения АЦП будут отличаться при одинаковом входном воздействии.

Share this post


Link to post
Share on other sites
Неужели напряжение питание в обеих случаях останется постоянным? Уверен, что нет.

А для чего тогда вы стабилизатор напряжения питания поставили? ;) При правильной трассировке печатной платы ток потребления светодиодного индикатора на результат работы АЦП сколь-либо существенно влиять не будет. Но можно конечно сделать и наоборот :)

Результат работы АЦП в большей степени зависит от параметров опорного напряжения (ну и входных цепей - мультиплексора/буфера/усилителя - тоже).

Share this post


Link to post
Share on other sites
А для чего тогда вы стабилизатор напряжения питания поставили? ;) При правильной трассировке печатной платы ток потребления светодиодного индикатора на результат работы АЦП сколь-либо существенно влиять не будет. Но можно конечно сделать и наоборот :)

Результат работы АЦП в большей степени зависит от параметров опорного напряжения (ну и входных цепей - мультиплексора/буфера/усилителя - тоже).

Все относительно. Параметры опорного напряжения в некоторой мере тоже зависят от напряжения питания. Вопрос только насколько? Согласен, что этим изменением можно в первом приближении пренепречь. К тому же схема опорного напряжения ratiometric, т.е. изменение напряжения питания приведет к пропорциональному изменению опорного напряжения. И это не скажется на результате измерения.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this