Jump to content

    

jenya7

Участник
  • Content Count

    2236
  • Joined

  • Last visited

Community Reputation

0 Обычный

About jenya7

  • Rank
    Гуру

Recent Profile Visitors

5266 profile views
  1. вобщем решил для начала поставить терминатор с другого конца. и все. нет пропусков. день гонял. есть куча алгоритмических ляпов. но это уже другая история :)
  2. Свое прерывание

    а как им пользоваться?
  3. Свое прерывание

    я еще не совсем определился с идеей... хочу выходить из долгого цикла по условию, что то сделать и продолжить дальше. тогда другой вопрос. скажем я иду в регистр УАРТа, поднимаю там флаг - активизировать прерывание по принятому чару. как этот флаг физически привызывается к таблице прерываний? он (флаг) не знает где находиться таблица.
  4. Свое прерывание

    это понятно. но то же самое можно сделать в STM32, в первом примере?
  5. Свое прерывание

    ну вот возьмем кусок таблицы (это другой проект, не STM32 а Kinetis) #define VECTOR_061 UART0_RX_TX_IRQHandler // 0x0000_00F4 45 UART0 ------------------------------------------------------------------------------ ----------------------------------------------------------------------------- #define VECTOR_114 default_isr // 0x0000_01C8 98 #define VECTOR_115 default_isr // 0x0000_01CC 99 #define VECTOR_116 default_isr // 0x0000_01D0 100 #define VECTOR_117 default_isr // 0x0000_01D4 101 #define VECTOR_118 default_isr // 0x0000_01D8 102 #define VECTOR_119 default_isr // 0x0000_01DC 103 а сама таблица физически выделена const VECTOR vector_entry __vector_table[] = { VECTOR_000, /* Initial SP */ VECTOR_001, /* Initial PC */ VECTOR_002, VECTOR_003, ---------- ---------- VECTOR_253, VECTOR_254, VECTOR_255, }; я инициализирую - enable_irq(45); - и по индексу 45 - у меня находиться UART0_RX_TX_IRQHandler. идексы 98 - 103 - пустые. но прописав enable_irq(103); - я смогу пользоваться #define VECTOR_119 default_isr // 0x0000_01DC 103 или я что то упускаю?
  6. Свое прерывание

    ну это как раз то что нужно. то есть я могу поднять соответствующий бит в NVIC? они по моему привязаны к индексам в таблице прерываний.
  7. Свое прерывание

    В смысле? Я хочу создать свое прерывание, которое будет вызываться по какому нибудь ивенту. то есть вместо DCD 0 ; Reserved - DCD My_IRQHandler. ну и потом по аналогии PUBWEAK EXTI0_IRQHandler SECTION .text:CODE:REORDER:NOROOT(1) EXTI0_IRQHandler B EXTI0_IRQHandler прописать PUBWEAK My_IRQHandler SECTION .text:CODE:REORDER:NOROOT(1) My_IRQHandler B My_IRQHandler чтоб привязать обработчик к таблице. единственно что я не понимаю - как привязать ивент к прерыванию. физически как раз он определен - DCD ведь выделяет место.
  8. Свое прерывание

    Глядя на таблицу прерываний DCD TIM8_BRK_IRQHandler ; TIM8 Break DCD TIM8_UP_IRQHandler ; TIM8 Update DCD TIM8_TRG_COM_IRQHandler ; TIM8 Trigger and Commutation DCD TIM8_CC_IRQHandler ; TIM8 Capture Compare DCD ADC3_IRQHandler ; ADC3 DCD 0 ; Reserved DCD 0 ; Reserved DCD 0 ; Reserved DCD SPI3_IRQHandler ; SPI3 DCD UART4_IRQHandler ; UART4 замечаю что есть неиспользованные - DCD 0 ; Reserved Это значит их можно использовать в своих целях?
  9. я смотрел на скопе. мастер если не получил подтверждение шлет без остановки с установленным auto retransmit.
  10. а если не получает подтверждение?
  11. это не ошибка. при AUTOMATIC RETRANSMITTION у меня шина засирается нипадецки. кстати. сейчас заметил. FIFO то может содержать до трех мэйлбоксов. то есть мне надо считать сколько мэйлбоксов pending в FIFO и считать их всех. void USB_LP_CAN1_RX0_IRQHandler(void) { if(CAN_GetITStatus(CAN1, CAN_IT_FMP0) == SET) { msg_count = CAN_MessagePending(CAN1, CAN_FIFO0); for (int i = 0; i < msg_count; i++) { CAN_Receive(CAN1, CAN_FIFO0, &RxMessage[i]); } } } сейчас получается я читаю один получается я могу ускорить посылку мастера слейвам. сейчас на каждый мэйлбокс я жду ответ. я ведь могу послать три мэйлбокса подряд и подождать ответ после трех.
  12. ну так уж и одинаковый. схожесть есть. но вот три примера и абсолютной идентичности нет. и вот что я не понимаю - при вычислении ошибки (E - Eprev) результат может быть отрицательный. что значит отрицательный PWM?
  13. хочу проверенный, рабочий ПИД, используеммый в motion. к тому же есть пару вопросов по использованию ПИД. 1. можно использовать один и тот же ПИД для закрытия current, position loop? 2. в ПИД присутствует dt - соответственно он запускается во временные интервалы, по таймеру. это мне опрос датчиков тоже надо делать по таймеру? это ухудшает время реакции системы. 3. я вижу коэфициэнты размерности float. по крайней мере те варианты которые я видел. но я помню настройку ПИД в довольно серьезной конторе и там они пользовались коэфициэнтами 100 - 50000. есть реализации с целочисленными коэфициэнтами? этот пункт я понял (по моему) ret = (p_term + i_term + d_term) / SCALING_FACTOR; SCALING_FACTOR дает возможность работать с целыми числами.
  14. Еть ли у кого проверенный PID регулятор для управления моторами? Просмотрел великое множество так и не пришел к однозначному выводу какой использовать.
  15. только пропорциональная его часть. или дифференциальная. смотря как посмотреть.