Rst7 5 18 октября, 2009 Опубликовано 18 октября, 2009 · Жалоба Кстати, как по мне, все это очень медленно :) Если использовать камень из свежих (периферия которого поддерживает запись в PINx), то 4 такта на бит вполне получается, хоть на асме, хоть на Си. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 45 18 октября, 2009 Опубликовано 18 октября, 2009 · Жалоба Кстати, как по мне, все это очень медленно :) Если использовать камень из свежих (периферия которого поддерживает запись в PINx), то 4 такта на бит вполне получается, хоть на асме, хоть на Си. Так и я о том, что как только в голове появляются мысли про такты, следует обращаться к ассемблеру, чтобы эти вопросы урегулировать. Он для того и сделан, чтобы программить в тактах. Но если мысли о тактах вас не посещают, то и думать о них не надо - используйте C. Последннее дело - думать про такты, но програмировать на С :). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 18 октября, 2009 Опубликовано 18 октября, 2009 · Жалоба Так и я о том, Причем тут "и я"? Я только что утверждал, что результаты будут одинаковы, что на асме, что на Си, что совсем не стыкуется с Вашим: что как только в голове появляются мысли про такты, следует обращаться к ассемблеру, чтобы эти вопросы урегулировать. В первую очередь нужно думать. А потом - писать. Во всех смыслах. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mempfis_ 0 19 октября, 2009 Опубликовано 19 октября, 2009 · Жалоба Биг спс. Для 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 лет. Поэтому сказать что либо об эффективности этого кода я затрудняюсь. От меня требуют внятно написанные программы на С - я их пишу, а снова влезать в дебри ассемблера не хочу :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
emake1187 0 8 октября, 2018 Опубликовано 8 октября, 2018 · Жалоба On 10/18/2009 at 7:04 PM, Xenia said: SPI куда элегантнее программировать на ассемблере, если аппаратно этого сделать по каким-то причинам нельзя. спасибо, Ксения :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg1978 1 20 января, 2019 Опубликовано 20 января, 2019 · Жалоба //======================================================================== #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--); } //======================================================================== Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 21 января, 2019 Опубликовано 21 января, 2019 · Жалоба Спасибо тебе, добрый человек. ТС почти 10 лет ждал этого несомненно ценного кода :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться