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

ilichev

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

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

  • Посещение

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


  1. Между АЦП и DSP у нас не SPI, а синхронный SPORT (TCLK, RCLK, RFS, TFS итд) на 8,192 МГц. Период клока 122 нс. Фронты 1-2 нс. Действительно, их можно смело завалить 100-омными резисторами. Скорее всего, так и сделаем. Плата 4 слоя, внутри питание, все сигналы только снаружи могу провести.
  2. Да, сигналы идут по плате, никакой витухи нет. Длина проводников - по разному, от 2 до 8 см. Не согласовывать нельзя - частоты не высокие, согласен, но фронты очень резкие, они без согласования приводят к излучению от дорожек в диапазоне 100 МГц и выше. А у нас аналоговые прецизионные схемы на этой же плате, шумы от цифры проникают ощутимо. Нашел у кого есть осцилл на 4 ГГц, буду договариваться поиграться, попробуем подобрать номинал терминатора ручками. Вообще очень заманчиво HyperLynx, но имхо у меня времени не хватит его освоить сейчас ради этой задачки.
  3. На целостность... Дык нету осциллографа с хорошей полосой, максимум 200 МГц. А мне кажется, чтобы увидеть эффективность этих резисторов с учетом резких фронтов сигналов (1-2 нс) - надо 1-4 ГГц полосу. Или я не прав?
  4. :-) А почему не 22 Ом ??? Нее, мне надо расчет, хотя бы приблизительный, но расчет. Вот сейчас плата имеет препреги по 0,3, а ядро 0,7. В итоге Zo = 80 Ом при дорожке 0,2. Туда тоже ставить 33 Ом прикажете? Или больше?
  5. Коллеги, подскажите, как рассчитать согласующие резисторы (терминаторы) ? Схема содержит АЦП с последовательным синхронным интерфейсом с тактовой 8,192 МГц, соединенный с DSP; микроконтроллер LPC2468 с SRAM 55 нс. Плата 4-слойная. Стек слоев Top 0,018 – препрег 0,12 – GND 0,018 – ядро 1,0 – Power 0,018 – препрег 0,12 – Bottom 0,018. При ширине дорожки 0,2 получаю характеристическое сопротивление Zo = 50 Ом (microstrip). Хочу сделать правильное согласование всех линий тактовых сигналов, синхронного интерфейса между АЦП и DSP, микроконтроллером и памятью. Хочу поставить последовательные резисторы 0603 или 0402 вблизи источника сигнала. Номинал, мне представляется, надо выбирать в диапазоне 22-47 Ом. Чтобы выбрать этот номинал, надо вычесть из Zo импеданс выхода микросхемы или генератора. Вот только где его взять и как рассчитать? В даташитах на АЦП, DSP, MCU такие характеристики не попадаются. Проштудировал High-Speed Design - конкретных цифр нет. Подскажите, как правильно выбрать номинал резисторов-терминаторов?
  6. Ищу работу в Москве на полный день – программист систем на микроконтроллерах, схемотехник. Г/р 1980. Опыт работы по специальности с 2001 по 2012 г. Имею следующий опыт: ● Разработка программного обеспечения для микроконтроллеров AVR ATmega в среде IAR EWB на ассемблере и С/С++. Также знаком с ARM7, Cortex-M3/M4, PIC, С51. ● Проектирование схем на ПЛИС Altera CPLD/FPGA - схемный ввод и AHDL. ● Разработка программного обеспечения в среде Borland C++ Builder. ● Разработка схемотехники контроллеров промышленных установок, плат сбора данных, приборов дистанционного контроля и управления, устройств спутникового мониторинга транспорта, стендов и пультов поверки, калибровки, технологического прогона. ● Трассировка двухслойных печатных плат в системе PCAD-2002, аналоговых, цифровых, смешанных и СВЧ-схем. ● Сопровождение в массовом серийном производстве разработанных изделий. Английский язык – свободно понимаю техническую документацию. Личные качества: коммуникабельность, ответственность, творческий подход к выполнению поставленных задач. По запросу вышлю подробное резюме. E-mail: [email protected]
  7. Проверили следующим образом. Ввели модем в описанное выше состояние, симка в режиме "Активирована", на CGATT=1 выдает ERROR. Далее делаем звонок ATDxxxxxx, небольшая пауза, NO CARRIER. Далее пробуем CGATT=1 - ERROR. Пробовали звонки на разные номера, делать IPSHUT, CGATT=0, разные комбинации - сдвигов нет, к сожалению, GPRS не подключается, помогает только полный сброс.
  8. Да, очень похоже. По CREG я тоже получаю 0,1. Сим-карта не поддерживает вх/исх звонков (только m2m). Попробую сделать в такой ситуации сброс модема по PWRKEY и по питанию с повтором не чаще 20 минут.
  9. Я на CIPSTATUS не жалуюсь, загвоздка не в нем, а в том, что при выполнении CGATT=1 получаю сразу ERROR. Я тут CIPSTATUS даже и не вызываю нигде. Если CGATT=1 ответит ОК, то тогда уже IPSTATUS, но там дальше всё нормально. Еще раз: проблема в том, что если появился GPRS, то модем сам его не обнаруживает, на CGATT=1 выдает ERROR, и помогает только перезагрузка с отключением питания модема. Наши поставщики щас ищут, какой командой можно пнуть модем, чтобы он без рестарта поискал GPRS. Именно так, как только появляются новые данные на отправку, я делаю CIPSEND, получаю ERROR, иду на закрытие TCP-соединения, дальше дается CIPSHUT и при попытке CIPSTART получаю ERROR, то есть со второго раза не соединяется, и дальше так и не соединяется сколько ни пытается. Через паузу иду на закрытие GPRS и пытаюсь подключить GPRS снова, но на CGATT=1 получаю стабильно ERROR. Найти GPRS помогает только сброс модема по PWRKEY и питанию. Если GPRS есть, то CGATT и CIICR проходят чудесно. Если его нет, то на CGATT=1 уже получаем ERROR. Вот щас выкинул вообще вызов CIPSTATUS из алгоритма, загнал опять в то же состояние - проблема та же. CIPSTATUS не влияет.
  10. Пробовал AT+COPS=1,0,"Beeline", и еще AT+COPS=4,0,"Beeline". Никак не реагирует, на AT+COPS? выдает 0 (автоматический режим). По приходу PDP DEACT ничего не делаю вообще. AT+CIPSHUT делаю в двух случаях: 1) при подключении GPRS, если на AT+CIPSTATUS отвечает не INITIAL; 2) при установлении TCP-соединения, если на AT+CIPSTATUS отвечает не INITIAL, не STATUS и не CLOSED. Всё по даташиту.
  11. В 8 из 10 случаев CREG неизменно выдает 0,1, а CGREG выдает 0,0, на команду AT+CGATT=1 получаю ответ ERROR. То есть регистрация есть, а GPRS нет. При этом если ребутнуть модем - появляется и GPRS тоже. Вот мне бы как раз команду принудительной разрегистрации или повторной регистрации в сети. Это бы могло помочь.
  12. В документе "sim900_atc_v1 00.pdf" написано: "AT+CFUN=1,1 can be used to reset module purposely". Значит, подачей этой команды можно сбросить модем. Есть два НО: 1. Там же написано: "The <fun> power level will be written to flash except minimum functionality". То есть каждый раз при таком сбросе будет происходить запись во flash. Ресурс flash невелик (1 млн циклов записи), вдруг при полном отсутствии сети GSM будет постоянно лупить такой сброс? Flash в модуле сдохнет быстро. 2. При таком сбросе питание сим-карты снимается? Если да, то симки со счетчиком включений тоже будут сдыхать при длительном отсутствии сети GSM. Коллеги, прокомментируйте, пожалуйста, эти выкладки. Как лучше делать сброс? P.S. Реальная ситуация: прибор с SIM900B лежит на столе (стационар), работает, GPRS подключен, данные передаются по TCP. Через веб-клиент билайна переводим сим-карту в состояние "Запасы" (перестает регистироваться в сети). Модем выдает PDP DEACT и дальше мы не можем отправить данные по TCP, закрываем сокет, отключаемся от GPRS и периодически пробуем подключить GPRS. На AT+CGATT=1 стабильно получаем ERROR. AT+CREG возвращает 0,1, AT+CGREG возвращает 0,0. Теперь переводим симку в состояние "Активирована". В 2 случаях из 10 модем еще минуту отвечает ERROR на AT+CGATT=1, а затем-таки подключает GPRS. Дальше работает как обычно, нормально. Но в 8 случаях из 10 модем продолжает отвечать ERROR и только выкл/вкл по PWRKEY дает эффект, симка регистрируется и модем подключает GPRS. Да, можно так сбрасывать, но этот вариант мне не нравится исключительно из-за того, что симки со счетчиком включений будут дохнуть. КАК БЫТЬ?
  13. Дык не за что, было бы полезно кому-то - этого достаточно! По этим шагам даже увесистый проект можно перевести всего за один рабочий день вместе с тестированием. Интересно, а можно в IAR как-то увидеть количество строк в проекте?
  14. Привожу: 1. Проект на CodeVisionAVR 2.03.9: Memory model: Small Optimize for: Size Optimization Level: Maximal (s)printf features: long, width, precision (без поддержки float) Bit Variables Size: 64 вроде больше ничего не влияет. Результат компиляции: Program size: 56052 bytes 2. Проект на IAR 5.30: Memory model: Small Library: Normal DLIB Printf formatter: Small (без поддержки float) Language: Embedded C++ Optimizations: Size, Medium (Common subexpression elimination, Code motion, Clustering of variables), без Cross-call'ов. Command line options: --string_literals_in_flash остальное вроде тоже не влияет. В файле frmwri_p.c сделал другой дефайн, чтобы уравнять условия сравнения: #define NO_FLOATS. Результат компиляции: 56271 bytes of CODE memory (+8 range fill) Далее меняю настройку оптимизации: Optimizations: Size, High (Maximum optimization) (Common subexpression elimination, Function inlining, Code motion, Clustering of variables, Type-based alias analysis), без Cross-call'ов. Результат компиляции: 53645 bytes of CODE memory (+8 range fill) Еще раз меняю настройку оптимизации: Optimizations: Size, High (Maximum optimization) (Common subexpression elimination, Function inlining, Code motion, Cross call, Clustering of variables, Type-based alias analysis), Number of cross-call passes: 2. Результат компиляции: 43119 bytes of CODE memory (+8 range fill) Теперь попробуем оптимизацию по скорости: Optimizations: Speed, Medium (Common subexpression elimination, Code motion, Clustering of variables), без Cross-call'ов. Результат компиляции: 56271 bytes of CODE memory (+8 range fill) Теперь такая конфигурация: Optimizations: Speed, High (Maximum optimization) (Common subexpression elimination, Function inlining, Code motion, Cross call, Clustering of variables, Type-based alias analysis), Number of cross-call passes: 2. Результат компиляции: 55309 bytes of CODE memory (+8 range fill) Вывод очевиден: результат IAR компактнее. Расход ОЗУ сравнить невозможно, так как в CodeVision задается только DSTACK, а под CSTACK отдается весь остаток памяти. В IAR же DSTACK и CSTACK задаются явно. Куча не используется, поэтому можно считать, что расход ОЗУ одинаковый или примерно одинаковый. Upd: Вообще, я же заменил переменные bit на bool, поэтому минимум на 64 байта ОЗУ расходуется больше в IAR (если я правильно полагаю, что на один bool расходуется один байт ОЗУ). Быстродействие в этом проекте трудно оценить, поскольку параллельно выполняются несколько алгоритмических механизмов, нет задач, которые можно "измерить". Могу сказать только субъективно и визуально: для всех шести компиляций разницы не заметил. Данные принимаются, обрабатываются, сохраняются, передаются, часы идут, частоты измеряются. Всё как обычно. Обработка в прерываниях судя по ассемблерному листингу достаточно эффективна, есть некоторые лишние команды, но не более, чем в CodeVision. Измерять в тактах не хочется. Самые важные места у меня сделаны на ассемблере, там без замечаний. Главный плюс - возможность писать на С++, использовать классы и другие удобства языка. Второй плюс - код компактнее. Третий плюс - IDE поудобнее будет (только цвет фона пользовательский нельзя установить), чем в CV, хотя в CV есть свои полезные штучки. Если учесть, что уже продано значительное количество устройств, то этот вариант отпадает: мы можем только обновить прошивку, никаких аппаратных изменений. Да и надо развиваться, в конце концов, осваивать легендарный IAR.
  15. Добрый день всем, Пять рабочих дней занимался переводом проекта с CV на IAR, далее привожу подробный отчет, на что стоит обратить внимание. Может кому пригодится. Всё по горячим следам, пока не забыл. Имеем: проект на CV2.03.9, чип ATmega64A. Еще бутлоадер на том же CV, размер 8192 байт. Цель: перевести проект на IAR5.30 с минимальным изменением кода. Причины: а) нехватка памяти flash для развития проекта, б) потребность использовать С++ и float64. Бутлоадер переводить не будем, т.к. нет необходимости. Использую EWAVR_CompilerReference.pdf, отличная документация. 1. Создал пустой проект в IAR, указал чип, Memory model = small, Library = DLIB, DSTACK = 512 байт, CSTACK = 128 уровней (256 байт). 2. Опции компилятора: Extra options: добавил command line options: --string_literals_in_flash --root_variables Первая - чтобы строки размещались во flash. Вторая - чтобы все статические переменные в SRAM и особенно EEPROM были размещены в памяти, даже если они не используются. 3. Опции линкера: Extra options: добавил command line options: -Ointel-standard,(CODE)=.hex -Ointel-standard,(XDATA)=.eep Эти команды нужны для формирования привычных файлов HEX и EEP, как в CodeVision и AVRStudio. Остальные настройки проекта - по вкусу. 4. Где нужно - инклудятся <ioavr.h> и <intrinsics.h>. 5. Переделываются все прерывания на следующий шаблон: #pragma vector = TIMER0_COMP_vect __interrupt void TIMER0_COMP_isr(void) { //... } 6. Все переменные bit заменил на bool. 7. Все объявления указателей на строку во flash заменил на такого типа: const unsigned char __flash *ResetSourceText; Во все объявления переменных в EEPROM добавил __eeprom, и для констант во flash добавил __flash. 8. Разрешения и запрещения прерываний заменил на __enable_interrupt() и __disable_interrupt(), сбросы сторожевого таймера на __watchdog_reset(). 9. Все бинарные константы типа 0b01100011 заменил на BINARY(01100011). Макрос взял здесь. 10. Все ассемблерные вставки заменил на asm("..."). Перенос строки внутри вставки был '\', теперь '\n'. Пример: asm("cli \n jmp 0"); 11. Функция sprintf() в IAR не поддерживает форматную строку из flash. Для этого инклудим <pgmspace.h> и используем функцию sprintf_P(). То же с функцией strcpyf() -> strcpy_P(). 12. Функция sprintf_P() не поддерживает спецификатор '%p' для строк из flash. Модифицировал библиотечный файл frmwri_p.c. Подробнее см. здесь. 13. Где-то использовалась функция toint() из библиотеки CodeVision. Заменил на: //interprets c as a hexadecimal digit and returns an usigned char from 0 to 15. inline unsigned char toint(char c) { if ((c>='0')&&(c<='9')) return (c-'0'); else if ((c>='a')&&(c<='f')) return (c-'a')+10; else if ((c>='A')&&(c<='F')) return (c-'A')+10; else return 0; } 14. Использовал библиотеку софтварной реализации I2C из CodeVision. Поискал готовую для IAR, прикрутил avrlib, не работает, запустить не удалось. Написал свою библиотеку под замену вызовов i2c_start(), i2c_stop(), i2c_write(), i2c_read(), отладил, работает. 15. Проверяю в работе. Периодически сбрасывается по WDT. Долго копался, выяснил, что CV при доступе к переменным EEPROM на чтение и на запись запрещает прерывания, а IAR запрещает только на запись. Нашел решение здесь. Сравнил eeprom.s90 по ссылке и тот, который есть в IAR. Изменения заключаются в том, что при чтении и записи прерывания запрещаются, а затем восстанавливаются, можно смело использовать и в прерываниях, и в основном потоке. Добавил измененный файл в проект, далее выполнил действия по списку - см. EWAVR_CompilerReference.pdf, Overriding library modules using IAR Embedded Workbench. Еще для компиляции понадобилось скопировать в папку проекта файл macros.m90. 16. При тестировании с бутлоадером обнаружил, что в проекте бутлоадера CodeVision сам переключает таблицу прерываний на начало бутлоадера. А в проекте application - на начало flash. IAR такого не делает. Поэтому при выходе из бутлоадера мы оказались в application, но с таблицей прерываний в области бутлоадера. Короче, это решилось добавлением переключения таблицы прерываний на начало flash перед первым разрешением прерываний: MCUCR = 1; MCUCR = 0; __enable_interrupt(); 17. Еще обнаружил, что переход на бутлоадер jmp 0x7000 уходит куда-то не туда. Выяснилось, что ассемблер у IAR отличается от атмеловского и в jmp принимает адрес в байтах, а не в словах. То есть надо задавать удвоенный адрес. Итог: для перехода по адресу 0x7000 выполняем код: asm("cli \n jmp 0xE000"); Вроде бы пока всё, если еще что-то вылезет - допишу. Приглашаю всех, у кого есть опыт переноса проекта с CodeVision на IAR, описывать симптомы проблемы и решение здесь.
  16. Всем спасибо за быстрые ответы! Модифицировал функцию, занимающуюся разбором спецификаторов. Получилось просто, всё работает. Далее описываю подробно. 1. Цель - сделать так, чтобы под IAR работал следующий код, написанный для CodeVisionAVR: sprintf(str,"Socket type=%p",(SocketType)?("TCP"):("UDP")); Требуется, чтобы в IAR EWAVR код минимально отличался, например, выглядел так: sprintf_P(str,"Socket type=%p",(SocketType)?("TCP"):("UDP")); 2. Открываем EWAVR_CompilerReference.pdf, раздел "Overriding library modules", подраздел "Overriding library modules using IAR Embedded Workbench" и далее выполняем пункты из этого подраздела. 3. Создаем в своем проекте папку "mysprintf", в нее копируем файл "frmwri_p.c" (это модуль с функцией _formatted_write_P(), выполняющей разбор спецификаторов и собственно формированием форматированной строки) из папки "src\lib\dlib" (там, где установлен IAR). Модифицируем файл из библиотеки DLIB, так как компилироваться будет именно с ней. Аналогично можно модифицировать файл библиотеки CLIB. 4. В начале файла добавляем строчку, чтобы компилилось с поддержкой float (можно другой дефайн, см. frmwri_p.c). #define FLOAT_SUPPORT 5. Вносим требуемые изменения - комментируем стандартную обработку спецификатора 'p' и добавляем свой код: case 'p': if ( !(flash_pointer = VAPTR(__flash char)) ) { flash_pointer = null_pointer_str; ptr = buf_pointer=0; ptr += 13; break; } if (precision < 0) precision = 10000; for (n=0; *flash_pointer++ && n < precision; n++) ; buf_pointer = (char *)(--flash_pointer); ptr = buf_pointer; buf_pointer -= n; flash_pointer -= n; break; Этот код сделан на базе обработчика спецификатора 's' (см. frmwri_p.c). 6. Далее изменения в коде для REDUCED_SUPPORT: case 'p': ptr_flash = VAPTR(__flash char); while (format_flag = *ptr_flash++) { put_one_char(format_flag, secret_pointer); nr_of_chars++; } continue; Тоже сделано на базе обработчика спецификатора 's'. 7. Больше ничего изменять не требуется, новые переменные не добавляются (используются имеющиеся). 8. Добавляем в свой проект модифицированный файл "mysprintf\frmwri_p.c", имя файла обязательно должно остаться таким же, какое оно в исходной библиотеке. 9. Компилируем, пьем кофе черный, последнее время чай. 10. Хорошая мысль использовать 'S' вместо 'p'. Можно и так сделать. Мне 'p' ни к чему, поэтому оставлю, как в CV.
  17. Добрый день всем! Перехожу с CodeVisionAVR на IAR EWAVR 5.30. При переносе проекта столкнулся с тем, что привычная конструкция компилируется, но не работает: sprintf_P(str,"Socket type=%p",(SocketType)?("TCP"):("UDP")); В строке str получается что-то типа такого: "Socket type=3CD". Причина - CodeVision рассматривает спецификатор %p как указатель на строку во флеш, а IAR - как *void. Включена опция "--string_literals_in_flash". В проекте очень много таких конструкций, переделать на %s, мне кажется, нереально. Мне видится, что легче внести изменения в библиотечную функцию sprintf_P, которая разбирает спецификаторы. Посоветуйте, как быть. Может, эта проблема решается совсем просто?
  18. Эээ... Да, согласен! Со всем согласен!!! ) При портировании меня больше всего бесит, почему в исходнике минус приделывают к беззнаковому целому. Мой компилер-то ругается...
  19. Ну а что, там тот же Little Endian, а остальное всё - просто сишный код )). Тем более никакие аппаратные особенности не используются.
  20. Решение найдено. Портировал бесплатную библиотеку SoftFloat (http://www.jhauser.us/arithmetic/SoftFloat.html) сначала под Builder. Результаты операций одинаковы со встроенной библиотекой double билдера. Но это в первом приближении, сейчас будем всесторонне тестировать. Библиотека требует наличие в компиляторе 32-битного целого. В CodeVisionAVR есть long int. На основе этого библиотека предоставляет операции с типами float32 и float64. Последний полностью соответствует привычному double. После тестирования буду портировать под AVR, там в сущности никаких отличий от i386 нет. Кому интересны подробности - пишите в личку.
  21. Добрый день, Есть готовый проект под CodeVisionAVR на Mega64, в котором требуется добавить математические вычисления с двойной точностью double (8 байт). CodeVisionAVR поддерживает только float (4 байта), double не поддерживает. Переводить проект на IAR (поддерживает double) ради этого не хочу, поскольку это потребует много времени на тестирование уже написанного кода, могут вылезти любые глюки, обусловленные особенностями компиляторов. Лучше конечно сразу писать под IAR, но такой возможности на старте проекта не было. Итак, ищу библиотеку, позволяющую складывать и умножать числа double в соответствии со стандартом IEEE 754, которую можно использовать в CodeVision. Порекомендуйте что можно сделать!
  22. Добрый день! Используем CP2201 (SiLabs) с угловыми разъемами RJ-45 Bothand с интегрированным трансформатором (rx 1CT:1CT / tx 1CT:2.5CT). Это очень специфический коэффициент трансформации, чаще всего идут все 1CT:1CT. Хотим заменить эти разъемы. Вопросы: 1) Как можно использовать самые распространенные разъемы с трансом 1CT:1CT вместе с CP2201? 2) Есть ли в России разъемы RJ-45 (rx 1CT:1CT / tx 1CT:2.5CT) ПРЯМЫЕ (вертикальные), а не угловые? 3) Применяет ли кто отдельно трансформатор и разъем RJ-45 для CP2201. Если да, то какой транс? Вообще, CP2201 довольны, с учетом всех errata работает прекрасно.
  23. А что можно сказать о Quectel M10 ? Там вроде MMS есть. А как с доступностью в России? Кто-нибудь применяет? Кстати, а кто-нибудь применяет Telit? У меня лежит модуль с 2008 года, взяли под проект, но руки не дошли. Стоит смотреть в эту сторону? P.S. Декодер сделаем на диф. включении MT88L70, как рекомендуют многие на форуме.
×
×
  • Создать...