|
|
  |
74HC4094 в качестве расширителя порта, Кто-нибудь пробовал? |
|
|
|
Jun 9 2007, 13:33
|
Местный
  
Группа: Свой
Сообщений: 392
Регистрация: 29-05-07
Из: Москва
Пользователь №: 28 020

|
Цитата(alux @ Jun 9 2007, 17:16)  Цитата из учебника по С: "Если глобальная переменная не проинициализирована явным образом, она инициализируется значением 0". Мне не трудно проинициализировать. Я только хочу разобраться. Это не всегда правда. Если ОЗУ до выполнения Вашей программы не было инициализировано и конкретно используемый Вами C-компилятор не добавляет в машинный код код инициализации глобальных переменных, для которых не заданы в исходном тексте начальные значения, эти переменные будут содержать мусор. Вы можете провести эксперимент. Включите питание и с помощью средств отладки сразу после старта main() посмотрите содержимое памяти в области расположения глобальных переменных. P.S. Например, C-компилятор, которым пользуюсь я, не инициализирует переменные, которые не проинициализированы явным образом. Отсюда вывод, чтобы там ни было написано в книге, лучше делать инициализацию, из соображений совместимости.
Сообщение отредактировал AVL - Jun 9 2007, 13:39
|
|
|
|
|
Jun 9 2007, 13:43
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(AVL @ Jun 9 2007, 19:33)  P.S. Например, C-компилятор, которым пользуюсь я, не инициализирует переменные, которые не проинициализированы явным образом. Отсюда вывод, чтобы там ни было написано в книге, лучше делать инициализацию, из соображений совместимости. Насчет инициализации глобальных alux прав. А ваш компилятор в таком случае (если вы именно про глобальные переменные пишете) не соответствует стандарту ASNI C (ISO/IEC 9899:1999), как вы вообще им пользуетесь-то?  Цитата(AVL) конкретно используемый Вами C-компилятор не добавляет в машинный код код инициализации глобальных переменных, для которых не заданы в исходном тексте начальные значения, эти переменные будут содержать мусор. Вот этот блок инициализации, включаемый компилятором в старт-ап, и "чистит" глобальные переменные, если явно не заданы значения для их инициализации.
|
|
|
|
|
Jun 9 2007, 14:22
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(AVL @ Jun 9 2007, 16:12)  Предделитель какого обработчика был No_prescaling? И вопрос. Вы сделали, что я рекомендовал (см.ниже)? Предделитель таймера. Значит так. Проблема действительно была связана с предделителем. В исходном коде, No_Prescaling: display(hundred/ten/one); digit(++znak); было наложение разрядов. Решение проблемы: 1)Предделитель =1024, 2)либо Ваш вариант display(15) /// не обязательно digit(++znak); display(hundred/ten/one); Предложенный Вами вариант работает и с No_Prescaling. Спасибо огромное. Вывод - ночью надо спать  ...еще бы получить ответ про опорное напряжение и необходимость выключения индикаторов в прерывании АЦП.
|
|
|
|
|
Jun 9 2007, 19:04
|
Местный
  
Группа: Свой
Сообщений: 392
Регистрация: 29-05-07
Из: Москва
Пользователь №: 28 020

|
Цитата(alux @ Jun 9 2007, 17:02)  И еще один момент. В программе используется прерывание АЦП. В нем я обычно гашу индикацию, чтобы не "плавал" источник питания, к которому привязано опорное напряжение. Хотя в качестве опорного используется 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 режим до начала преобразования АЦП, а просыпайтесь по прерыванию от АЦП.
|
|
|
|
|
Jun 9 2007, 19:29
|
Местный
  
Группа: Свой
Сообщений: 392
Регистрация: 29-05-07
Из: Москва
Пользователь №: 28 020

|
Цитата(alux @ Jun 9 2007, 23:17)  Одно уточнение. Не щелкать выводами во время выборки входного сигнала или во время всего преобразования? всего преобразования
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|