Доброго времени, решил собрать девайс себе в машину работающее по протоколу CAN. Нужные мне ID пакеты вычислил, написал простенький код по примерам из интернета по передаче нужных мне ID пакетов в шину CAN.
Теперь встал вопрос как мне реализовать период передачи для каждого ID пакета. Сейчас в моем варианте выглядит так:
Код:
Delay(5); can1_335(); // период для этого ID должен быть - 10мс can2_4F3(); // период для этого ID должен быть - 200мс can1_264(); // период для этого ID должен быть - 5мс can1_05C(); // период для этого ID должен быть - 50мс
т.е. с задержкой в 5мс передаются сразу 4 ID пакета и снова задержка в 5мс. Это очень загружает шину данных и не всегда происходит корректная работа всего в целом.
Как мне реализовать эти временные задержки не прибегая к Delay()?
Ну так используй таймер. Примеров в инете уйма. Настраиваешь пределитель на 5мс и все. Если тебе надо динамически менять время задержки, то тогда меняешь значения счетных регистров таймера.
Хм, Не совсем по теме: Влезая в автомобильную шину, уверены вы, что не "заткнете" её? Уверены, в надежности выбранных компонент? На сколько помню в STM32 нету automotive grade серии. По теме:
// при условии Tick per second = 1000; s_uptimeTicks++; if (!(s_uptimeTicks % 5)) sendCanPkg_1(); if (!(s_uptimeTicks % 10)) sendCanPkg_2(); if (!(s_uptimeTicks % 50)) sendCanPkg_3(); if (!(s_uptimeTicks % 200)) sendCanPkg_4(); }
Спасибо Shapa. Именно через системный таймер будет правильней реализовать. Первый вариант тоже правильный, но при этом придется пожертвовать одним из таймеров.
А по поводу перегрузки шины данных в авто, это я разобрался. Дело было в том что мой девайс выдавал к примеру ID 408 DLC 4 Data: 00 1C 51 12 с периодичностью в 1мс а этот пакет уже присутствует в шине но с другими значениями ID 408 DLC 4 Data: 0B 2F 00 10 с периодичностью 10мс вот и получалось что все блоки что принимают этот пакет отказывались работать, из-за постоянно меняющихся значений. Что и приводило к нестабильности работы всех систем авто по шине комфорта (солона)
Теперь вот стоит задача: При первом запуске считать этот пакет ID 408 DLC 4 Data 0B 2F 00 10 и изменив только последний байт на 12 отправлять его обратно.
Дело было в том что мой девайс выдавал к примеру ID 408 DLC 4 Data: 00 1C 51 12 с периодичностью в 1мс а этот пакет уже присутствует в шине но с другими значениями ID 408 DLC 4 Data: 0B 2F 00 10 с периодичностью 10мс вот и получалось что все блоки что принимают этот пакет отказывались работать, из-за постоянно меняющихся значений. Что и приводило к нестабильности работы всех систем авто по шине комфорта (солона)
Чёт я не пойму, а как от этого спасёт выдача данных с корректным периодом? Получится что с одним и тем-же периодом будут слать пакеты два девайса и они (пакеты) будут разными. Каким образом исполнительное устройство поймёт, то твой девайс имеет более высокий приоритет, чем штатный? Или вставляешь ты рвёшь шину и у тебя на борту два CAN?
Хм, Не совсем по теме: Влезая в автомобильную шину, уверены вы, что не "заткнете" её? Уверены, в надежности выбранных компонент? На сколько помню в STM32 нету automotive grade серии. По теме:
// при условии Tick per second = 1000; s_uptimeTicks++; if (!(s_uptimeTicks % 5)) sendCanPkg_1(); if (!(s_uptimeTicks % 10)) sendCanPkg_2(); if (!(s_uptimeTicks % 50)) sendCanPkg_3(); if (!(s_uptimeTicks % 200)) sendCanPkg_4(); }
Ни как не пойму как это работает, кто нибудь может объяснить?
А что именно не понятно? % - это операция остаток от деления. Соответственно, если остаток от деления равен 0 (=false для if), то !(false) = true. Т.е. каждый 5 тик таймера будет выполняться sendCanPkg_1(); Каждый 10-ый - sendCanPkg_2(); Каждый 50-ый - sendCanPkg_3(); Каждый 200-ый - sendCanPkg_4();
А что именно не понятно? % - это операция остаток от деления. Соответственно, если остаток от деления равен 0 (=false для if), то !(false) = true. Т.е. каждый 5 тик таймера будет выполняться sendCanPkg_1(); Каждый 10-ый - sendCanPkg_2(); Каждый 50-ый - sendCanPkg_3(); Каждый 200-ый - sendCanPkg_4();
Ну во-первых: реализация безграмотная, поэтому при каждом переходе счётчика через 0 будет сбой периодов; во-вторых: бессмысленно ресурсоёмкая, так как требует множества операций деления, которые очень тормозные, к тому же в какие-то моменты времени будут выполняться сразу все. И это в ISR. Такое называют говнокодом.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения