Jump to content

    

777777

Участник
  • Content Count

    1083
  • Joined

  • Last visited

Everything posted by 777777


  1. У меня в 8.42 не работает отладчик JetLink. При запуске появляется окно "Starting developer session: Loading debug file". Никто не встречался с такой проблемой?
  2. Сначала фреза опускается в центр слота, затем перемещается к одному краю, затем обратно, к другому. Это какие-то хитрые технологические требования или "так получилось"? Можно ведь опустить ее на одном краю и переместить к другому. А как генерируют файлы фрезеровки другие CAD-ы?
  3. Можно ли в гербере для шелкографии использовать команды создания регионов G36/G37? А также "вырезание" в них других регионов путем смены полярности командами %LPD*% и %LPC*%. Или она наносится, грубо говоря, движущимся пером и поэтому допустимы лишь команды G01-D01/D02? Интересуют возможности разных изготовителей.
  4. А хорошо ли это - пользоваться встроенным RC-генератором для тактирования UART-а?
  5. Предполагается, что при включении мастер будет запрашивать по очереди все устройства для получения из заводских номеров и еще кое-какой информации. Когда произойдет обращение к устройствам с одним идентификаторам, они начнут передачу одновременно, коллизия произойдет при передаче данных. Вопрос в том, может ли контроллер одного из них узнать об этом? Ведь арбитраж происходит только по ИД? Если бы устройство могло узнать об ошибке, оно бы инкрементировало "суб-идентификатор" (например два младших бита идентификатора). После окончания ответа первого устройства оно выдает свой ответ, но уже со своим идентификатором и мастер узнает о наличии двух устройств. Таким образом, вопрос лишь в том, может ли устройство узнать о том, что при передаче произошла коллизия в поле данных? До сих пор с CAN-ом иметь дела не приходилось, не знаю его тонкостей. Почему у обоих? Я полагаю ошибка будет у того, кто первым передал рецессивный бит, а тот, кто передавал доминантный этого не заметит. Или при ошибке передача не остановится и если дальше доминантный бит окажется у другого, то данные перемешаются? Да, примерно так и хотим сделать: 9 старших бит раздать датчикам по их назначению, а 2 младших использовать для отличия датчиков одного назначения.
  6. Проектируется система по сбору информации с группы датчиков. Проблема в том, что имеется несколько одинаковых датчиков (датчики оборотов), но их назначение разное (меряют обороты разных устройств). Но поскольку датчики одинаковые, то и идентификаторы у них будут одинаковые. Может ли CAN разрулить эту ситуацию? Не хотелось бы на датчики ставить какие- то переключатели для задания "подидентификаторов".
  7. И прерывания разрешаются? Но у меня в файле startup_stm32f10x_hd.s написано только: Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT __main ; IMPORT SystemInit ; LDR R0, =SystemInit ; BLX R0 LDR R0, =__main BX R0 ENDP Действительно, а мне почему-то казалось, что я попадал в мой main прямо из стартапа.
  8. Нужно ли после инициализации как-то разрешать прерывания? Другие контроллеры при сбросе запрещают прерывания и после инициализации преиферии его нужно разрешать, а как в АРМ? Вообще-то сейчас в программе все прерывания работают, может они разрешаются в стартапе? Но там вроде ничего нет, просто переход на main. Но тогда кто ему устанавливает указатель стека, вызывает конструкторы классов, инициализирует статические переменные?
  9. Чтобы менять значение с частотой 2 МГц, нужен SPI с частотой мин. 2*16 МГц. Кроме того, нужно как-то подавать сигнал синхронизации (LDAC), а AD-шным ЦАПам (по крайней мере некоторым) требуется, чтобы SPI сопросожданся меняющимся сигналом CS, т.е. его нельзя все время держать в нуле. А с помощью DMA его не сформируешь. Разве что таймеры ухитриться запрограммировать так чтобы он выдавал ШИМ нужной формы, а этим таймером запускать DMA SPI Параллельный - это наверное выход, правда на демонстрации показан 12-разрядный ЦАП, а у 5556 время установления 0.5 мкс
  10. Внешний не катит, так как нужно менять его значение быстрее чем через 500 нс
  11. Во-первых, регулируемая пауза здесь будет только при одном переходе, при втором (сбросе счетчика по достижении ICR1) оба выхода поменяют свое состояние одновременно. Во-вторых, все 16-битные счетчики имеют "16-битное" имя и вместо того, чтобы писать: ICR1H=0x00; ICR1L=233; достаточо написать ICR1=233;
  12. Можно, например, подвести питание и землю посередине между АЦП и ПЛИС.
  13. Вообще-то гораздо важнее сделать сплошной слой земли, и это должен быть не полигон, а именно отдельный слой, не занятый никакими другими цепями. А как подводить питание уже не так важно. Ну и конечно не забыть про конденсаторы по питанию около микросхем.
  14. SYNC опускается на время работы SPI, после передачи поднимается. LDAC все это врмя в единице, однако по окончании передачи значение напряжения на выхлоде ЦАПа меняется.
  15. Значение на выходе меняется сразу после загрузки по SPI нового значения. А по даташиту должно меняться по спаду LDAC. Пока число загружается, LDAC в единице. Что я делаю не так?
  16. Забыл "ИЛИ": ADC1->CR2 |= ADC_CR2_ADON; Да, но таймер при зависшем АЦП не работал. Его выход выведен у меня наружу для контроля, так при зависании на этом выходе не было импульсов. Значит АЦП на него как-то влиял.
  17. Тогда нет ничего проще. Делаешь сплошную землю на внутренем слое, если плата двухслойная - подводишь ее толстыми проводниками, на каждый вывод питания проца в непосредственной близости от него вешаешь керамику 0.1 мкф (а лучше больше, сейчас есть керамика до 10 мкф), переходные отверстия к земле делаешь толстыми, не меньше 0.5 мм, опору заводишь через RC-фильтр причем конденсатор этого фильтра подключаешь к земле в непосредственной близости от проца, сигнал от датчика заводишь двумя проводами, причем земляной подключаешь рядом с аналоговой землей. Ну и, конечно, убеждаешься в том, что по земле мимо поцессора не протекают токи от мощных потребителей (светодиодов например). От них возвратные токи должны идти отдельным проводником сразу к источнику питания. Для стояния 10 разрядов этого более чем достаточно. Да почему всегда?! Это будет только если измеряемый сигнал будет находиться вблизи границы переключения. А при большей разрядности младший разряд не будет прыгать? :)
  18. Ты имеешь в виду так: ADC1->CR2 = ADC_CR2_EXTSEL(5) | // Timer 4 CC4 event ADC_CR2_EXTTRIG; // EXTTRIG ADC1->CR2 |= ADC_CR2_ADON; Будешь смеяться, но это помогло. Теперь не зависает даже без нопов. Кстати, когда он зависал, то не работал даже таймер 4. Как таймер мог влиять на калибровку АЦП?
  19. А я всегда считываю из одного: int v = ADC; // :) Это разгильдяйство.
  20. Я еще понимаю когда речь идет о 14-16 разрядном АЦП, но как можно добиться дрожания хотя бы одного бита у 10-разрядного?
  21. Я тоже в других проектах его использовал и ничего не требовалось. Может потому, что здесь АЦП запускается от таймера? Вот вся инициализация: void ADC1Setup() { // TIM4 RCC->APB1ENR |= RCC_APB1ENR_TIM4EN; // TIM4 Periph clock enable TIM4->PSC = 1; // Prescaler = 27.778 ns TIM4->ARR = 297-1; // Auto reload value 297*27.778 = 8.25 us, // 6 отсчетов на импульс длительностью 49.5 us TIM4->CCR4 = 50; // контрольный выход на PB9 TIM4->CCMR1 = 0; TIM4->CCMR2 = TIM_CCMR2_OC4M(6); // channel 4 TIM4->CCER = TIM_ER_CC4E; // set capture/compare enable register // ADC1 RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; // enable clock for ADC1 ADC1->CR1 = ADC_CR1_SCAN | ADC_CR1_EOCIE; ADC1->CR2 = ADC_CR2_EXTSEL(5) | // Timer 4 CC4 event ADC_CR2_EXTTRIG | // EXTTRIG ADC_CR2_ADON; ADC1->SMPR1 =ADC_SMPR1_SMP12(0); // set sample time (1,5 cycles) ADC1->SQR3 = ADC_SQR3_SQ1(12); ADC1->SQR2 = 0; ADC1->SQR1 = ADC_SQR1_L(0); __nop(); __nop(); __nop(); __nop(); __nop(); ADC1->CR2 |= ADC_CR2_RSTCAL; // reset calibration while(ADC1->CR2 & ADC_CR2_RSTCAL) // wait until reset finished {} ADC1->CR2 |= ADC_CR2_CAL; // start calibraton while(ADC1->CR2 & ADC_CR2_CAL) // wait until calibration finished {} NVIC->ISER[0] = (1 << (ADC1_2_IRQChannel & 0x1F)); // enable interrupt ADC1_2 TIM4->CR1 |= TIM_CR1_CEN; }
  22. В процессе отладки программы вдруг стал зависать АЦП во время его инициализации. Оказалось, он не выходит из калибровки: ADC1->CR2 |= ADC_CR2_RSTCAL; // reset calibration while(ADC1->CR2 & ADC_CR2_RSTCAL) // wait until reset finished {} Выяснилось, что если перед ним поставить два или более NOP-ов, то он начинает работать. В даташите нашел следующий абзац: Как это понимать? Калибровка производится при включении питания, поэтому он находится в power-off state гораздо больше, чем два clock cycles. Может наоборот, после включения ADON должно пройти не менее двух циклов? Тогда это объясняет помощь NOP-ов.
  23. У такого сигнала: спектр выглядит таким образом: Точка 2 - это частота несущей, гармоника с частотой 1.5*Fc в 5.9 раза меньше, гармоника 2*Fc равна нулю, а 2.5*Fc уже в 24.7 раза меньше. Так что этот сигнал очень узкополосный, поэтому он и был выбран. Да, я тоже считаю, что если передавать его обычным манчестером, то, хоть затухание и будет сильным, но принять его можно. Но чтобы его принять, потребуется каждый бит оцифровывать хотя бы 6 раз, а лучше 12, а значит при частоте сигнала 300 кбит/с период оцифровки должен быть менее 0.5 мкс (лучше 0.25). Имеющаяся аппаратура - АЦП с периодом 1 мкс и ADSP-2181 с тактовой 33 МГц принять его не сможет, а делать другую не хочется т.к. у клиентов есть несколько сотен старых и если новый прибор сможет приниматься старой аппаратурой, это будет большим плюсом. При частоте оцифровки 1 мкс принять 500 кБит/с, согласно Шеннону, невозможно. Программа-максимум - 300 кбит/с, минимум 250, сейчас 250 принимаются с ошибками, добавление кодов восстановления ошибок еще понизит скорость. Что это? Да, оптоволоконные кабели в нашей отрасли существуют, но клиенты пока не охотно с ними работают.