Перейти к содержанию
    

Кстати, как по мне, все это очень медленно :) Если использовать камень из свежих (периферия которого поддерживает запись в PINx), то 4 такта на бит вполне получается, хоть на асме, хоть на Си.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, как по мне, все это очень медленно :) Если использовать камень из свежих (периферия которого поддерживает запись в PINx), то 4 такта на бит вполне получается, хоть на асме, хоть на Си.

 

Так и я о том, что как только в голове появляются мысли про такты, следует обращаться к ассемблеру, чтобы эти вопросы урегулировать. Он для того и сделан, чтобы программить в тактах. Но если мысли о тактах вас не посещают, то и думать о них не надо - используйте C. Последннее дело - думать про такты, но програмировать на С :).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так и я о том,

 

Причем тут "и я"? Я только что утверждал, что результаты будут одинаковы, что на асме, что на Си, что совсем не стыкуется с Вашим:

что как только в голове появляются мысли про такты, следует обращаться к ассемблеру, чтобы эти вопросы урегулировать.

 

В первую очередь нужно думать. А потом - писать. Во всех смыслах.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Биг спс. Для 8 ми битного, правильно поправил? =)
Это на запись. А как на чтение? В случае двухстороннего обмена.

 

Подправили правильно :)

Можно поменять unsigned int recv на unsigned char recv если нет необходимости в возврате intov.

Чтобы прочитать из слейва нужно в него записать байт и использовать результат recv - это будет ответ от слейва.

Запись нужна чтобы сгенерировать 8 клоков на SCK по которым слейв выведет байт данных.

 

По поводу быстродействия - вот то что генерирует мой иар (без оптимизации):

In  segment CODE, align 2, keep-with-next
   \   __nearfunc __version_3 unsigned int SPIWriteWord(unsigned int)
   \                     ??SPIWriteWord:
   \   00000000   E020               LDI     R18, 0
   \   00000002   E030               LDI     R19, 0
   \   00000004   982D               CBI     0x05, 0x05
   \   00000006   982A               CBI     0x05, 0x02
   \   00000008   E060               LDI     R22, 0
   \   0000000A   C00A               RJMP    ??SPIWriteWord_1
   \                     ??SPIWriteWord_2:
   \   0000000C   982B               CBI     0x05, 0x03
   \                     ??SPIWriteWord_3:
   \   0000000E   9A2D               SBI     0x05, 0x05
   \   00000010   0F22               LSL     R18
   \   00000012   1F33               ROL     R19
   \   00000014   991C               SBIC    0x03, 0x04
   \   00000016   6021               ORI     R18, 0x01
   \                     ??SPIWriteWord_4:
   \   00000018   982D               CBI     0x05, 0x05
   \   0000001A   0F00               LSL     R16
   \   0000001C   1F11               ROL     R17
   \   0000001E   9563               INC     R22
   \                     ??SPIWriteWord_1:
   \   00000020   3160               CPI     R22, 16
   \   00000022   F420               BRCC    ??SPIWriteWord_5
   \   00000024   FB17               BST     R17, 7
   \   00000026   F796               BRTC    ??SPIWriteWord_2
   \   00000028   9A2B               SBI     0x05, 0x03
   \   0000002A   CFF1               RJMP    ??SPIWriteWord_3
   \                     ??SPIWriteWord_5:
   \   0000002C   9A2A               SBI     0x05, 0x02
   \   0000002E   0189               MOVW    R17:R16, R19:R18
   \   00000030   9508               RET
   \   00000032                      REQUIRE _A_PORTB
   \   00000032                      REQUIRE _A_PINB

 

Со времён последнего моего проекта на ассемблере прошло почти 5 лет. Поэтому сказать что либо об эффективности этого кода я затрудняюсь.

От меня требуют внятно написанные программы на С - я их пишу, а снова влезать в дебри ассемблера не хочу :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 10/18/2009 at 7:04 PM, Xenia said:

SPI куда элегантнее программировать на ассемблере, если аппаратно этого сделать по каким-то причинам нельзя.

спасибо, Ксения :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

//========================================================================
#include "soft_spi.h"
//========================================================================

//========================================================================
u08 soft_spi_receive_buf [SOFT_SPI_BYTES];
u08 soft_spi_transf_buf [SOFT_SPI_BYTES];
//========================================================================

//========================================================================
void soft_spi_init (void)
{
   set_bit (MOSI_SOFT_SPI_DDR, MOSI_SOFT_SPI);
   set_bit (SCK_SOFT_SPI_DDR,  SCK_SOFT_SPI);

   set_bit (LATCH_OUT_DDR, LATCH_OUT);
}
//------------------------------------------------------------------------
void soft_spi_transf (u08 soft_spi_cnt)
{
   u08 data = soft_spi_transf_buf [soft_spi_cnt];

   u08 i;

   for (i = 0; i < 8; i++)
   {
      __watchdog_reset ();

      if (data & 0x80)
         mosi_soft_spi_hi ();
      else
         mosi_soft_spi_lo ();

      data <<= 1;

      delay_us (SOFT_SPI_DELAY/2);

      sck_soft_spi_hi ();
      delay_us(SOFT_SPI_DELAY/2);
      sck_soft_spi_lo ();

      delay_us (SOFT_SPI_DELAY/2);
  }
}
//========================================================================

//========================================================================
void strob_latch_out (void)
{
   set_bit (LATCH_OUT_PORT, LATCH_OUT);
   strob_delay ();
   clr_bit (LATCH_OUT_PORT, LATCH_OUT);
}
//------------------------------------------------------------------------
void strob_delay (void)
{
   u08 a = 16;

   while (a--);
}
//========================================================================

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо тебе, добрый человек. ТС почти 10 лет ждал этого несомненно ценного кода :)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...