Пишет: Warning: overflow is possible in 16 bit shift left, casting shifted operand to 'long' may be required и shift result will be 0.
Добавлено after 10 minutes 58 seconds:
А массив нигде не модифицируется, кроме прерывания по SPI, а значения из массива просто присваиваются переменным nG и fG(номер выхода и частота).
А это похоже, что master_arr у вас нулями заполняется. Возможно оттого и частота не меняется.
warptred12 писал(а):Так же ругается на эту строчку:
Это я для краткости так написал, видимо не хватает разрядности fG. Если так, то в результате fG всегда = 0 будет. Переделайте эту строку на ваш предыдущий код с темповой переменной.
// Массив корторый приходит от мастера
volatile unsigned long int master_arr [4];
// Массив который отдаем от мастеру
volatile unsigned long int slave_arr [4];
Но теперь генерации частоты на выходе нет, а данные отправляемые к мастеру: 00 81 01 01.
Добавлено after 37 minutes 11 seconds:
Решил изменить код обработчика прерываний SPI полностью, вернувшись к чему-то попроще и это дало результаты. Теперь программа записывает в массив верные значения, но почему-то сдвигает их влево и в 0 байт массива записывает 01. Входные данные с мастера 02 5C 8F 02, данные отправленные обратно: 01 02 5C 0F. Генерации частоты на выходе по прежнему нет.
Вот измененный код:
Спойлер
Не ну...
1 При чем тут countSPIb в условии if (countSPIb >= sizeof(master_arr))... если в прерывании вы его вообще не трогаете, кроме 3-его кейса? У вас это условие никогда не отработает, как по вышеназванной причине, так и из-за сброса его в прерывании.
2 Зачем оно вообще нужно, если вы "завели" новый счетчик - reqID?
И на всяк случай - еще раз: чтобы все отработало хоть приблизительно правильно - счетчик в прерывании не сбрасывать!
MOHCTEP, с этими правками мастер шлет все верно 02 5C 8F 02(номер пина и частота в хексадермальном формате), а обратно слейв отсылает 81 00 00 00, пробовал светодиодами тестировать кейсы, как в прошлый раз с attiny - все кейсы работают. Генерации частоты ни на одном пине нет.
Код слефва:
Спойлер
MOHCTEP, нет, все 4 кейса работают, не работает именно if (reqID>= sizeof(master_arr)).
Добавлено after 4 minutes 50 seconds:
В прерывании я включаю порты PC0-PC3 PORTC |= (1<<x);, в оснвном цикле for(;;) - я их выключаю PORTC &= ~(1<<x);.
Значит ли это, что прерывания не работают или это значит, что прерывание срабатывает лишь раз ?
Обсуждалось в другой теме. Использование sizeof для определения размера массивов дает неправильный результат, поскольку параметры массива рассматриваются как указатели. Попробуйте:
Именно компилятор пишет красным на эту строку: if (reqID >= (sizeof(arr) / sizeof(arr[0]))) - expression expected.
Добавлено after 1 minute 35 seconds:
А я понял, я не свой массив там написал. У моего массива другое имя.
Добавлено after 3 minutes 14 seconds: veso74, теперь функция if (reqID >= (sizeof(master_arr) / sizeof(master_arr[0]))) - работает, загорается светодиод, как и все остальные кейсы. Но данные по прежнему идут неверные - 81 00 00 00(слейв почему-то это записывает, вместо 02 5C 8F 02). Ну и соответственно изза этого и генерации частоты нет никакой.
Для этого следуйте логике вашего примера. Если так сложно (карандаш и лист бумаги!), разбейте примерно на части и напр. распечатайте промежуточные результаты, или делайте реакцией к LED? ...
veso74, слейв постоянно отправляет в ответ на принятые данные 81 00 00 00 и такой результат был до изменения функции if (reqID >= (sizeof(arr) / sizeof(arr[0]))). Это значит, что где-то в коде полученные данные кораптятся или теряются и в итоге получаются неверные значения.
Добавлено after 57 seconds:
Даже в том случае, когда я меняю, отправляемые входные данные с мастера.
Добавлено after 1 minute 32 seconds:
Я пробовал комментировать функции расчета регистр таймера, хранения переменной и результат все равно все тот же.
Добавлено after 57 seconds:
Что-то не так конкретно в прерывании, где мы принимаем байты или в основной функции, где мы их подставляем в переменные fG и nG. Но как уже выяснилось: кейсы работают, функия if - тоже работает.
Последний раз редактировалось warptred12 Чт июл 06, 2023 15:34:04, всего редактировалось 1 раз.
MOHCTEP, ее нет на выходе, потому что первый полученный байт от мастера 81 - он должен подставляется в переменную nG и уже в прерывании таймера 1 эта переменная обрабатывается и на основании ее значения выбирается ножка, значение 81 - некорректно, поэтому и нет генерации ни на одной ноге.
Добавлено after 56 seconds:
Неверно выразился, первый прочитанный байт.
Добавлено after 6 minutes 8 seconds:
Да и вот код актуальный на данный момент:
Спойлер