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

jenya7

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

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

  • Посещение

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


  1. Я получил следующую схему. Красная линия - селект контролируемый контролером. там где 0 сигнал с контролера, там где 1 сигнал со входа. А как узнать время распространения сигнала в этом муксе?
  2. я пробовал убрать const. все равно получал предупреждение
  3. нет. мне нужно как раз таки без тактирования. мне вход на выход нужно передать за 2-3 наносекунды.
  4. у меня в топ ентити F_LPTG_IN : in std_logic_vector(12 downto 0); F_LPTG_OUT : out std_logic_vector(12 downto 0); в архитектуре signal sel : std_logic := '0'; signal cpu_out : std_logic := '0'; ----------------------------------------------------------------------------- begin F_LPTG_OUT(0) <= F_LPTG_IN(0) when (sel = '1') else cpu_out; компилирую. смотрю в RTL Viewer - пины остались неподключенные.
  5. uint32_t COM_Start(uint32_t argc, char** args); uint32_t COM_Stop(uint32_t argc, char** args); в IAR все прекрасно работает Хм...прикольно... uint32_t (*fp)(unsigned int, char **); это не uint32_t (*fp)(uint32_t, char **); для Атолика
  6. а Вы уверенны что X <= A when (SEL = '1') else B; будет клокироваться? выражение ведь не в процессе.
  7. спасибо. только я не очень понимаю. если это не в процессе X <= A when (SEL = '1') else B; какой будет propagation delay? по клоку или ограниченный логическим элементом?
  8. есть структура typedef struct COMMAND_S { char *name; uint32_t type; uint32_t var_type; uint32_t minargs; uint32_t maxargs; uint32_t (*fp)(unsigned int, char **); uint32_t var_offset; }COMMAND; extern const COMMAND commands[]; я ее инициализирую COMMAND const commands[] = { { "stop", 0, 0, 0, 2, COM_Stop, 0 }, { "start", 0, 0, 0, 2, COM_Start, 0 } } в IAR компилируется и работает без проблем. В Attolic получаю предупреждение с объяснением Функции COM_Stop, COM_Start находятся в другом модуле и подключены через заголовочный файл. Что Атолику не нравиться?
  9. Есть два входа - пин и команда с микроконтролера. В обычном режиме вход скомутирован на выход но если пришла команда с микроконтролера - выход отключается от входа и получает значение пришедшее с контролера. Напрашивается мукс для комутации. Но тут есть еще одно условие - сигнал со входа на выход должен прийти за пару наносекунд. Есть мукс который работает без тактирования?
  10. да ладно. у меня все проекты работают с выставлением флага в прерывании и очисткой его в принимающей функции. иначе зачем volatile. void ISR(void) { flag = 1; } void RX_Func(void) { if (flag) { flag = 0; //do something } } и потом дело совсем в другом. мы отклонились от первоначальной темы. загрузил проект в IAR 8.22.2 - то же самое при static volatile uint32_t master_ack; работает. по другому - не работает. даже без отладки. в ран тайм.
  11. я послал им проект на расмотрение. они еще не ответили. для начала посоветовали (кто бы сомневался) обновить версию. у меня 7.7 а там уже 8.х на горизонте маячит.
  12. А вот в техподдержке IARа подтвердили что так быть не должно. так что посмотрим еще кто к чему не готов.
  13. да но если я не ставлю точку останова а код свободно бежит то в результате мастер не находит слейв. а без оптимизации находит.
  14. так в любом случае return ack; ack - oн всегда будет определен. я заменил флаг can_params.message_received на volatile uint32_t can_message_received; и он устанавливается в прерывании void USB_LP_CAN1_RX0_IRQHandler(void) { can_params.fifo_num = CAN_FIFO0; can_message_received = 1; CAN_Receive(CAN1, CAN_FIFO0, &RxMessage); } ради эксперемента сделал /*master_ack = */ CAN_RX_Master(); и в начале функции опроса жестко поставил master_ack = 1; - все равно заходит в else. О! Только после того как определил static volatile uint32_t master_ack; - все стало на свои места. отдельно static или отдельно volatile не работает.
  15. STM32 CAN фильтр.

    так у меня и есть extended ID. я передаю 0х64 и это ID у меня определено на слейве а 0хFF - только его сравнивать, остальные биты don't care.
  16. у меня есть несколько обработчиков прерывания, на UART, на CAN, но там эта переменная никак не появляется. я прбовал объявить ее static - не помогло.
  17. uint32_t CAN_RX_Master(void){ uint32_t mot_num; uint32_t opcode; uint32_t pos; uint32_t ack = 0; if (can_params.message_received) { can_params.message_received = 0; mot_num = (RxMessage.ExtId & 0xFF) - BASE_MOTOR_ID; if (mot_num > MAX_MOTORS) return 0; opcode = (RxMessage.ExtId >> 8) & 0xFF; switch (opcode) { case CAN_COM_GET_ALL : motor_rt_params[mot_num].current = ((RxMessage.Data[1]<<8) | RxMessage.Data[0]); motor_rt_params[mot_num].speed = ((RxMessage.Data[3]<<8) | RxMessage.Data[2]); motor_rt_params[mot_num].position = ((RxMessage.Data[5]<<8) | RxMessage.Data[4]); ack = 1; break; case CAN_COM_I_AM : motor_rt_params[mot_num].ena = 1; motor_rt_params[mot_num].mot_id = BASE_MOTOR_ID + mot_num; ack = 1; break; case CAN_COM_IGET : motor_rt_params[mot_num].current = ( RxMessage.Data[1]<<8) | RxMessage.Data[0]); pos = CAN_IGET_POS; ack = 1; break; case CAN_COM_PGET : motor_rt_params[mot_num].position = (( RxMessage.Data[1]<<8) | RxMessage.Data[0]); pos = CAN_PGET_POS; ack = 1; break; case CAN_COM_VGET : motor_rt_params[mot_num].speed = (( RxMessage.Data[1]<<8) | RxMessage.Data[0]); pos = CAN_VGET_POS; ack = 1; break; } if (ack) motor_rt_params[mot_num].rx_flags |= (1<<pos); return ack; }
  18. volatile? а с чего он оптимизирует обычную глобальную переменную? Не включать оптимизацию? оптимизация - это единственное наиболее сильное преимущество IAR. Без оптимизации и в Атолике можно кропать. определил как volatile - то же самое - заходит в else.
  19. Есть такой код uint32_t master_ack; //global master_ack = CAN_RX_Master(); if (master_ack == 1) { //пришел сюда если optimization = Low } else //no response { //пришел сюда если optimization = High } master_ack равен 1. при optimization = High я попадаю в else. при optimization = Low я попадаю в if. Все? Сливаем IAR?
  20. ОК. вроде заработало. настраиваю маску на слейве CAN_FilterInitStructure.CAN_FilterNumber = 0; CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000; CAN_FilterInitStructure.CAN_FilterIdLow = 0x0064; CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x00FF; CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0; CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; CAN_FilterInit(&CAN_FilterInitStructure); мастер посылает TxMessage.ExtId = (opcode << 8) | 0х64; однако слейв не принимает. без маски и фильтра принимает.
×
×
  • Создать...