Jump to content

    

Oleg_IT

Свой
  • Content Count

    936
  • Joined

  • Last visited

Everything posted by Oleg_IT


  1. Просьба помочь в выборе процессора. Основные требования: два канала АЦП (от 10 бит), частота оцифровки на оба канала не менее 100 кГц, Изернет, и главное требование, как можно меньше габариты. Всё что нахожу слишком большое, от 100 ног.
  2. Так как Вы описали инициализацию работает, но выигрыш во времени не впечатлил, Atmega48, 10МГц, с запуском АЦП в обработчике внешнего прерывания от начала входного импульса на INT0 до начала прерывания АЦП 66,8 мкс, а тоже время с автоматическим запуском составляет 46,4 мкс. По поводу |= или =. В данном случае это эквивалентно, т.к. регистры по умолчанию равны 0. Но |= всё таки правильнее, это нужно, что бы не повреждать те биты которые нужны для других целей.
  3. Есть такой код #include <stdint.h> #include <avr/io.h> #include <avr/interrupt.h> //#include "PortDefine.h" #include "avrlibdefs.h" #include "avrlibtypes.h" //#define USE_INT0 union { uint16_t ADC_Data; uint8_t ADC_Bute[2]; } Data; #ifdef USE_INT0 ISR (INT0_vect) { ADCSRA |= (1 << ADSC); } #endif // USE_INT0 ISR (ADC_vect) { PORTD |= 1; Data.ADC_Data = (unsigned short)inb(ADCL) | (unsigned short)(inb(ADCH) << 8); PORTD &=~ 1; } int main( void ) { // ADC ADMUX |= (1 << REFS0) | (1 << MUX0) | (1 << MUX2); // ADC5, AVCC ADCSRA |= (1 << ADEN) | (1 << ADATE) | (1 << ADIE); ADCSRB |= (1 << ADTS1); DDRC = 0; PORTC = 0; #ifdef USE_INT0 EICRA |= (1 << ISC01) | (1 << ISC00); EIMSK |= (1 << INT0); #endif // USE_INT0 DDRD = 0x03; PORTD = 4; sei(); ADCSRA |= (1 << ADSC); while (1) { PORTD ^= 2; } return 0; } По идеи он должен запускать оцифровку по внешнему сигналу, но этого не происходит. Если я открываю строку //#define USE_INT0 всё работает правильно, но при этом теряется время. Строку инициализации EICRA убирал из под ифа, не помогает. Может я чего в инициализации упускаю.
  4. Кто работал с платой csr8670 помогите, пока жду лицензию хочется начать уже работать, время поджимает. Не могу найти драйвер для конвертера USB<->SPI для Windows 7, есть только Winows 8. Среда разработки под этот чип BlueLabPro-2.71.exe? Установщик требует Cygwin, он обязателен, с Cygwin64 тоже будет работать?
  5. LPC2478. Работает один канал с синхронизацией по таймеру через MAT0.1. Сейчас возникла необходимость подключить ещё два канала АЦП. По мануалу получается, что это, оцифровка n каналов, возможно при аппаратном сканировании, но тогда синхронизация по таймеру не доступна. Возможно осуществить последовательное оцифровывание n каналов с синхронизацией по таймеру и как это сделать?
  6. Вопрос с адаптацией программатора AS3M решен на компьютере с Windows XP. После установки драйвера версии 5.29, программа CP210xSetIDs корректно распознала программатор, и значение PID было успешно изменено на 0xEA60. После этих действий программатор заработал на Windows 7. Проблема была в том, что я пропустил важную рекомендацию "...тогда можно запустить Windows через кнопку F8 и выбрать режим ”Disable Driver Signing” mode..."
  7. Спасибо. Да, что значит правильно задать вопрос, без chip не ищет.
  8. Подскажите какие фирмы производят микросхемы USB card reader?
  9. Спасибо за подробный ответ. Я специально поднимаю тему именно здесь, может у кого будут такие же проблемы. Хотелось бы ещё уточнить, почему не ставится драйвер по инструкции ASISP_drivers_installation_win7_32-bit_64-bit.pdf. Как я писал в предыдущем своём сообщении окна с выбором файла slabvcp.inf, страница 2 инструкции, нет. Автоматически при первом включении система нужный драйвер не находит, компьютер подключён к интернету.
  10. для инсталяции драйвера предлогается выбрать файл slabvcp.inf в директории Silabs_win_XP_win7, но такого диалога у меня нет, негде выбирать, есть только выбор директории, сам файл в этой директории есть.
  11. Список всегда был пуст В Win XP драйвера ставились сразу и программатор работал без сбоев.
  12. Помогите найти усилители с цифровым управлением, по I2S, SPI, ...
  13. Так я так и делал, в программе CP210xSetIDs которая меняет PID список пустой, ни какие апдейты не помогают.
  14. Перешёл Windows XP на Windows 7 64 бит. Программатор AS3M, пытаюсь поставить для него драйвер, со странички http://www.as-kit.com/AS-tools.soft/asisp_soft.html запускал всё что там есть, Windows упорно не видит драйверов, есть только неопознанное устройство "Ar...". В программе CP210xSetIDs список пустой. Как всё-таки поставить драйвер?
  15. Это фактически и есть прекращение производства, они технологию не выкидывают, а убирают в дальний угол склада и что бы её там найти и достать нужны большие затраты.
  16. Можно примерно сказать через сколько лет выпуска "какой то момент времени" может наступить?
  17. У Ti не могу найти информацию о сроках окончания выпуска продукции, например OMAP-L138 вышел достаточно давно, стоит ли его закладывать в новые разработки?
  18. Делаю для нулевого таймера (всё беру из примеров) T0IR = 1; VICVectAddr = 0; Или ещё что-то нужно? Обнулял конкретный номер прерывания VICVectAddrX = 0;, прерывание возникает только один раз. __irq void Timer0 (void) { T0IR = 1; T0EMR |= (1 << 1); // MAT0.1 P1[29] // VICVectAddr4 = 0; VICVectAddr = 0; } Примерчик бы рабочий
  19. Не нужны они мне. Почти весь код беру из примеров, наверное пока не до конца со всем разобрался. Вот потому и прошу правильные примеры.
  20. Может получится с примером? Спасибо, снять уровень получилось. У меня какая-то общая проблема с прерываниями, включил прерывание от нулевого таймера и они всё забивают.
  21. Нужно набрать отсчеты АЦП в буфер и передать их по изернет. С изернет всё нормально, а когда включаю АЦП прерывания от него забивают всё и не дают выполняться основному циклу, передача по изернет соответственно встаёт. И ни какой синхронизации АЦП и таймера нет. Инициализирую таймеры Для изернета, взято из примера T1MCR = (3 << 0); T1MR0 = TCNT - 1; T1TCR = 1; Для АЦП PINSEL3 |= (3 << 26); T0MCR = (1 << 4); // MR1: Reset T0MR1 = 0x00100000; T0EMR = (1 << 1) | // MAT0.1 P1[29] (3 << 6); // T0TCR = 1; На выходе P1.29 имею меандр, частота управляется (T0MR1). Инициализирую АЦП, взято из примера PCONP |= (1 << 12); AD0CR = ( 0x01 << 0 ) | /* SEL=1,select channel 0~7 on ADC0 */ ( ( Fpclk / ADC_Clk - 1 ) << 8 ) | /* CLKDIV = Fpclk / 4000000 - 1 */ ( 1 << 16 ) | /* BURST = 1, BURST */ ( 0 << 17 ) | /* CLKS = 0, 11 clocks/10 bits */ ( 1 << 21 ) | /* PDN = 1, normal operation */ ( 0 << 22 ) | /* TEST1:0 = 00 */ ( 4 << 24 ) | /* MAT0.1 */ ( 1 << 27 ); /* EDGE = 1 */ /* If POLLING, no need to do the following */ AD0INTEN = 0x1FF; /* Enable interrupts */ install_irq( ADC0_INT, (void *)ADC0, HIGHEST_PRIORITY ); Процедура прерывания АЦП, взято из примера __irq void ADC0 (void) { IENABLE; /* handles nested interrupt */ val = AD0DR0; // Read A/D Data Register SendBuff[NumSBuff][cnt] = ((val >> 5) & 0x3FF); // Extract AD00 Value cnt++; if (cnt == SENDLEN) { cnt = 0; BuffFull = 1; NumSBuff ^= 1; } IDISABLE; VICVectAddr = 0; } С АЦП данные идут правильные, проверил в отладчике. BURST и нулём и единицей делал, запрещал MAT0.1 выходить наружу (PINSEL3 &=~ (3 << 26); ). Ни чего не помогает. Прерываний или вообще нет или они всё забивают. Дайте пример правильной инициализации АЦП и таймера. Ещё одно. Таймер для АЦП программирую для инверсии выхода T0EMR = (3 << 6);, следовательно, частота таймера должна быть в два раза больше необходимой частоты отсчёта, т.к. запуск АЦП программируется только на спад или фронт. А как программно изменить состояние MATx.x не знаю?
  22. Нужно набрать отсчеты АЦП в буфер и передать их по изернет. С изернет всё нормально, а когда включаю АЦП прерывания от него забивают всё и не дают выполняться основному циклу, передача по изернет соответственно встаёт. И ни какой синхронизации АЦП и таймера нет. Инициализирую таймеры Для изернета, взято из примера T1MCR = (3 << 0); T1MR0 = TCNT - 1; T1TCR = 1; Для АЦП PINSEL3 |= (3 << 26); T0MCR = (1 << 4); // MR1: Reset T0MR1 = 0x00100000; T0EMR = (1 << 1) | // MAT0.1 P1[29] (3 << 6); // T0TCR = 1; На выходе P1.29 имею меандр, частота управляется (T0MR1). Инициализирую АЦП, взято из примера PCONP |= (1 << 12); AD0CR = ( 0x01 << 0 ) | /* SEL=1,select channel 0~7 on ADC0 */ ( ( Fpclk / ADC_Clk - 1 ) << 8 ) | /* CLKDIV = Fpclk / 4000000 - 1 */ ( 1 << 16 ) | /* BURST = 1, BURST */ ( 0 << 17 ) | /* CLKS = 0, 11 clocks/10 bits */ ( 1 << 21 ) | /* PDN = 1, normal operation */ ( 0 << 22 ) | /* TEST1:0 = 00 */ ( 4 << 24 ) | /* MAT0.1 */ ( 1 << 27 ); /* EDGE = 1 */ /* If POLLING, no need to do the following */ AD0INTEN = 0x1FF; /* Enable interrupts */ install_irq( ADC0_INT, (void *)ADC0, HIGHEST_PRIORITY ); Процедура прерывания АЦП, взято из примера __irq void ADC0 (void) { IENABLE; /* handles nested interrupt */ val = AD0DR0; // Read A/D Data Register SendBuff[NumSBuff][cnt] = ((val >> 5) & 0x3FF); // Extract AD00 Value cnt++; if (cnt == SENDLEN) { cnt = 0; BuffFull = 1; NumSBuff ^= 1; } IDISABLE; VICVectAddr = 0; } С АЦП данные идут правильные, проверил в отладчике. Дайте пример правильной инициализации АЦП и таймера. Ещё одно. Таймер для АЦП программирую для инверсии выхода T0EMR = (3 << 6);, следовательно, частота таймера должна быть в два раза больше необходимой частоты отсчёта, т.к. запуск АЦП программируется только на спад или фронт. А как программно изменить состояние MATx.x не знаю?
  23. Требуется создать/настроить среду работы пользовательских программ написанных на Qt5. Подробности и условия по почте.
  24. Не совсем так, приведённый пример исключение, типичное время между ACK и FIN ~1с. Программа в ARM получает статус TCP_STATE_CONNECT, проходит проверка tcp_check_send(soket_tcp); и посылает буфер данных, которые до PC не доходят, а вместо них приходит FIN.
  25. Да, на время я не посмотрел, по факту все эти строки вываливаются почти одновременно, вот меня это и сбило. Пока не пойму где тормозить может, в открытом коде ни каких задержек нет.