Перейти к содержанию
    

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

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

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

 

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

Изменено пользователем AVL

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Предделитель какого обработчика был No_prescaling?

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

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

display(hundred/ten/one);

digit(++znak);

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

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

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

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

digit(++znak);

display(hundred/ten/one);

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

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

 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Выводы сделаете сами? ;)

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Просто в разные моменты времени будут зажжены разные сегменты, что приведет к разным просадкам напряжения питания с вытекающими из этого изменения опорного напряжения.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Неужели напряжение питание в обеих случаях останется постоянным? Уверен, что нет.

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...