Jump to content

    

Haamu

Участник
  • Content Count

    88
  • Joined

  • Last visited

Everything posted by Haamu


  1. Приветствую, коллеги. Стоит задача измерения переменного напряжения 380В (трехфазное сетевое напряжение) микроконтрллером (для последующего расчета амплитуды, частоты и прочего). Ориентировочная частота выборки порядка 10кГц. Подскажите, пожалуйста схему преобразования такого напряжения в напряжение с амплитудой в 1-1,5В относительно среднего значения в 1,5В (вобщем чтобы уложиться в диапозон работы АЦП микроконтроллера с опорой в 3В). При этом хотелось бы чтобы была гальваническая развязка и минимум элементов. Может есть какие-то готовые решения со специализированными микросхемами (но не особо дорогие).
  2. Контроллер STM32L151RB, CoIDE. Создаю проект, добавляю из репозитория cmsis_boot и CMSIS_core. Собирается, отладка запускается без проблем. Добавляю строку: Кодuint8_t * ptr = malloc(4); Не собирается, ругается что не определена функция _sbrk(). Добавляю из репозитория C Library. Собирается. Запускаю отладку. Дохожу до вызова malloc(), и программа падает в Default_Handler(). Если определить все обработчики ошибок, то сваливается в HardFault. Проделываю точно такую-же последовательность действий, но уже с STM32F407. Без проблем, память выделяется. Что я делаю не так? Или может какая-то особенность есть с динамическим выделением памяти у этих STM32L151? Если все-же я что-то не так делаю, буду очень благодарен, если кто-то поделится пустой заготовкой проекта в CoIDE, чтобы нормально память выделялась.
  3. Цитата(Aaron @ Mar 1 2016, 10:04) посмотрите ld-файлы для STM32F407 и для STM32L151 - может, у вас ссылки на heap в скриптах по-разному заданы? может, для 151 размер кучи = 0? Совпадают слово в слово. Разве что в 407 еще ram1 есть. Все-таки посмотрел ассемблер и память, и стало более понятно. Нашел в startup файле 151го такую особенность: Кодvoid Default_Reset_Handler(void) {   /* Initialize data and bss */ //  unsigned long *pulSrc, *pulDest;   /* Copy the data segment initializers from flash to SRAM */ //  pulSrc = &_sidata; // //  for(pulDest = &_sdata; pulDest < &_edata; ) //  { //    *(pulDest++) = *(pulSrc++); //  } // //  /* Zero fill the bss segment. */ //  for(pulDest = &_sbss; pulDest < &_ebss; ) //  { //    *(pulDest++) = 0; //  }   /* Setup the microcontroller system. */   SystemInit();        /* Call the application's entry point.*/   main(); } Из-за этого в начале SRAM находился какой-то мусор и в процессе работы функции malloc в один момент происходило деление на 0. Раскомментировал этот кусок. Мусор стал более системотизированным, но остался мусором (в сравнении с 407). Куда дальше копать? И еще заметил особенность. Во всех других ARMах и не только, при инициализации структуры таким вот образом: Кодstatic type struct_name = {}; все поля структуры инициализируются нулями. А тут почему-то в них тоже какой-то мусор находится.
  4. Так в том то и дело, что специально для проверки создал пустой проект, в котором только одна вышеупомянутая строка. И именно на ней падает.
  5. stm32l152 eeprom

    Кто знает, подскажите, какая скорость чтения из этой EEPROM? На сколько я понял, для чтения никаких дополнительных операций не нужно, просто копируешь из одного места в памяти, в другое. Если использовать данные из EEPROM, нужно их перед этим копировать в SRAM, или можно прям оттуда использовать?
  6. Контроллер STM32L151. Стоит необходимость очень точного (до тика контроллера) измерения времени между некоторыми событиями. Последовательность событий такая: 1) Дергаю ногой 1, в этот момент надо начать отсчет времени. 2) В момент появления сигнала на ноге 2 нужно сохранить посчитанный временой интервал, дернуть ногой 3 и стартонуть отсчет второго интервала, при этом сделать это всё максимально синхронно! 3) В момент появления сигнала на ноге 4 сохранить второй временой интервал. На этом всё. Собственно вопрос в том, как так по хитрому настроить срабатывание таймеров, чтобы сделать всё этом максимально синхронно? Сразу уточню, что ноги подключена как попало, поэтому использовать их как внешний триггер не получится.
  7. STM32: Синхронизация таймеров

    А в случае, если все-же завести эти сигналы на нужные ноги контроллера, как тогда это можно настроить и какие сигнала на какие ноги заводить?
  8. Стоит задача позиционирования исполнительного механизма по энкодеру на двигателе. Скорость вращения двигателя порядка 1000-3000 об/мин. Контроллер - Atmega8/168/328/и т.п. Нужен не дорогой энкодер, с по-возможности более простым способом подключения. Если использовать инкрементальный энкодер, справится ли контроллер с такой скоростью вращения? И если контроллер справится, то сможет ли при этом выполнять остальные функции, или придется ставить отдельный контроллер на обработку энкодера, а основной будет его периодически опрашивать (получится типа абсолютного энкодера)? Или проще сразу поставить какой-нибудь абсолютный SSI энкодер? Но тут уже вопрос в стоимости, на много ли они дороже? Погуглив немного, так и не появилось понимания разницы в стоимости абсолютных и инкриментальных энкодеров, т.к. почти нигде не указывают цен...
  9. Новая IDE от Microchip

    С инклудами, как выяснилось, проблема только с компилятором XC8. С XC32 такой проблемы нет. Остается главный вопрос. Почему-то не работают MPLAB X IDE версии 3.10 и 3.15. Кто-нибудь сталкивался с этим?
  10. Новая IDE от Microchip

    Стоит MPLAB X 3.00. Работает как-то странно, например пишет, что не может найти стандартные инклуды (#include <stdint.h>), но при этом проект собирается без ошибок. Почему-то не хочет инициализировать структуры и массивы таким образом: КодsType sName = {}; Попробовал скачать и установить последний 3.10. Установил параллельно, не удаляя 3.00. 3.10 вообще работать отказывается, окно открывается, но абсолютно не кликабельное, будто картинка, при этом система сообщает, что программа работает. Закрывается только через диспетчер задач. В чем может быть проблема?
  11. Вот это уже больше похоже на правду. Спасибо.
  12. Вопрос по управлению ногами GPIO. К портам GPIO катодами подключены светодиоды. Если нстроить порт на выход (регистр 0x41), как потом этим портом управлять? То есть в какой регистр и что надо писать, чтобы включить/выключить светодиод?
  13. На сколько я понял, это немного не то. Под PORT2 - PORT7 там (в регистре 0x04) подразумеваются COL2 - COL7, настроенные на работу в режиме GPO.
  14. SSD1322, 256x64

    Разобрался с этим дисплеем. По вертикали всё просто, 0 - это ноль и так далее по одному пикселю. А вот по горизонтали всё очень хитро. Как и писал автор, начало дисплея приходится на столбец номер 28. Далее, каждый столбец соответствует четырем пикселям. Плюс к этому, цвет (яркость) пикселя задается одним из полубайтов передаваемых данных. То есть за один раз можно закрасить минимум 4 пикселя, передав 2 байта данных. Если кому будет интересно, могу сбросить кусок кода для пояснения.
  15. SSD1322, 256x64

    Кто-нибудь смог разобраться с подобным дисплеем? Не могу понять, как соотносятся адреса в памяти с положением пикселей на экране?
  16. ATSAM4S + память F-RAM FM25V20

    Память подключена к шине SPI, ногх WP и HOLD установлены единицы. SPI Mode 0, частота 20Мгц (хотя пробовал и Mode 3 и частоту менял). Другая микросхема на той же шине SPI работает нормально. Пробовал прочитать Status регистр и Devise ID, в результате читаются все нули. Читаю, как написано в даташите, например для Status-регистра: 1)Отправляю 0x05 2)Отправляю 0xFF 3)Смотрю что пришло, а пришел 0. Кто сталкивался с подобной памятью, подскажите, что я делаю не так? Может какие-то хитрости есть, которых я не увидел, читая даташит?
  17. Есть простой код на ассемблере: Код#define delay(tick) __asm("mov r0, %0 \n" "cycle: subs r0, #1 \n" " bhi cycle"::"r"(tick / 2)) Главная его проблема в том, что переход происходит на метку (cycle:), из за чего получается использовать его только один раз. При повторном использовании компилятор ругается, что такая метка уже существует. Подскажите, как можно уйти от метки, не увеличивая сильно число команд?
  18. Цитата(Сергей Борщ @ Sep 26 2014, 17:54) Отличается тем, что вы создавали глобальную метку Cycle, а метка 1 является локальной. Гугление по "gas local label" дает ссылку на документацию: Спасибо. Всё предельно ясно. Вот собственно та самая ссылка. Там еще несколько строчек примера, из который всё становится понятно. Цитата(scifi @ Sep 26 2014, 20:31) Наверное, можно вычислить абсолютное смещение для относительного перехода и указать его в команде. Наверно можно. Но как? Пробовал вместо "bhi cycle" писать "bxhi rX", где X - номер регистра с адресом перехода, но как-то так и не добился правильного результата, то непонятно куда улетает, то вообще в HardFault сваливается.
  19. Отлично, то что надо! Спасибо! Вот, с небольшими поправками для точности: Код#define delay(tick) __asm("mov r0, %0 \n" "1: subs r0, #1 \n" " bhi 1b"::"r"((tick - 2) / 2)) А теперь, если не сложно, поясните пожалуйста, что значит 1b и чем такой вариант отличается от использования метки cycle?
  20. STM32F4 USB-HID

    Контроллер STM32F407. Настраиваю вот этот USB-стек для работы в режиме Device HID-класс. Нужно чтобы передавалось по 64 байта в обе стороны. С передачей от контроллера к ПК разобрался, данные идут. С работой на прием проблема. Смотрел USB-снифером, с компа данные идут. Контроллер на них ни как не реагирует. Есть пример, эмулирующий джойстик. Собственно от этого примера и отталкивался. Но приема данных в этом примере не предусмотренно. Даже OUT endpoint в дескрипторе конфигурации отсутствовала. Добавил ее туда. Что еще нужно сделать, чтобы принимать данные? Если у кого-то поделится уже настроенным стеком, подходящий под мои описания, буду очень благодарен.
  21. STM32F4 USB-HID

    Цитата(Golikov A. @ Sep 10 2014, 17:12) в HID данные от компа в устройство идут по 2 путям через контрольную точку и через OUT точку. зависит от того как посылаете. Если используете hid.dll, то HID_SendOutReport - шлет через контрольную точку WriteFile - через оут точку, возможно еще нужно чтобы были правильно описаны выходные репорты для данной точки в дескрипторах начальных Посылаю через hidapi.dll функцией hid_write. В описании к функции написано "hid_write() will send the data on the first OUT endpoint, if one exists. If it does not, it will send the data through the Control Endpoint (Endpoint 0)." Соответственно предположил, что проблебма в контроллере. Вот дескриптор конфигурации: CODE__ALIGN_BEGIN static uint8_t USBD_HID_CfgDesc[USB_HID_CONFIG_DESC_SIZ] __ALIGN_END = { 0x09, /* bLength: Configuration Descriptor size */ USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */ USB_HID_CONFIG_DESC_SIZ, /* wTotalLength: Bytes returned */ 0x00, 0x01, /*bNumInterfaces: 1 interface*/ 0x01, /*bConfigurationValue: Configuration value*/ 0x00, /*iConfiguration: Index of string descriptor describing the configuration*/ 0xE0, /*bmAttributes: bus powered and Support Remote Wake-up */ 0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/ //!!!!!!!!!!!!!!!!!!!!!!!! /************** Descriptor of interface ****************/ /* 09 */ 0x09, /*bLength: Interface Descriptor size*/ USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/ 0x00, /*bInterfaceNumber: Number of Interface*/ 0x00, /*bAlternateSetting: Alternate setting*/ 0x01, /*bNumEndpoints*/ //!!!!!!!!!!!!!!!!!!!! 0x03, /*bInterfaceClass: HID*/ 0x00,//0x01, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/ //!!!!!!!!!!!!!!!!!!!!!!!! 0x00,//0x02, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/ //!!!!!!!!!!!!!!!!!!!!!!!! 0, /*iInterface: Index of string descriptor*/ /******************** Descriptor of HID ********************/ /* 18 */ 0x09, /*bLength: HID Descriptor size*/ HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/ 0x11, /*bcdHID: HID Class Spec release number*/ 0x01, 0x00, /*bCountryCode: Hardware target country*/ //0x17 - Russia 0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/ 0x22, /*bDescriptorType*/ HID_MOUSE_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/ 0x00, /******************** Descriptor of IN endpoint ********************/ /* 27 */ 0x07, /*bLength: Endpoint Descriptor size*/ USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/ HID_IN_EP, /*bEndpointAddress: Endpoint Address (IN)*/ 0x03, /*bmAttributes: Interrupt endpoint*/ //??????? HID_IN_PACKET, /*wMaxPacketSize: 64 Byte max */ //!!!!!!!!!!!!!!!!!!!!!!!! 0x00, 0x01,//0x0A, /*bInterval: Polling Interval (10 ms)*/ //!!!!!!!!!!!!!!!!!!!!!!!! /******************** Descriptor of OUT endpoint ********************/ /* 34 */ 0x07, /*bLength: Endpoint Descriptor size*/ USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/ HID_OUT_EP, /*bEndpointAddress: Endpoint Address (OUT)*/ 0x03, /*bmAttributes: Interrupt endpoint*/ //??????? HID_IN_PACKET, /*wMaxPacketSize: 64 Byte max */ //!!!!!!!!!!!!!!!!!!!!!!!! 0x00, 0x01,//0x0A, /*bInterval: Polling Interval (10 ms)*/ //!!!!!!!!!!!!!!!!!!!!!!!! /* 41 */ }; А вот репорт: CODE__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] __ALIGN_END = { 0x06, 0x00, 0xff, // USAGE_PAGE (Generic Desktop) 0x09, 0x01, // USAGE (Vendor Usage 1) 0xA1, 0x01, // COLLECTION (Application) // Input report 0x09, 0x01, // USAGE (Vendor Usage 1) 0x15, 0x00, // Logical Minimum (data bytes in the report may have minimum value = 0x00) 0x26, 0xFF, 0x00, // Logical Maximum (data bytes in the report may have maximum value = 0x00FF = unsigned 255) 0x75, 0x08, // Report Size: 8-bit field size 0x95, 0x40, // Report Count 0x81, 0x00, // Input (Data, Array, Abs) // Output report 0x09, 0x01, // USAGE (Vendor Usage 1) 0x15, 0x00, // Logical Minimum (data bytes in the report may have minimum value = 0x00) 0x26, 0xFF, 0x00, // Logical Maximum (data bytes in the report may have maximum value = 0x00FF = unsigned 255) 0x75, 0x08, // Report Size: 8-bit field size 0x95, 0x40, // Report Count 0x91, 0x00, // Output (Data, Array, Abs) 0xC0 // End Collection
  22. Есть устройство, подключаемое через USB, прикидывается виртуальным COM-портом. Для его проверки нужно каким-то образом попереключать режимы работы USB порта на компьютере, например перевести его в режим suspend или запретить энумерацию после подключения устройства. Подскажите пожалуйста, как это можно сделать средствами Windovs 7 или других программ?
  23. Цитата(SM @ Sep 1 2014, 21:31) Suspend - в драйвере поддержать "Selective suspend" у этого "ком-порта". Тогда по истечении какого-то времени виндовс его и вырубит. А можно поподробнее? Это как-то в настройках можно посмотреть или на стадии написания драйвера? Драйвер у меня уже готовый идет, я его сам не писал. Цитата(jcxz @ Sep 2 2014, 08:15) Элементарно: оторвать линии D+/D- оставить только питание и воткнуть. Для этого я втыкаю USB кабель не в комп, а в телефонную зарядку. Меня энумерация собственно вот с какой стороны интересует... При подключении к хосту UBS устройство может потреблять не более 100мА, а после энумерации хост может выдавать тот ток, который прописан в дескрипторе устройства (но не более 500мА). Вот мне и надо как-то остановить процесс, чтобы хост только увидел, что что-то появилось на шине, и успокоился, не опрашивая конфигурацию у устройства.
  24. STM32F4 USB CDC-класс

    Разбираюсь с работой USB (CDC-класс) на STM32F4. У меня на плате имеется возможность связи с копмьютером как через USB (виртуальный COM-порт), так и через USART (RS-485). Для приема данных, не столь важно откуда они пришли. А вот при отправке нужно знать, куда отправлять, то есть нужно знать, подключено ли устройство по USB или нет. Как более правильно это сделать, используя драйвер USB (использую драйвер с сайта st.com)? Можно отслеживать, откуда пришли данные, можно проверить, есть ли питание от USB, наверняка можно еще кучу способов придумать, но хотелось бы через драйвер.
  25. STM32F4 USB CDC-класс

    В дескрипторе конфигурации USB-устройства есть такой параметр, как максимальный потребляемый ток от шины USB. Ткните пожалуйста пальцем, где в STMовском стеке этот параметр настраивается? Сам же и отвечу. Описание дескрипторов конфигурации находится в файле usbd_cdc_core.c, примерно с 216 строки. Там в комментах всё описано. Появился новый вопрос. cdc-класс как-то ограничивает максимальное потребление тока устройством? Ни что не мешает мне установить потребляемый ток в 500мА?