Автор Тема: SPI врукопашную: заблудился в трёх соснах.  (Прочитано 8608 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн lgedmitry

  • Старожил
  • *****
  • Сообщений: 4621
  • Репутация: 30
  • Сергей, Рыбинск
  • Поблагодарили: +701

пытаюсь подружить атмегу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
« Последнее редактирование: 03 Февраля 2014, 21:06:27 от lgedmitry »

Оффлайн AVE

  • Постоялец
  • ***
  • Сообщений: 161
  • Репутация: 2
  • Игорь, Казань
  • Поблагодарили: +228
Re: SPI врукопашную: заблудился в трёх соснах.
« Ответ #1 : 03 Февраля 2014, 22:11:15 »
0
(0x80&&buffer==0x80)
Здесь наверное побитовое умножение маски на buffer надо

Оффлайн blindman

  • Старожил
  • *****
  • Сообщений: 798
  • Репутация: 13
  • Андрей
  • Поблагодарили: +18
Re: SPI врукопашную: заблудился в трёх соснах.
« Ответ #2 : 04 Февраля 2014, 05:55:17 »
0
Во-первых, && - это логическое И, а нужно побитовое - оператор &. Во-вторых, приоритет операторов сравнения выше, чем у логических и битовых :

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

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

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

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

if (0x80 & buffer)

А так, как было записано, условие будет выполняться только тогда, когда buffer == 0x80
« Последнее редактирование: 04 Февраля 2014, 05:57:39 от blindman »

Оффлайн lgedmitry

  • Старожил
  • *****
  • Сообщений: 4621
  • Репутация: 30
  • Сергей, Рыбинск
  • Поблагодарили: +701
Re: SPI врукопашную: заблудился в трёх соснах.
« Ответ #3 : 04 Февраля 2014, 10:13:00 »
0
AVE, blindman, Пасиб, мужики!
Ещё пару косяков в других местах подобрал - фыфры засветились :yah: :yah: :yah: :yah: :yah:

Оффлайн blindman

  • Старожил
  • *****
  • Сообщений: 798
  • Репутация: 13
  • Андрей
  • Поблагодарили: +18
Re: SPI врукопашную: заблудился в трёх соснах.
« Ответ #4 : 04 Февраля 2014, 14:10:15 »
0
Сергей, ну вот видишь. Не такой уж страшный это самый си

Оффлайн lgedmitry

  • Старожил
  • *****
  • Сообщений: 4621
  • Репутация: 30
  • Сергей, Рыбинск
  • Поблагодарили: +701
Re: SPI врукопашную: заблудился в трёх соснах.
« Ответ #5 : 04 Февраля 2014, 17:01:41 »
0
Сергей, ну вот видишь. Не такой уж страшный это самый си
Да не, Андрей, страшновато. :o К тому ж я до сих пор не знаю: программистами рождаются, или становятся? ???
Ну раз уж пошла такая тема, не мог бы ты мне ответить: вот я создаю глобальные переменные, а потом процедуры без принимаемых данных, которые по очереди этими переменными пользуются. Не лучше ль создавать процедуры, которые данные-таки принимают, и пользуют локальные переменные? Что будет оптимальнее, с точки зрения загромождения стека и прочих памятей? ;-[

Оффлайн blindman

  • Старожил
  • *****
  • Сообщений: 798
  • Репутация: 13
  • Андрей
  • Поблагодарили: +18
Re: SPI врукопашную: заблудился в трёх соснах.
« Ответ #6 : 04 Февраля 2014, 17:10:12 »
0
Ну, раз уж спросил :)

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

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

и добавил...
программистами рождаются, или становятся
Не знаю. Электронщиками рождаются, или становятся? Каменщиками, печниками, хирургами? Да и хирурги всякие бывают.

Оффлайн ilya_blazer

  • Наш человек
  • ****
  • Сообщений: 633
  • Репутация: 5
  • Илья
  • Поблагодарили: +46
Re: SPI врукопашную: заблудился в трёх соснах.
« Ответ #7 : 28 Апреля 2016, 10:09:20 »
0
К тому ж я до сих пор не знаю: программистами рождаются, или становятся?
Есть такая теория, основанная на практическом опыте - за 10 000 (десять тысяч) часов, потраченных на раобту с любой темой, с полной выкладкой, человек становится профессионалом. :)

 

Похожие темы

  Тема / Автор Ответов Последний ответ
27 Ответов
28073 Просмотров
Последний ответ 05 Декабря 2012, 18:47:32
от Nick