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

777777

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

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

  • Посещение

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


  1. Auto. Думаешь от этого что-то зависит? P.S. Да, если поставить Hardware, то всё работает. Правда, больше 6 он не ставит.
  2. В какой-то момент, вероятно когда объём кода превысил некоторый порог, стала стираться флэш программ при выполнении отладки. Результатом стирания является переход на NMI. Стирается блоками по 1 килобайту, если выполнять какую-то отладку - остановиться на точке останова, пошагать и т.д. Иногда обнаруживаются несколько стёртых блоков. Происходит это совершенно стабильно по одному адресу. Если прошить отдельным загрузчиком (например JFlash) или сразу после загрузки выйти из отладчика, то программа запускается и работает. Если код изменить, например добавить что-то, то стираться будет по другому адресу, но столь же стабильно. Пробовал исключить стираемый участок, выделив для программы разделы, в которые не входит стираемый участок. Тогда линкер не размещает там код, но стираться начинают другие участки. Оказалось, что если заменить программатор JetLink на ST-Link, то проблема исчезает. Но он работает только с Cortex, а у нас есть проекты на других процессорах, не хотелось бы плодить программаторы. Встречался ли кто-нибудь с таким явлением и как с ним бороться?
  3. У меня в 8.42 не работает отладчик JetLink. При запуске появляется окно "Starting developer session: Loading debug file". Никто не встречался с такой проблемой?
  4. Сначала фреза опускается в центр слота, затем перемещается к одному краю, затем обратно, к другому. Это какие-то хитрые технологические требования или "так получилось"? Можно ведь опустить ее на одном краю и переместить к другому. А как генерируют файлы фрезеровки другие CAD-ы?
  5. Можно ли в гербере для шелкографии использовать команды создания регионов G36/G37? А также "вырезание" в них других регионов путем смены полярности командами %LPD*% и %LPC*%. Или она наносится, грубо говоря, движущимся пером и поэтому допустимы лишь команды G01-D01/D02? Интересуют возможности разных изготовителей.
  6. А хорошо ли это - пользоваться встроенным RC-генератором для тактирования UART-а?
  7. Предполагается, что при включении мастер будет запрашивать по очереди все устройства для получения из заводских номеров и еще кое-какой информации. Когда произойдет обращение к устройствам с одним идентификаторам, они начнут передачу одновременно, коллизия произойдет при передаче данных. Вопрос в том, может ли контроллер одного из них узнать об этом? Ведь арбитраж происходит только по ИД? Если бы устройство могло узнать об ошибке, оно бы инкрементировало "суб-идентификатор" (например два младших бита идентификатора). После окончания ответа первого устройства оно выдает свой ответ, но уже со своим идентификатором и мастер узнает о наличии двух устройств. Таким образом, вопрос лишь в том, может ли устройство узнать о том, что при передаче произошла коллизия в поле данных? До сих пор с CAN-ом иметь дела не приходилось, не знаю его тонкостей. Почему у обоих? Я полагаю ошибка будет у того, кто первым передал рецессивный бит, а тот, кто передавал доминантный этого не заметит. Или при ошибке передача не остановится и если дальше доминантный бит окажется у другого, то данные перемешаются? Да, примерно так и хотим сделать: 9 старших бит раздать датчикам по их назначению, а 2 младших использовать для отличия датчиков одного назначения.
  8. Проектируется система по сбору информации с группы датчиков. Проблема в том, что имеется несколько одинаковых датчиков (датчики оборотов), но их назначение разное (меряют обороты разных устройств). Но поскольку датчики одинаковые, то и идентификаторы у них будут одинаковые. Может ли CAN разрулить эту ситуацию? Не хотелось бы на датчики ставить какие- то переключатели для задания "подидентификаторов".
  9. И прерывания разрешаются? Но у меня в файле 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 прямо из стартапа.
  10. Нужно ли после инициализации как-то разрешать прерывания? Другие контроллеры при сбросе запрещают прерывания и после инициализации преиферии его нужно разрешать, а как в АРМ? Вообще-то сейчас в программе все прерывания работают, может они разрешаются в стартапе? Но там вроде ничего нет, просто переход на main. Но тогда кто ему устанавливает указатель стека, вызывает конструкторы классов, инициализирует статические переменные?
  11. Чтобы менять значение с частотой 2 МГц, нужен SPI с частотой мин. 2*16 МГц. Кроме того, нужно как-то подавать сигнал синхронизации (LDAC), а AD-шным ЦАПам (по крайней мере некоторым) требуется, чтобы SPI сопросожданся меняющимся сигналом CS, т.е. его нельзя все время держать в нуле. А с помощью DMA его не сформируешь. Разве что таймеры ухитриться запрограммировать так чтобы он выдавал ШИМ нужной формы, а этим таймером запускать DMA SPI Параллельный - это наверное выход, правда на демонстрации показан 12-разрядный ЦАП, а у 5556 время установления 0.5 мкс
  12. Нужен ARM с хорошим ЦАП-ом

    Внешний не катит, так как нужно менять его значение быстрее чем через 500 нс
  13. Во-первых, регулируемая пауза здесь будет только при одном переходе, при втором (сбросе счетчика по достижении ICR1) оба выхода поменяют свое состояние одновременно. Во-вторых, все 16-битные счетчики имеют "16-битное" имя и вместо того, чтобы писать: ICR1H=0x00; ICR1L=233; достаточо написать ICR1=233;
  14. Можно, например, подвести питание и землю посередине между АЦП и ПЛИС.
  15. Вообще-то гораздо важнее сделать сплошной слой земли, и это должен быть не полигон, а именно отдельный слой, не занятый никакими другими цепями. А как подводить питание уже не так важно. Ну и конечно не забыть про конденсаторы по питанию около микросхем.
  16. SYNC опускается на время работы SPI, после передачи поднимается. LDAC все это врмя в единице, однако по окончании передачи значение напряжения на выхлоде ЦАПа меняется.
  17. Значение на выходе меняется сразу после загрузки по SPI нового значения. А по даташиту должно меняться по спаду LDAC. Пока число загружается, LDAC в единице. Что я делаю не так?
  18. Калибровка АЦП

    Забыл "ИЛИ": ADC1->CR2 |= ADC_CR2_ADON; Да, но таймер при зависшем АЦП не работал. Его выход выведен у меня наружу для контроля, так при зависании на этом выходе не было импульсов. Значит АЦП на него как-то влиял.
  19. Тогда нет ничего проще. Делаешь сплошную землю на внутренем слое, если плата двухслойная - подводишь ее толстыми проводниками, на каждый вывод питания проца в непосредственной близости от него вешаешь керамику 0.1 мкф (а лучше больше, сейчас есть керамика до 10 мкф), переходные отверстия к земле делаешь толстыми, не меньше 0.5 мм, опору заводишь через RC-фильтр причем конденсатор этого фильтра подключаешь к земле в непосредственной близости от проца, сигнал от датчика заводишь двумя проводами, причем земляной подключаешь рядом с аналоговой землей. Ну и, конечно, убеждаешься в том, что по земле мимо поцессора не протекают токи от мощных потребителей (светодиодов например). От них возвратные токи должны идти отдельным проводником сразу к источнику питания. Для стояния 10 разрядов этого более чем достаточно. Да почему всегда?! Это будет только если измеряемый сигнал будет находиться вблизи границы переключения. А при большей разрядности младший разряд не будет прыгать? :)
  20. Калибровка АЦП

    Ты имеешь в виду так: ADC1->CR2 = ADC_CR2_EXTSEL(5) | // Timer 4 CC4 event ADC_CR2_EXTTRIG; // EXTTRIG ADC1->CR2 |= ADC_CR2_ADON; Будешь смеяться, но это помогло. Теперь не зависает даже без нопов. Кстати, когда он зависал, то не работал даже таймер 4. Как таймер мог влиять на калибровку АЦП?
  21. А я всегда считываю из одного: int v = ADC; // :) Это разгильдяйство.
  22. Я еще понимаю когда речь идет о 14-16 разрядном АЦП, но как можно добиться дрожания хотя бы одного бита у 10-разрядного?
  23. Калибровка АЦП

    Я тоже в других проектах его использовал и ничего не требовалось. Может потому, что здесь АЦП запускается от таймера? Вот вся инициализация: 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; }
×
×
  • Создать...