Вот первый вариант скетча есть с одним каном, туда добавлял работу для второго кана и пример с петлей данных пакетов кан который вы первый раз для меня делали. после всех добавлений проблемы и всплыли)))
MaksVV, С наступившим новым годом!!! Так же с наступившим новым годом всех участников форума!!!
MaksVV, как обычно нужна ваша помощь, сам что то ни как на могу справиться))) задача следующая, как и в прошлом примере есть пакет данных скажем так же с ID 123 [8] 55 55 55 55 55 55 55 55 ардуино этот пакет принимает и как есть передает обратно в шину только с ID 111 [8] 55 55 55 55 55 55 55 55, но здесь есть еще энкодер, пр повороте энкодера допустим в право ардуино в переправляемом пакете должна сделать изменение допустим в первом байте на одно значение вверх, а при вращении влево в этом же первом байте изменяет значение вниз. допустим в право ID 111 [8] 56 55 55 55 55 55 55 55, ID 111 [8] 57 55 55 55 55 55 55 55. влево ID 111 [8] 54 55 55 55 55 55 55 55, ID 111 [8] 53 55 55 55 55 55 55 55.
#include <Scheduler.h>
#include <mcp_can.h>
#include <SPI.h>
//#define CAN_INT 2
//MCP_CAN CAN(10);
MCP_CAN CAN2(11);
const int pin_C = 7; // энкодер 2R
const int pin_D = 8; // энкодер 2R
const int butPin3 = 9; //кнопка энкодера 2 //Back
unsigned long currentTime;
unsigned long loopTime;
unsigned char encoder_C;
unsigned char encoder_D;
unsigned char encoder_C_prev = 0;
uint32_t curmillis = 0;
unsigned long timing5;
void setup()
{
Serial.begin(115200);
// CAN.begin(CAN_500KBPS);
CAN2.begin(CAN_250KBPS);
pinMode(pin_C, INPUT); // энкодер
pinMode(pin_D, INPUT); // энкодер
currentTime = millis(); // энкодер
loopTime = currentTime; // энкодер
}
void loop()
{
curmillis = millis();
readCAN();
}
void readCAN()
{
if (CAN_MSGAVAIL == CAN2.checkReceive()) // если из CAN пришло сообщение
{
uint32_t rxId; byte len = 0; byte rxBuf[8];
CAN2.readMsgBuf(&len, rxBuf); rxId = CAN2.getCanId();
if (rxId == 0x3FB) {
CAN2.sendMsgBuf(0x30B, 0, len, rxBuf);
}
if (rxId == 0x123) {
CAN2.sendMsgBuf(0x111, 0, len, rxBuf);
}
}
currentTime = millis();
if (currentTime >= (loopTime + 3)) { // проверка состояния
encoder_C = digitalRead(pin_C); // считываем состояние выхода А энкодера
encoder_D = digitalRead(pin_D); // считываем состояние выхода B энкодера
if ((!encoder_C) && (encoder_C_prev)) { // если состояние изменилось с положительного к нулю
if (encoder_D) {
if (millis() - timing5 > 150) {
timing5 = millis();
if (CAN_MSGAVAIL == CAN2.checkReceive());
uint32_t rxId; byte len = 0; byte rxBuf[8];
CAN2.readMsgBuf(&len, rxBuf); rxId = CAN2.getCanId();
CAN2.sendMsgBuf(0x111, 0, len, rxBuf);
if (rxBuf[1] = + 1);
}
}
else {
if (millis() - timing5 > 150) {
timing5 = millis();
if (CAN_MSGAVAIL == CAN2.checkReceive());
uint32_t rxId; byte len = 0; byte rxBuf[8];
CAN2.readMsgBuf(&len, rxBuf); rxId = CAN2.getCanId();
if (rxId == 0x123) {
CAN2.sendMsgBuf(0x111, 0, len, rxBuf);
}
if (rxBuf[1] = - 1);
}
}
}
encoder_C_prev = encoder_C; // сохраняем значение А для следующего цикла
loopTime = currentTime;
}
}
son32 - а у вас самого с программированием вообще по нулям? я помню ваш предыдущий вопрос, где вы не могли ID в сообщении поменять...
А тут... Что за бред у вас написан в строке 66 и 78? Зачем тут if ? И посмотрите в справочнике, как делается инкремент и декремент. Что, неужели не стыдно спрашивать, как прибавить к числу единицу?
Про возраст вопрос для того что бы понимать как дальше отвечать вам, и только))) а вдруг не 32 а 7?
Если вы только пять дней играете с ардуино, то начните с того что изучите мат часть. Что такое скетч, что такое библиотека, что такое IDE и как с ним работать, почитайте разделы для новичков. А так вы просто в ветке просите научите меня я ни чего не умею, тем самым мы с вами разводим просто флуд. И вообще у вас точно arduino DUE а не mega, и есть ли модуль MCP2515, и что именно вы собрались собирать, для чего вам этот скетч? Просто из ответа складывается впечатление что вы просто хотите скомпилировать скетч, и все на этом. Я тоже не спец в ардуино, точнее мне тяжело даётся написание программных кодов/скетчей.
son32 - а у вас самого с программированием вообще по нулям? я помню ваш предыдущий вопрос, где вы не могли ID в сообщении поменять...
А тут... Что за бред у вас написан в строке 66 и 78? Зачем тут if ? И посмотрите в справочнике, как делается инкремент и декремент. Что, неужели не стыдно спрашивать, как прибавить к числу единицу?
Я много раз уже писал что в программировании не силен, то есть не силен в написании скетчей. То что я пробую в данном скетче у меня не работает, другие варианты тоже пробовал из примеров но ни чего не работает. Помощи прошу не сразу как что то не вышло, сижу самостоятельно продолжаю разбираться.
Нет не стыдно, так как тут не просто так единицу прибавить нужно. Если считаете что это элементарно, то покажите пример за место того что бы мораль читать!!!
Если считаете что это элементарно, то покажите пример за место того что бы мораль читать!!!
давайте я вам просто ваши ошибки перечислю, чтоб вы осознали наконец, насколько бестолковый код вы пишете. Может тогда придет понимание, что надо СНАЧАЛА набрать хотя бы минимальный уровень понимания, а потом садиться код писать
Значит так
строка 62 - условие без действия, не сработает
строка 66 - сразу три ошибки в одной строке. Во-первых, опять условие без действия, во-вторых - присваивание вместо инкремента, в третьих первый элемент массива имеет индекс 0, а не 1.
строка 72 - то же, что строка 62
строка 78 - то же как 66
Кроме синтаксических ошибок в программе полно логических. Насколько я понял, вам нужно при приеме пакета от определенного ID прибавить к первому элементу массива единицу и отослать обратно? - но на самом деле вы СНАЧАЛА отсылаете, а потом уже прибавляете. А в строчках 62-66 еще и проверку входящего ID потеряли...
Итого - 9 ошибок в 16 строчках, не считая трех логических. Код такого качества - только в помойку.
b707. Спасибо, я конечно попробую осмыслить то на что вы указали, хотя для меня это сложно. Смысл вообще в том что бы прочитать пакет данных от определенного ID и если энкодер не поворачивается то как есть его отправить обратно под другим ID(как в прошлом примере), но если мы поворачиваем энкодер то прибавить или отнять значение в определенном байте.
Да я согласен что для того что бы писать скетчи нужны знания, но просто честно мне очень сложно даётся теория, проще в практике что то сделать. Вот такой я поршивый человек))) но буду пробовать, так как пока что весь проект стоит из за этого момента(((
Смысл вообще в том что бы прочитать пакет данных от определенного ID и если энкодер не поворачивается то как есть его отправить обратно под другим ID(как в прошлом примере), но если мы поворачиваем энкодер то прибавить или отнять значение в определенном байте.
это понятно
son32 пишет:
весь проект стоит из за этого момента
не обманывайте себя. как только вы исправите это - вы сразу споткнетесь на чем-то еще. Собственно, у вас уже было так дважды, если я правильно помню сколько раз вам Макс писал код. Пока вы не подтянете знания, ваш проект так и будет идти от одного такого "момента" к другому.
Само собой, так и будет. Но в моем понимании для этого мы на форумах и общаемся. Мне к примеру тяжело даётся программирование, а кому то в жизни что то другое даётся тяжело. Просто я ведь не прошу написать всю логику работы моего проекта, мне только пример нужен в небольшом куске, а далее я его уже переделаю как мне нужно. Неужто нужно все бросить и не делать если не силен в программировании?
Может быть сначала поучиться? Потом браться за сложные проекты. Если есть желание, то всё преодолимо. Только надо не наскоками, а потратить какое то время на учебник программирования последовательно, от теме к теме , с самостоятельным решением задач в конце каждого параграфа. Не пропускать что то не понятное с мыслью, что потом не пригодиться. Есть примеры , как в таком режиме скил программирования поднимался до приемлимого уровня за пол года. Иначе ни как.
son32, покажите скетч на меге 2560, где у вас появились проблемы с задержками при работе с CAN.
Наверное этого скетча уже нет(( так как туда уже сохранил скетч на DUE. но попробую его воспроизвести.
Вот первый вариант скетча есть с одним каном, туда добавлял работу для второго кана и пример с петлей данных пакетов кан который вы первый раз для меня делали. после всех добавлений проблемы и всплыли)))
понятно конечно что я неправильно работу таймера организовал
MaksVV, С наступившим новым годом!!! Так же с наступившим новым годом всех участников форума!!!
MaksVV, как обычно нужна ваша помощь, сам что то ни как на могу справиться))) задача следующая, как и в прошлом примере есть пакет данных скажем так же с ID 123 [8] 55 55 55 55 55 55 55 55 ардуино этот пакет принимает и как есть передает обратно в шину только с ID 111 [8] 55 55 55 55 55 55 55 55, но здесь есть еще энкодер, пр повороте энкодера допустим в право ардуино в переправляемом пакете должна сделать изменение допустим в первом байте на одно значение вверх, а при вращении влево в этом же первом байте изменяет значение вниз. допустим в право ID 111 [8] 56 55 55 55 55 55 55 55, ID 111 [8] 57 55 55 55 55 55 55 55. влево ID 111 [8] 54 55 55 55 55 55 55 55, ID 111 [8] 53 55 55 55 55 55 55 55.
MaksVV, понимаю что у вас своих дел много. но всё-таки поможете с доработкой скетча?
son32 - а у вас самого с программированием вообще по нулям? я помню ваш предыдущий вопрос, где вы не могли ID в сообщении поменять...
А тут... Что за бред у вас написан в строке 66 и 78? Зачем тут if ? И посмотрите в справочнике, как делается инкремент и декремент. Что, неужели не стыдно спрашивать, как прибавить к числу единицу?
Только сейчас задумался над вопросом. son32 вам сколько лет? (Ну так просто интересно).
Про возраст вопрос для того что бы понимать как дальше отвечать вам, и только))) а вдруг не 32 а 7?
Если вы только пять дней играете с ардуино, то начните с того что изучите мат часть. Что такое скетч, что такое библиотека, что такое IDE и как с ним работать, почитайте разделы для новичков. А так вы просто в ветке просите научите меня я ни чего не умею, тем самым мы с вами разводим просто флуд. И вообще у вас точно arduino DUE а не mega, и есть ли модуль MCP2515, и что именно вы собрались собирать, для чего вам этот скетч? Просто из ответа складывается впечатление что вы просто хотите скомпилировать скетч, и все на этом. Я тоже не спец в ардуино, точнее мне тяжело даётся написание программных кодов/скетчей.
son32 - а у вас самого с программированием вообще по нулям? я помню ваш предыдущий вопрос, где вы не могли ID в сообщении поменять...
А тут... Что за бред у вас написан в строке 66 и 78? Зачем тут if ? И посмотрите в справочнике, как делается инкремент и декремент. Что, неужели не стыдно спрашивать, как прибавить к числу единицу?
Я много раз уже писал что в программировании не силен, то есть не силен в написании скетчей. То что я пробую в данном скетче у меня не работает, другие варианты тоже пробовал из примеров но ни чего не работает. Помощи прошу не сразу как что то не вышло, сижу самостоятельно продолжаю разбираться.
Нет не стыдно, так как тут не просто так единицу прибавить нужно. Если считаете что это элементарно, то покажите пример за место того что бы мораль читать!!!
Только сейчас задумался над вопросом. son32 вам сколько лет? (Ну так просто интересно).
А вы товарищ вновь в ветке решили флудить? Или таким образом решили отыграться за прошлые сообщения?
Если считаете что это элементарно, то покажите пример за место того что бы мораль читать!!!
давайте я вам просто ваши ошибки перечислю, чтоб вы осознали наконец, насколько бестолковый код вы пишете. Может тогда придет понимание, что надо СНАЧАЛА набрать хотя бы минимальный уровень понимания, а потом садиться код писать
Значит так
строка 62 - условие без действия, не сработает
строка 66 - сразу три ошибки в одной строке. Во-первых, опять условие без действия, во-вторых - присваивание вместо инкремента, в третьих первый элемент массива имеет индекс 0, а не 1.
строка 72 - то же, что строка 62
строка 78 - то же как 66
Кроме синтаксических ошибок в программе полно логических. Насколько я понял, вам нужно при приеме пакета от определенного ID прибавить к первому элементу массива единицу и отослать обратно? - но на самом деле вы СНАЧАЛА отсылаете, а потом уже прибавляете. А в строчках 62-66 еще и проверку входящего ID потеряли...
Итого - 9 ошибок в 16 строчках, не считая трех логических. Код такого качества - только в помойку.
b707. Спасибо, я конечно попробую осмыслить то на что вы указали, хотя для меня это сложно. Смысл вообще в том что бы прочитать пакет данных от определенного ID и если энкодер не поворачивается то как есть его отправить обратно под другим ID(как в прошлом примере), но если мы поворачиваем энкодер то прибавить или отнять значение в определенном байте.
Да я согласен что для того что бы писать скетчи нужны знания, но просто честно мне очень сложно даётся теория, проще в практике что то сделать. Вот такой я поршивый человек))) но буду пробовать, так как пока что весь проект стоит из за этого момента(((
это понятно
не обманывайте себя. как только вы исправите это - вы сразу споткнетесь на чем-то еще. Собственно, у вас уже было так дважды, если я правильно помню сколько раз вам Макс писал код. Пока вы не подтянете знания, ваш проект так и будет идти от одного такого "момента" к другому.
Само собой, так и будет. Но в моем понимании для этого мы на форумах и общаемся. Мне к примеру тяжело даётся программирование, а кому то в жизни что то другое даётся тяжело. Просто я ведь не прошу написать всю логику работы моего проекта, мне только пример нужен в небольшом куске, а далее я его уже переделаю как мне нужно. Неужто нужно все бросить и не делать если не силен в программировании?
Может быть сначала поучиться? Потом браться за сложные проекты. Если есть желание, то всё преодолимо. Только надо не наскоками, а потратить какое то время на учебник программирования последовательно, от теме к теме , с самостоятельным решением задач в конце каждого параграфа. Не пропускать что то не понятное с мыслью, что потом не пригодиться. Есть примеры , как в таком режиме скил программирования поднимался до приемлимого уровня за пол года. Иначе ни как.
Согласен на все сто что нужно поучиться. Честное слово пробую и стараюсь.