Попробуйте написать более оптимальный код. Вероятно, у Вас получится лучше. Весь вопрос - насколько лучше?
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Bill 06 августа 2005 г. 21:28
В ответ на: Вроде для AVR просили и конкретно SPI, т.е. 8 бит. отправлено Dir 06 августа 2005 г. 16:15


36 //
37 // ** Out9833 -- the function to send data to the AD9833 device
38 //

\ In segment CODE, align 2, keep-with-next
39 void Out9833(unsigned data)
40 {
41 char _cnt = 16; // Bit counter
42
43 DDS_PORT &= ~DDS_MSK; // Be sure all signals are low initially
\ __nearfunc void Out9833(unsigned int);
\ Out9833:
\ 00000000 B328 IN R18,0x18
\ 00000002 712F ANDI R18,0x1F
\ 00000004 BB28 OUT 0x18,R18
44 DDS_EN_PORT |= EN_BIT; // DDS access enable
\ 00000006 9A96 SBI 0x12,0x06
\ 00000008 E120 LDI R18,16
45
46 do { // Transmit all 16 bits
47 if (data & (1<<15)) // Set the data bit
\ ??Out9833_0:
\ 0000000A FF17 SBRS R17,7
\ 0000000C C002 RJMP ??Out9833_1
48 DDS_PORT &= ~SDATA_BIT; //
\ 0000000E 98C7 CBI 0x18,0x07
\ 00000010 C001 RJMP ??Out9833_2
49 else //
50 DDS_PORT |= SDATA_BIT; //
\ ??Out9833_1:
\ 00000012 9AC7 SBI 0x18,0x07
51 DDS_PORT |= SCLK_BIT; // Form clock pulse
\ ??Out9833_2:
\ 00000014 9AC6 SBI 0x18,0x06
52 data <<= 1; // Prepare to send next bit
\ 00000016 0F00 LSL R16
\ 00000018 1F11 ROL R17
53 DDS_PORT &= ~SCLK_BIT; //
\ 0000001A 98C6 CBI 0x18,0x06
54 } //
55 while (--_cnt); //
\ 0000001C 952A DEC R18
\ 0000001E F7A9 BRNE ??Out9833_0
56
57 DDS_EN_PORT &= ~EN_BIT; // DDS access disable
\ 00000020 9896 CBI 0x12,0x06
58 }
\ 00000022 9508 RET


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru