Клуб DiyAudio
Разное и полезное => Микроконтроллеры и их программирование => Тема начата: lgedmitry от 03 Февраля 2014, 21:03:34
-
пытаюсь подружить атмегу8а с MAX6591. Что-то очень плохо получается. Аппаратный SPI не задействовать никак.
Написал две такие процедурки: первая посылает старший байт и не завершает сеанс, так как посылка должна быть 16 битной.
Вторая засылает второй байт и закрывает сеанс.
void spiaddr(void) //писалка адреса в максимку
{
CLK=0;
CS=0;
i=0;
while (i<8)
{if (0x80&&buffer==0x80)
DIN=1;
else DIN=0;
i++;
CLK=1;
buffer=buffer<<1;
CLK=0;
}
}
void spidat(void) //писалка адреса в максимку
{
//CLK=0;
i=0;
while (i<8)
{CLK=0;
if (0x80&&buffer==0x80)
DIN=1;
else DIN=0;
i++;
CLK=1;
buffer=buffer<<1;
}
CS=1;
}
дальше я их вызываю по очереди
buffer=0x01; // все фыфры декодировать
spiaddr();
buffer=0xFF;
spidat();
buffer=0x02; // 15мА
spiaddr();
buffer=0x05;
spidat();
buffer=0x03; // 8 фыфр
spiaddr();
buffer=0x07;
spidat();
buffer=0x04; // настройки
spiaddr();
buffer=0x05;
spidat();
получилось красиво, но почему-то неработает. Иль может оно где-то не здесь неработает? И искать надо в другом месте ???
и добавил...
забыл уточнить, CLK, CS и DIN - это ножки порта задифайненные ;-[
и добавил...
buffer - это unsigned char
-
(0x80&&buffer==0x80)
Здесь наверное побитовое умножение маски на buffer надо
-
Во-первых, && - это логическое И, а нужно побитовое - оператор &. Во-вторых, приоритет операторов сравнения выше, чем у логических и битовых :
0x80 & buffer == 0x80 - это 0x80 & (buffer==0x80)
а надо (0x80 & buffer)==0x80
Вообще, правильно будет записать условие так :
if ((0x80 & buffer) != 0)
или, что по сути то же самое:
if (0x80 & buffer)
А так, как было записано, условие будет выполняться только тогда, когда buffer == 0x80
-
AVE, blindman, Пасиб, мужики!
Ещё пару косяков в других местах подобрал - фыфры засветились :yah: :yah: :yah: :yah: :yah:
-
Сергей, ну вот видишь. Не такой уж страшный это самый си
-
Сергей, ну вот видишь. Не такой уж страшный это самый си
Да не, Андрей, страшновато. :o К тому ж я до сих пор не знаю: программистами рождаются, или становятся? ???
Ну раз уж пошла такая тема, не мог бы ты мне ответить: вот я создаю глобальные переменные, а потом процедуры без принимаемых данных, которые по очереди этими переменными пользуются. Не лучше ль создавать процедуры, которые данные-таки принимают, и пользуют локальные переменные? Что будет оптимальнее, с точки зрения загромождения стека и прочих памятей? ;-[
-
Ну, раз уж спросил :)
Лучше передавать аргументы в функцию, без использования глобальных переменных. В данном случае, я бы объединил 2 функции в одну, и передавал бы ей 2 аргумента (которые, кстати, будут размещены в регистрах, а не в ОЗУ - а стэк именно в ОЗУ располагается).
Вообще, глобальные переменные - это зло :learn: Это не значит, что я их не использую, но когда у тебя перестанут возникать такие вопросы, сам поймешь, когда их можно использовать. А до тех пор - старайся их избегать
и добавил...
программистами рождаются, или становятся
Не знаю. Электронщиками рождаются, или становятся? Каменщиками, печниками, хирургами? Да и хирурги всякие бывают.
-
К тому ж я до сих пор не знаю: программистами рождаются, или становятся?
Есть такая теория, основанная на практическом опыте - за 10 000 (десять тысяч) часов, потраченных на раобту с любой темой, с полной выкладкой, человек становится профессионалом. :)