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

777777

Участник
  • Постов

    1 085
  • Зарегистрирован

  • Посещение

Весь контент 777777


  1. Кучка UART-ов

    Вопрос действительно странный. Примерно как: посоветуйте источник питания, выходное напряжение чем больше, тем лучше :)
  2. О разделении земель на аналоговую и цифровую писали в тем времена, когда цифровыми были микросхемы серии К155. Они потребляли много и поэтому землю от них приходилось вести отдельным проводом чтобы скачки напряжения на ней от импульсных токов не влияли на аналоговую часть. Сейчас цифорвые микросхемы (а обычно кроме миркоконтроллера в схеме ничего нет) потребляют немного, поэтому разделять их не обязательно. Но тем не менее уделять им самое серьеное внимание требуется. Я обычно располагаю аналоговые микросхемы с одной стороны платы, цифровые с другой, а питание завожу между ними (или ставлю там стабилизатор). Тогда токи, текущие от цифровой части, не создают на земле падения, которое может повлиять на аналоговую. Но даже в этом случае если в схеме есть мощные потребители (например светодиоды) их землю до стабилизатора надо вести отдельно от остальных земель, отдельной дорожкой. Это точно. И при этом не обращаете внимания на то, на что надо обращать в первую очередь. Если речь идет о фильтрации измеряемого сигнала, то делают это не для "подавления помех" вообще, а для ликвидации алиасинга, т.е. биений между высокочастотной помехой и частотой выборок АЦП. Поскольку Сигма-дельта АЦП фактически интегрирует входной сигнал, то ему такой фильтр не требуется, он есть уже в самом АЦП в цифровом виде. Вместо этого вам следует тщательно изучить даташит на AD7708 и в особенности главу ADC CIRCUIT INFORMATION с тем чтобы настроить SINC3-фильтр таким обраом, чтобы максимумы подавления попали на частоту пульсаций питания. Там подробно объясняется как это сделать.
  3. А как называется? Почему я не знаю? 2Модератор: у меня избыточного цитирования не было, а после вашего редактирования стало не понятно к кому относится вопрос - к stells-у или Serdg А, понятно, это наверное для урановых рудников. Видели аналогичные в Казахстане, были в шоке от процедуры их калибровки. Метролог берет руками источник и вешает его на определенном расстоянии от прибора. Видя наше удивление, он говорит: да тут ничего опасного, здесь же только гамма-излучение...
  4. Не обязательно. Гораздо важнее а) опорное б) толстая и короткая земля между АЦП, источником опорного и источником сигнала. Желательно без переходных отверстий, а если они есть, то должны быть диаметром не меньше 1 мм. А напряжение питания на результат влияет слабо, нужно только не экономить на конденсаторая около АЦП. Кстати, сейчас появились керамические SMD конденсаторы емкостью до 10 мкф, народ утверждает, что он один наменяет керамику 0.1 и электролит, которые обычно устанавливаются на питание. Но я бы поставил пару. ЗЫ. Пожалуй пункты а и б надо поменять местами. Сигма-дельта АЦП по своему принципу действия хорошо фильтрует опорное, а подпрыгивание земли, даже если оно отфильтруется, внесет ошибку в результат.
  5. У меня это вылечилось установкой свежего драйвера видеоадаптера.
  6. Забавно. Те же файлы подсунутые в Visual Studio 2008 выдали ошибку: 1>module.obj : error LNK2005: "char global_var" (?global_var@@3DA) already defined in test.obj 1>C:\Users\SWW\Documents\Visual Studio 2008\Projects\test\Debug\test.exe : fatal error LNK1169: one or more multiply defined symbols found И еще кто-то говорит о стандартах и переносимости... Интересно, а что скажет IAR, кто-нибудь проверит?
  7. Вот и плохо! Можкт для обычных программ оптимальность и не важна, но для микроконтроллеров это самый главный параметр. Я некоторое время программировал на кейле для 51-го - очень приятный компилятор несмотря на несоответствие стандарту. Просто к нарушению стандарта нужно подходить с умом. Какая переносимость, о чем вы?! Все носятся с этим флагом, хотя прекрасно понимают, что никакой переносимости сейчас нет и она никому не нужна. Даже перенести с WinAVR на IAR вы не сможете - библиотеки, специфичные для контроллера, никто не стандартизировать не собирается. Да и куча мелких фич типа обращения к программной памяти или к отдельным битам порта у всех делается по-разному. Или может вы собираетесь в некотором устройстве поменять AVR на ARM и перенести туда свою программу? Это еще смешнее. Тут вообще о переносимости нет смысла говорить, это будет совершенно другая программа. Давайте уж честно скажем себе: единственное, для чего нужен язык высокого уровня - для облегчения программирования. Чтобы при программировании думать об алгоритме, а не о регистрах, методах адресации и их ограничениях. А раз так, то он должет быть максимально приспособлен под платформу, а не под абстрактный стандарт.
  8. И что, от этого компиоятор будет генерировать вычисление выражений по-другому? Будет приводить к 8-битному int? Такое впечатление, что стандарт C для вас бог, а все остальное для него подстраиваться. Вообще-то первичным является железо, а все остальное делается для него (причем сначала появляются компиляторы, а потом стандарты для них). Поэтому и существуют до сих пор гарвардские процессоры, поскольку они удобнее в качестве микроконтроллеров, поэтому придумывают новые архитектуры - сигнальные процессоры, многопроцессорные системы. И если для кого-то из них не хватает возможностей языка - значит его надо расширять или менять.
  9. То есть в C-файл включались не только хедеры, но и остальные C-файлы? Неужели WinAVR был таким примитивным? :)
  10. Все верно. Но бывают случаи, когда несоответствие стандарту дает лучшие результаты, чем соответствие. В частности, стандарт требует при выполнении операций приводить операнды к типу int. Может это и хорошо когда размер int соответствует естественному размеру переменной на данной платформе. Но в 8-разрядных процессорах это не так - int не может быть 8-битным, а выполнение операций в 16-разрядных переменных приводит к неэффективности кода. Другой пример - различные адресные пространства. Стандарт предназначен для машин фон-неймановской архитертуры и ничего не хочет знать о том, что указатель может указывать как на пространство кода, так и на пространство данных. А в кейле можно объявить указатель на нужное нам пространство и просто разыменовывать его *p безо всяких уродских pgm_read_byte и компилятор генерирует нужный код в зависимости от типа указателя.
  11. Ты думаешь что в той версии было можно а сейчас нет? А поскольку сейчас той версии ни у кого нет, то придется верить на слово? Я в это не верю - если одна переменная будет объявлена в нескольких объектных файлах, то линкер не может не ругаться. Просто потому, что он не сможет эти переменные разместить. Может твой h-файл включался только в один C-файл и тогда это прокатывало.
  12. Да, кейл тоже творчески подходит к стандарту и знает где можно от него отойти ради более эффективного кода. А гцц слишком тупо ему следует.
  13. Ну почему у меня не получается?
  14. Какая разница? Все равно он приводит операнды к типу int
  15. Речь идет о том, что она используется, просто вы не прочитали эту ветку с начала. Если бы она использовалась в одном файле, то можно было определить ее в этом же файле и вопросов бы не возникало. Если же она требуется в нескольких, то некоторые товарищи считают удобным определить (define) ее в h-файле, а чтобы линкер не ругался на то, что она определена в нескольких C-файлах (если этот h-файл в них включен), предлагают объявить ее static. Линкер ругаться перестает, но при этом создает по экземпляру на каждый C-файл в котором она используется. Что, в общем-то естественно. Если это какой-то константный массив (например, таблица 7-сегментного индикатора) то никаких проблем кроме увеличения памяти не произойдет. Если же это именно переменная в ОЗУ, то работающие с ней функции (разумеется если они из разных файлов) будут фактически работать с разными переменными и одна из них не увидит что записала другая.
  16. Так вот для этого и используются псевдофункции cli() и sei(). А зачем при этом еще и сохранять SREG - для меня загадка :) Ответ не тебе, а топикстартеру, а то что он трехлетней давности - что ж, не заметил...
  17. -O0 это полное отсутствие оптимизации, компилировать программу без нее глупо. Обычно это импользуется тогда, когда вы подозреваете оптимизатор в глючности, тогда отключив оптимизацию можно убедиться, что проблема в самой программе. Обычно для боевой программы используется уровень -Os А к чему такие сложности? Не проще ли написать cli(), sei()
  18. Нет, это вы займетесь тиражированием. Если массив объявить static и поместить в h-файл, то в каждом c-файле будет экземпляр этого массива! Чтобы он был один, он должен находиться в одном c-файле (без static), а в остальных c-файлах (или в h-файле который в них включаются) он должен быть объявлен как extern. Я не знаю, ну это же азы.
  19. Нет, поэтому и помещаю константные массивы в память программ, а не данных Этот массив другим функциям не нужен.
  20. С двумя транзисторами, n- и p-каналные, на напряжение хотя бы 200 вольт, лучше 250. На irf такие сборки почему-то низковольтные.
  21. А у меня их нет. Они хоть в каком разделе, может вручную их туда вписать?
  22. PIND равен 00001110. После инвертирования получится 11110001. А если учесть, что компилятор в выражениях расширяет операнды до int, то единиц будет еще больше. Ну и сдвиг на 4 с расширением знака даст все единицы, причем в обоих случаях. Как у тебя получилось что-то другое - хз
×
×
  • Создать...