MOHCTEP, посылка точно равна 4 байтам, потому что передаваемое значение по SPI long int. Светодиоды я гашу в мейне, не знаю должны ли они гореть или мигать. У меня они просто горят.
Спойлер
warptred12, Не гасите. Эту строку перенесите внутрь бесконечного цикла for(;;) {..., только добавьте еще небольшую задержку, чтоб можно было увидеть зажженные светодиоды.
MOHCTEP, ну теперь мигает только светодиод подключенный к PD6, PD0,PD1,PD5 - просто горят, а PD2,PD4 - не горят. Как то странно, по идее все включенные светодиоды должны мигать.
Добавлено after 6 minutes 25 seconds:
Чуть позже загорелся PB2 и светоиод, подключенный к ноге PD6 - перестал мигать.
Добавлено after 57 seconds:
Потом и PB1 загорелся.
Действительно странно. Как будто INT1 у вас настроено только на спад (переход 1--0). С остальным вообще не понятно.
Может слишком большую задержку сделали? Попробуйте ее уменьшить или закомментировать.
MOHCTEP, уменьшил задержку до 1мс и теперь мигают PD6,PD0,PD1,PD5. INT1 - настроено на изменение логического уровня, потому что во время спада передаются эти 4 байта и включаются прерывания таймера USI, когда идет rising edge - прерывание выключает этот таймер.
Ну теперь видно, что INT1 вроде работает как задумано (PD5, PD6). А вот с мастера, все одно, только 2 байта приходят, что ли? Но тогда непонятно, как reqID сбрасывается... Раз PD0,PD1 мигают, значит в соответствующие кейсы вы попадаете. Но сброс идет в 3 кейсе, а судя по светодиодам вы до него не достаете. Чудеса однако.
a797945, рассчитывается числовое значение переменной fG(частоты), оно складывается из 3-х байтов полученных значений частоты. Потом эта переменная подставляется в функцию SetUpTim1 и там высчитывается значение регистра стравнения OCR1A и потом в самом прерывании Таймера1 мы дергаем ножкой PB0-PB2 в зависимости от полученного значения nG по SPI. Ну так должно бы по крайней мере, попробывал из этих функций тоже подергать свободными ножками и ничего не получилось.
Спойлер
Сколько памяти осталось на ATtiny?
Запустите UART и просмотрите результаты на компьютере (на реальном устройстве).
В противном случае борьба будет сложной. Что-то куда-то не рассчитывается/не конвертируется/переносится.
Особенно с некоторыми компиляторами, где есть особенности: например. больше 4-5-6 выражений подряд считает не правильно.
Нужно разбить на шаги на временные переменные. Просто даю идею - проверьте и это. И сasting variable.
Последний раз редактировалось veso74 Пт июн 09, 2023 13:02:39, всего редактировалось 1 раз.
veso74, Program size: 706 words (1412 bytes), 68,9% of FLASH. Пока нет возможности на реальном устройстве затестить, нет чипа. Я думаю, что проблема в том, что я как-то не так считываю полученные данные по SPI, потому что функция генерации частоты прекрасно работала без USI. А сейчас она тупо не робит, может я как-то не так считываю полученную информацию в основном цикле.
a797945, передатчик отправляет 4 байта информации в хексадермальном формате, моя задача их получить, склеить и подставить в функцию. Но из этих 4-х байт, 1 байт я должен подставить в переменную nG, а остальные 3 в переменную fG.
Спойлер
(dFi.b[0] | dFi.b[1]<<8 | dFi.b[2]<<16)
символ | - побитное ИЛИ
я таким не пользовался: (мне надо уточнять как правильно объявляется объединение)
typedef union
{
unsigned long int w ; // w as WORD
unsigned int h[2]; // h as HALF-WORD
unsigned char b[4]; // b as BYTE
} Union32;
но если здесь верно - можете брать dFi.w&0x00ffffff (погасив старший байт), только проверьте, чтоб младший и старший байты попадали на свои места.
fG изменил на unsigned long int и начало в проетусе ругаться, что не хватает памяти.
С такой записью: fG = (dFi.b[1]<<8 | dFi.b[2]<<16 | dFi.b[3]<<32), пишет предупреждение shift result will be 0.