Клуб DiyAudio

Разное и полезное => Микроконтроллеры и их программирование => Тема начата: lgedmitry от 03 Февраля 2014, 21:03:34

Название: SPI врукопашную: заблудился в трёх соснах.
Отправлено: 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
Название: Re: SPI врукопашную: заблудился в трёх соснах.
Отправлено: AVE от 03 Февраля 2014, 22:11:15
(0x80&&buffer==0x80)
Здесь наверное побитовое умножение маски на buffer надо
Название: Re: SPI врукопашную: заблудился в трёх соснах.
Отправлено: blindman от 04 Февраля 2014, 05:55:17
Во-первых, && - это логическое И, а нужно побитовое - оператор &. Во-вторых, приоритет операторов сравнения выше, чем у логических и битовых :

0x80 & buffer == 0x80 - это 0x80 & (buffer==0x80)
а надо (0x80 & buffer)==0x80

Вообще, правильно будет записать условие так :

if ((0x80 & buffer) != 0)

или, что по сути то же самое:

if (0x80 & buffer)

А так, как было записано, условие будет выполняться только тогда, когда buffer == 0x80
Название: Re: SPI врукопашную: заблудился в трёх соснах.
Отправлено: lgedmitry от 04 Февраля 2014, 10:13:00
AVE, blindman, Пасиб, мужики!
Ещё пару косяков в других местах подобрал - фыфры засветились :yah: :yah: :yah: :yah: :yah:
Название: Re: SPI врукопашную: заблудился в трёх соснах.
Отправлено: blindman от 04 Февраля 2014, 14:10:15
Сергей, ну вот видишь. Не такой уж страшный это самый си
Название: Re: SPI врукопашную: заблудился в трёх соснах.
Отправлено: lgedmitry от 04 Февраля 2014, 17:01:41
Сергей, ну вот видишь. Не такой уж страшный это самый си
Да не, Андрей, страшновато. :o К тому ж я до сих пор не знаю: программистами рождаются, или становятся? ???
Ну раз уж пошла такая тема, не мог бы ты мне ответить: вот я создаю глобальные переменные, а потом процедуры без принимаемых данных, которые по очереди этими переменными пользуются. Не лучше ль создавать процедуры, которые данные-таки принимают, и пользуют локальные переменные? Что будет оптимальнее, с точки зрения загромождения стека и прочих памятей? ;-[
Название: Re: SPI врукопашную: заблудился в трёх соснах.
Отправлено: blindman от 04 Февраля 2014, 17:10:12
Ну, раз уж спросил :)

Лучше передавать аргументы в функцию, без использования глобальных переменных. В данном случае, я бы объединил 2 функции в одну, и передавал бы ей 2 аргумента (которые, кстати, будут размещены в регистрах, а не в ОЗУ - а стэк именно в ОЗУ располагается).

Вообще, глобальные переменные - это зло :learn: Это не значит, что я их не использую, но когда у тебя перестанут возникать такие вопросы, сам поймешь, когда их можно использовать. А до тех пор - старайся их избегать 

и добавил...
программистами рождаются, или становятся
Не знаю. Электронщиками рождаются, или становятся? Каменщиками, печниками, хирургами? Да и хирурги всякие бывают.
Название: Re: SPI врукопашную: заблудился в трёх соснах.
Отправлено: ilya_blazer от 28 Апреля 2016, 10:09:20
К тому ж я до сих пор не знаю: программистами рождаются, или становятся?
Есть такая теория, основанная на практическом опыте - за 10 000 (десять тысяч) часов, потраченных на раобту с любой темой, с полной выкладкой, человек становится профессионалом. :)