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

Haamu

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

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

  • Посещение

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


  1. Приветствую, коллеги. Стоит задача измерения переменного напряжения 380В (трехфазное сетевое напряжение) микроконтрллером (для последующего расчета амплитуды, частоты и прочего). Ориентировочная частота выборки порядка 10кГц. Подскажите, пожалуйста схему преобразования такого напряжения в напряжение с амплитудой в 1-1,5В относительно среднего значения в 1,5В (вобщем чтобы уложиться в диапозон работы АЦП микроконтроллера с опорой в 3В). При этом хотелось бы чтобы была гальваническая развязка и минимум элементов. Может есть какие-то готовые решения со специализированными микросхемами (но не особо дорогие).
  2. Совпадают слово в слово. Разве что в 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 = {}; все поля структуры инициализируются нулями. А тут почему-то в них тоже какой-то мусор находится.
  3. Так в том то и дело, что специально для проверки создал пустой проект, в котором только одна вышеупомянутая строка. И именно на ней падает.
  4. Контроллер STM32L151RB, CoIDE. Создаю проект, добавляю из репозитория cmsis_boot и CMSIS_core. Собирается, отладка запускается без проблем. Добавляю строку: uint8_t * ptr = malloc(4); Не собирается, ругается что не определена функция _sbrk(). Добавляю из репозитория C Library. Собирается. Запускаю отладку. Дохожу до вызова malloc(), и программа падает в Default_Handler(). Если определить все обработчики ошибок, то сваливается в HardFault. Проделываю точно такую-же последовательность действий, но уже с STM32F407. Без проблем, память выделяется. Что я делаю не так? Или может какая-то особенность есть с динамическим выделением памяти у этих STM32L151? Если все-же я что-то не так делаю, буду очень благодарен, если кто-то поделится пустой заготовкой проекта в CoIDE, чтобы нормально память выделялась.
  5. stm32l152 eeprom

    Кто знает, подскажите, какая скорость чтения из этой EEPROM? На сколько я понял, для чтения никаких дополнительных операций не нужно, просто копируешь из одного места в памяти, в другое. Если использовать данные из EEPROM, нужно их перед этим копировать в SRAM, или можно прям оттуда использовать?
  6. А в случае, если все-же завести эти сигналы на нужные ноги контроллера, как тогда это можно настроить и какие сигнала на какие ноги заводить?
  7. STM32: Синхронизация таймеров

    Контроллер STM32L151. Стоит необходимость очень точного (до тика контроллера) измерения времени между некоторыми событиями. Последовательность событий такая: 1) Дергаю ногой 1, в этот момент надо начать отсчет времени. 2) В момент появления сигнала на ноге 2 нужно сохранить посчитанный временой интервал, дернуть ногой 3 и стартонуть отсчет второго интервала, при этом сделать это всё максимально синхронно! 3) В момент появления сигнала на ноге 4 сохранить второй временой интервал. На этом всё. Собственно вопрос в том, как так по хитрому настроить срабатывание таймеров, чтобы сделать всё этом максимально синхронно? Сразу уточню, что ноги подключена как попало, поэтому использовать их как внешний триггер не получится.
  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. На сколько я понял, это немного не то. Под PORT2 - PORT7 там (в регистре 0x04) подразумеваются COL2 - COL7, настроенные на работу в режиме GPO.
  13. Вопрос по управлению ногами GPIO. К портам GPIO катодами подключены светодиоды. Если нстроить порт на выход (регистр 0x41), как потом этим портом управлять? То есть в какой регистр и что надо писать, чтобы включить/выключить светодиод?
  14. Разобрался с этим дисплеем. По вертикали всё просто, 0 - это ноль и так далее по одному пикселю. А вот по горизонтали всё очень хитро. Как и писал автор, начало дисплея приходится на столбец номер 28. Далее, каждый столбец соответствует четырем пикселям. Плюс к этому, цвет (яркость) пикселя задается одним из полубайтов передаваемых данных. То есть за один раз можно закрасить минимум 4 пикселя, передав 2 байта данных. Если кому будет интересно, могу сбросить кусок кода для пояснения.
  15. Кто-нибудь смог разобраться с подобным дисплеем? Не могу понять, как соотносятся адреса в памяти с положением пикселей на экране?
  16. Спасибо. Всё предельно ясно. Вот собственно та самая ссылка. Там еще несколько строчек примера, из который всё становится понятно. Наверно можно. Но как? Пробовал вместо "bhi cycle" писать "bxhi rX", где X - номер регистра с адресом перехода, но как-то так и не добился правильного результата, то непонятно куда улетает, то вообще в HardFault сваливается.
  17. Отлично, то что надо! Спасибо! Вот, с небольшими поправками для точности: #define delay(tick) __asm("mov r0, %0 \n" "1: subs r0, #1 \n" " bhi 1b"::"r"((tick - 2) / 2)) А теперь, если не сложно, поясните пожалуйста, что значит 1b и чем такой вариант отличается от использования метки cycle?
  18. Есть простой код на ассемблере: #define delay(tick) __asm("mov r0, %0 \n" "cycle: subs r0, #1 \n" " bhi cycle"::"r"(tick / 2)) Главная его проблема в том, что переход происходит на метку (cycle:), из за чего получается использовать его только один раз. При повторном использовании компилятор ругается, что такая метка уже существует. Подскажите, как можно уйти от метки, не увеличивая сильно число команд?
  19. STM32F4 USB-HID

    Посылаю через 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)." Соответственно предположил, что проблебма в контроллере. Вот дескриптор конфигурации: __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 */ }; А вот репорт: __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
  20. STM32F4 USB-HID

    Контроллер STM32F407. Настраиваю вот этот USB-стек для работы в режиме Device HID-класс. Нужно чтобы передавалось по 64 байта в обе стороны. С передачей от контроллера к ПК разобрался, данные идут. С работой на прием проблема. Смотрел USB-снифером, с компа данные идут. Контроллер на них ни как не реагирует. Есть пример, эмулирующий джойстик. Собственно от этого примера и отталкивался. Но приема данных в этом примере не предусмотренно. Даже OUT endpoint в дескрипторе конфигурации отсутствовала. Добавил ее туда. Что еще нужно сделать, чтобы принимать данные? Если у кого-то поделится уже настроенным стеком, подходящий под мои описания, буду очень благодарен.
  21. А можно поподробнее? Это как-то в настройках можно посмотреть или на стадии написания драйвера? Драйвер у меня уже готовый идет, я его сам не писал. Для этого я втыкаю USB кабель не в комп, а в телефонную зарядку. Меня энумерация собственно вот с какой стороны интересует... При подключении к хосту UBS устройство может потреблять не более 100мА, а после энумерации хост может выдавать тот ток, который прописан в дескрипторе устройства (но не более 500мА). Вот мне и надо как-то остановить процесс, чтобы хост только увидел, что что-то появилось на шине, и успокоился, не опрашивая конфигурацию у устройства.
  22. Есть устройство, подключаемое через USB, прикидывается виртуальным COM-портом. Для его проверки нужно каким-то образом попереключать режимы работы USB порта на компьютере, например перевести его в режим suspend или запретить энумерацию после подключения устройства. Подскажите пожалуйста, как это можно сделать средствами Windovs 7 или других программ?
  23. STM32F4 USB CDC-класс

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