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

777777

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

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

  • Посещение

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


  1. Вот этой программной обработки хотелось бы избежать. P.S. А куда делись еще два сообщения из этой темы?
  2. Случайные значения не могут быть неповторяющимися, если они случайны, то повторяющиеся обязаны встречаться. И наоборот: если все значения неповторяющиеся, значит они не случайны. А раскидать примерно так: int a[100]; int i; srand(777); for(i = 0; i < 100; ++i) a[i] = rand()*100/RAND_MAX; ТОлько разобраться с разрядностью результатов.
  3. Оцифровываются 6 каналов и записываются в память в режиме DMA. Но некоторые каналы знаковые - середина диапазона подразумевается нулем, а сигнал колеблется около него. Поэтому значение АЦП нужно сделать знаковым: инвертировать старший бит (результат сдвинут влево). Можно ли это сделать аппаратно? Если это делать программно, то смысл DMA полностью теряется.
  4. CodevisionAVR фунция scanf

    Да где ж тут наглядность? Как раз в том и проблема, что программируя микроконтроллер вы при этом не знаете что он делает! Как раз самой наглядной является строка "*p++ = UDR0" и работать с UART-ом через регистры надо как раз для того, чтобы иметь над ним полный контроль и в любой момент делать с ним все что вам нужно. Прочитайте даташит, запрограммируйте его прием по прерываниям и тогда вопрос о том как остановить ввод даже не возникнет.
  5. CodevisionAVR фунция scanf

    Так где вы все-таки этого начитались? В каком-нибудь учебнике по Си? Вообще-то вы пишите программу для микроконтроллера, поэтому лучше взять учебник по микроконтроллерам. Там найдете что-нибудь типа volatile bool StopReading = false; char buff[SIZE]; char *p = buff; while(1) { if((UCSR0A & _BV(RXC0)) != 0) if((*p++ = UDR0) == '\n' || p >= buff+SIZE) break; if(StopReading) break; } Но лучше конечно читать по прерываниям.
  6. Да, я его тоже нашел, скорее всего на нем и остановимся.
  7. CodevisionAVR фунция scanf

    А как вам вообще пришло в голову использовать эту функцию? То, что вы написали, лишь считывает приходящие по UART-у байты в буфер. А что мешает считывать их самому? А этой функцией в контроллерах лучше вообще не пользоваться, как минимум из-за ее громоздкости и медлительности. К тому же все равно она в необходимых случаях вызывает atoi() и подобные - так лучше самому их вызвать, по крайней мере в этому случае все буде под контролем. Во-вторых спецификатором %s не стоит пользоваться из-за опасности записи за пределы буфера. Что произойдет если байтов придет больше чем размер буфера?
  8. Что ж тут дикого? Аргументом оператора while является логическая переменная, она здесь присутствует и не равна нулю. А чему равно значение логической переменной при ее отсутствии? :) Тут приходится записывать в стандарт костыль, явно утверждающий, что в данной констрокции (и только в ней и никакой больше) отсутствие переменной должно трактоваться как ее истинное значение, а в других случаях как ошибка. Или вы будете спорить с тем, что это костыль? Но мы же не о скамейке говорим, а о языке программирования.
  9. А, тогда понятно откуда столько вопросов. Лучше читай даташит вместо этого мужика.
  10. Во-первых нужно обратить внимание на warning "This header file is obsolete. Use <avr/interrupt.h>." и выкинуть #include <avr/signal.h> Во-вторых заглянуть в файл iom16a.h и увидеть, что обработчик прерывания передатчика называется USARTTXC_vect В-третьих заглянуть в даташит и увидеть, что регистров UCR и UBRR в 16а нет.
  11. А задержка в вашем представлении это обязательно delay_ms()? Мне например за свою жизнь никогда подобные задержки не требовались. Запусти таймер на 30 мс и сравни значение кнопки до и после.
  12. UCR undeclared скорее всего означает, что проект транслируется для проца в котором отсутствует UART
  13. Они объясняли это тем, что for(;;) напоминает слово forever - навсегда, намекая на то, что это бесконечный цикл. Таким образом лингвистические соображения взяли верх над логическими. +100
  14. Вместо 'с' напиши 'c' :)) У тебя переменная названа русской буквой с
  15. Понятно - лично вам такое не нравится. Вообще-то никакие компиляторы давно не выдают предупреждений в подобных случаях. Во-первых, есть системы автоматической генерации кода, например для инициализайии периферии - пользователь ставит флажки в нужных местах, а система генерирует соответствующие #define-ы. Затем они используются в коде примерно таки м образом: if (__TIMER_USED & 0x01) { // TIM1 used ... } if (__TIMER_USED & 0x02) { // TIM2 used ... } Те участки, где условие не выполняется, просто выкидываются компилятором. А что было бы если бы на каждый такой случай он выдавал предупреждение? Во-вторых, это актуально при использовании шаблонов - там открывается еще больший простор для оптимизации, компилятор может генерить разный код в зависимости от того является ли параметр шаблона переменной или константой а во втором случае - разный код в зависимости от значения этой константы. Тем более что эта команда стоит после цикла и никогда не будет выполнена.
  16. А что это вы против while(1) взъелись? В любой программе для микроконтроллера есть бесконечный цикл. Как вы его кодите? Пишите в конце goto begin?
  17. Вы также входите в число этих дискутеров. Это называется "слышал звон, да не знаю где он". А если строка будет начинаться с длины, то злоумышленник не может незаметно ее заменить? Вообще-то суть безопасности кода заключается в некоторых функциях, работающих со строками, которым не передается размер буфера, в которую надо поместить строку. Если буфер будет недостаточным (или злоумышленник передаст достаточно длинную строку), то она затрет память, находящуюся за пределами строки. Если этот буфер для строки выделен в стеке, то подойдя к процессу творчески можно с передаваемой строке передать свой код и затереть адрес возврата таким образом, чтобы управление передалось на этот код. Но к null-terminated строкам это имеет весьма отдаленное отношение - программист должен проверять поступаемые данные. Это все равно, что обвинять Си в том, что при обращении к массиву он не проверяет, не выходит ли индекс за его пределы.
  18. Инересно, и в чем его "аналогичность"? Судя по схеме - это совсем другой программатор. Или от прикидывается AVRISPmkII имитируя его поведение? В таком случае что будет когда выйдет новая версия прошивки и студия вздумает его обновить? :)
  19. Да, виноват, не доглядел, мне показалось что он стоит параллельно обмотке. Правда, читабельность вашей схемы тоже не на высоте. :)
  20. Потратьте $40 и купите AVRISP mkII Зато будете заниматься только контроллером, а не думать что же не работает - контроллер или программатор...
  21. Все тонкости давно известны: - не экономить на конденсаторах по питанию, они должны быть в непосредственной близости от микросхем - проследить где текут токи по земле обратно к источнику питания и не допускать чтобы они текли мимо АЦП или источника сигнала - разводить земли и питание широкими проводниками - для сигма-дельта АЦП внимательно прочитать раздел даташита о настройке фильтра и настроить его так, чтобы он подавлял сетевую помеху - выбрать хороший источник опорного, для таких АЦП производитель обычно сам рекомендует малошумящий в нужном диапазоне частот источник А вообще, с сигма-дельта АЦП обычно проблем не возникает благодаря тому, что они по своему принципу выполняют фильтрацию за длительное время, чем скрадывают грехи разработчика.
  22. А зачем здесь диод D1? Он нужет для защиты от напряжения самоиндукции и ставят его если с помощью транзистора включается, например, реле. Здесь же цель как раз в том и состоит, чтобы получить высокое напряжение, а вы его давите. Нужно убрать диод, поставить другой транзистор (вольт на 100) и тогда умножитель можно будет сократить в два-три раза. И еще: если в схеме будет какой-нибудь микроконтроллер, то можно не городить генератор, а запрограммировать в контроллере таймер на выдачу ШИМа и подать его непосредственно на ключевой транзистор.
  23. Да дятел конечно. Использование magic numbers навроде 0x30 - это еще так, лишение премии на 25%, а вот использование деления на AVR - это никуда не годится. А таблицу символов UNICODE не надо знать? А вдруг понадобится вывести символ "серп и молот"?
  24. Если нужен действительно наиболее оптимальный вариант, то это алгоритм Бойера-Мура
×
×
  • Создать...