Последний раз редактировалось dosikus; 24.01.2014 в 12:10.
ZXM-Phoenix 1024+PROF ROM+SMUC+VGA
Profi 1024+CF+CPM+VGA
ATARI 800XL+SIO2PC+SIO2SD
RK86@Maximite
Гы ... На F4 без оптимизации , тупой вывод из массива в соответствии с захваченными адресами - 330nS . 168МГц тактовая от HSE.
Код:void EXTI2_IRQHandler (void) { uint16_t input_buff; uint8_t output_buff=0; EXTI_STB_ON; input_buff=(GPIOB->IDR)&0x00ff; switch(input_buff) { case 0x01:output_buff |=key_buff[0];break; case 0x02:output_buff |=key_buff[1];break; case 0x04:output_buff |=key_buff[2];break; case 0x08:output_buff |=key_buff[3];break; case 0x10:output_buff |=key_buff[4];break; case 0x20:output_buff |=key_buff[5];break; case 0x40:output_buff |=key_buff[6];break; case 0x80:output_buff |=key_buff[7];break; default:break; } GPIOB->ODR=output_buff; EXTI_STB_OFF; EXTI->PR |=EXTI_PR_PR2;
Код:EXTI2_IRQHandler PROC ;;;2 ;;;3 void EXTI2_IRQHandler (void) 000000 2000 MOVS r0,#0 ;;;4 { ;;;5 uint16_t input_buff; ;;;6 uint8_t output_buff=0; ;;;7 ;;;8 ;;;9 EXTI_STB_ON; 000002 2202 MOVS r2,#2 000004 4b48 LDR r3,|L1.296| 000006 619a STR r2,[r3,#0x18] ;;;10 ;;;11 input_buff=(GPIOB->IDR)&0x00ff; 000008 4a48 LDR r2,|L1.300| 00000a 6812 LDR r2,[r2,#0] 00000c b2d1 UXTB r1,r2 ;;;12 switch(input_buff) 00000e 2910 CMP r1,#0x10 000010 d020 BEQ |L1.84| 000012 dc08 BGT |L1.38| 000014 2901 CMP r1,#1 000016 d00d BEQ |L1.52| 000018 2902 CMP r1,#2 00001a d00f BEQ |L1.60| 00001c 2904 CMP r1,#4 00001e d011 BEQ |L1.68| 000020 2908 CMP r1,#8 000022 d127 BNE |L1.116| 000024 e012 B |L1.76| |L1.38| 000026 2920 CMP r1,#0x20 000028 d018 BEQ |L1.92| 00002a 2940 CMP r1,#0x40 00002c d01a BEQ |L1.100| 00002e 2980 CMP r1,#0x80 000030 d120 BNE |L1.116| 000032 e01b B |L1.108| |L1.52| ;;;13 { ;;;14 case 0x01:output_buff |=key_buff[0];break; 000034 4a3e LDR r2,|L1.304| 000036 7812 LDRB r2,[r2,#0] ; key_buff 000038 4310 ORRS r0,r0,r2 00003a e01c B |L1.118| |L1.60| ;;;15 case 0x02:output_buff |=key_buff[1];break; 00003c 4a3c LDR r2,|L1.304| 00003e 7852 LDRB r2,[r2,#1] ; key_buff 000040 4310 ORRS r0,r0,r2 000042 e018 B |L1.118| |L1.68| ;;;16 case 0x04:output_buff |=key_buff[2];break; 000044 4a3a LDR r2,|L1.304| 000046 7892 LDRB r2,[r2,#2] ; key_buff 000048 4310 ORRS r0,r0,r2 00004a e014 B |L1.118| |L1.76| ;;;17 case 0x08:output_buff |=key_buff[3];break; 00004c 4a38 LDR r2,|L1.304| 00004e 78d2 LDRB r2,[r2,#3] ; key_buff 000050 4310 ORRS r0,r0,r2 000052 e010 B |L1.118| |L1.84| ;;;18 case 0x10:output_buff |=key_buff[4];break; 000054 4a36 LDR r2,|L1.304| 000056 7912 LDRB r2,[r2,#4] ; key_buff 000058 4310 ORRS r0,r0,r2 00005a e00c B |L1.118| |L1.92| ;;;19 case 0x20:output_buff |=key_buff[5];break; 00005c 4a34 LDR r2,|L1.304| 00005e 7952 LDRB r2,[r2,#5] ; key_buff 000060 4310 ORRS r0,r0,r2 000062 e008 B |L1.118| |L1.100| ;;;20 case 0x40:output_buff |=key_buff[6];break; 000064 4a32 LDR r2,|L1.304| 000066 7992 LDRB r2,[r2,#6] ; key_buff 000068 4310 ORRS r0,r0,r2 00006a e004 B |L1.118| |L1.108| ;;;21 case 0x80:output_buff |=key_buff[7];break; 00006c 4a30 LDR r2,|L1.304| 00006e 79d2 LDRB r2,[r2,#7] ; key_buff 000070 4310 ORRS r0,r0,r2 000072 e000 B |L1.118| |L1.116| ;;;22 default:break; 000074 bf00 NOP |L1.118| 000076 bf00 NOP ;14 ;;;23 } ;;;24 ;;;25 GPIOB->ODR=output_buff; 000078 4a2c LDR r2,|L1.300| 00007a 1d12 ADDS r2,r2,#4 00007c 6010 STR r0,[r2,#0] ;;;26 ;;;27 EXTI_STB_OFF; 00007e f44f3200 MOV r2,#0x20000 000082 4b29 LDR r3,|L1.296| 000084 619a STR r2,[r3,#0x18] ;;;28 EXTI->PR |=EXTI_PR_PR2; 000086 4a2b LDR r2,|L1.308| 000088 6812 LDR r2,[r2,#0] 00008a f0420204 ORR r2,r2,#4 00008e 4b29 LDR r3,|L1.308| 000090 601a STR r2,[r3,#0] ;;;29 ;;;30 } 000092 4770 BX lr ;;;31 ENDP
Последний раз редактировалось dosikus; 24.01.2014 в 13:15.
ZXM-Phoenix 1024+PROF ROM+SMUC+VGA
Profi 1024+CF+CPM+VGA
ATARI 800XL+SIO2PC+SIO2SD
RK86@Maximite
zst, Если интересно - небольшой quick_start для F4
http://kazus.ru/forums/showthread.php?t=106278
ZXM-Phoenix 1024+PROF ROM+SMUC+VGA
Profi 1024+CF+CPM+VGA
ATARI 800XL+SIO2PC+SIO2SD
RK86@Maximite
Отлично ! 150 ns от начала импульса прерывания до результата команды EXTI_STB_ON;
Теперь давайте займемся оптимизацией:
1. Импульс прерывания нужно сделать другой полярности. То есть при чтении из порта клавиатуры IN_FE (IN_K&K) сигнал равен 0, а не 1.
2. Немного сократим функцию прерывания:
3. Массив key_buff2 заполним заранее, сразу после получения пакета по UART:Код:... EXTI_STB_ON; GPIOB->ODR = key_buff2 [(GPIOB->IDR)&0x00ff]; EXTI_STB_OFF; ...
Код:... for (key_address = 0; key_address <= 255; key_address++) // цикл адреса с клавиатуры от 0 до 255 для заполнения массива данных с клавиатуры { key_data = 255; // начальный результат - все единицы - кнопки не нажаты tmp_byte = key_address; // копируем для разбора по битам for (b = 7; b >= 0; b--) // цикл по битам адреса с клавиатуры { tmp_byte &= 0x00ff; // обнуляем все биты, кроме 8 младших if (tmp_byte < 128) // если старший бит в байте 0, то { key_data &= key_buff[b]; // добавляем к результату состояние соответствующего ряда клавиатуры из пакета } tmp_byte = tmp_byte << 1; // сдвигаем байт адреса влево } key_buff2[key_address] = key_data; // рассчитанный байт клавиатуры для данного адреса клавиатуры записываем в массив }
Последний раз редактировалось zx-kit; 24.01.2014 в 20:38.
"L-256"
Дык в курсе , все это легко переделывается :
Код:EXTI->IMR |= EXTI_IMR_MR2; EXTI->RTSR |=EXTI_RTSR_TR2; <- меняем на EXTI->FTSR |=EXTI_FTSR_TR2; NVIC_SetPriority(EXTI2_IRQn ,12); NVIC_EnableIRQ(EXTI2_IRQn );Вы все таки хотите буфер на 256 , А смысл, если теперь укладываемся ?2. Немного сократим функцию прерывания:
Код:... EXTI_STB_ON; GPIOB->ODR = key_buff2 [(GPIOB->IDR)&0x00ff]; EXTI_STB_OFF; ...
Я тут протащил эмуляцию - самый тяжелый вариант когда входной буфер адресов равен 0xFF.
Смотрите сами - 600nS . Думаю норм если, учесть что это быдлокод, да еще и отладку выкинуть.
Код:void EXTI2_IRQHandler (void) { uint8_t input_buff; uint8_t output_buff=0; EXTI_STB_ON; input_buff=(uint8_t)(GPIOB->IDR)&0x00ff; input_buff=0xFF; if(input_buff & 0x01)output_buff |=key_buff[0]; if(input_buff & 0x02)output_buff |=key_buff[1]; if(input_buff & 0x04)output_buff |=key_buff[2]; if(input_buff & 0x08)output_buff |=key_buff[3]; if(input_buff & 0x10)output_buff |=key_buff[4]; if(input_buff & 0x20)output_buff |=key_buff[5]; if(input_buff & 0x40)output_buff |=key_buff[6]; if(input_buff & 0x80)output_buff |=key_buff[7]; GPIOB->ODR=output_buff; EXTI_STB_OFF; EXTI->PR |=EXTI_PR_PR2; }Код:EXTI2_IRQHandler PROC ;;;2 ;;;3 void EXTI2_IRQHandler (void) 000000 2000 MOVS r0,#0 ;;;4 { ;;;5 uint8_t input_buff; ;;;6 uint8_t output_buff=0; ;;;7 ;;;8 ;;;9 EXTI_STB_ON; 000002 2202 MOVS r2,#2 000004 4b46 LDR r3,|L1.288| 000006 619a STR r2,[r3,#0x18] ;;;10 ;;;11 input_buff=(uint8_t)(GPIOB->IDR)&0x00ff; 000008 4a46 LDR r2,|L1.292| 00000a 6812 LDR r2,[r2,#0] 00000c b2d1 UXTB r1,r2 ;;;12 input_buff=0xFF; 00000e 21ff MOVS r1,#0xff ;;;13 ;;;14 if(input_buff & 0x01)output_buff |=key_buff[0]; 000010 f0110f01 TST r1,#1 000014 d002 BEQ |L1.28| 000016 4a44 LDR r2,|L1.296| 000018 7812 LDRB r2,[r2,#0] ; key_buff 00001a 4310 ORRS r0,r0,r2 |L1.28| ;;;15 if(input_buff & 0x02)output_buff |=key_buff[1]; 00001c f0110f02 TST r1,#2 000020 d002 BEQ |L1.40| 000022 4a41 LDR r2,|L1.296| 000024 7852 LDRB r2,[r2,#1] ; key_buff 000026 4310 ORRS r0,r0,r2 |L1.40| ;;;16 if(input_buff & 0x04)output_buff |=key_buff[2]; 000028 f0110f04 TST r1,#4 00002c d002 BEQ |L1.52| 00002e 4a3e LDR r2,|L1.296| 000030 7892 LDRB r2,[r2,#2] ; key_buff 000032 4310 ORRS r0,r0,r2 |L1.52| ;;;17 if(input_buff & 0x08)output_buff |=key_buff[3]; 000034 f0110f08 TST r1,#8 000038 d002 BEQ |L1.64| 00003a 4a3b LDR r2,|L1.296| 00003c 78d2 LDRB r2,[r2,#3] ; key_buff 00003e 4310 ORRS r0,r0,r2 |L1.64| ;;;18 if(input_buff & 0x10)output_buff |=key_buff[4]; 000040 f0110f10 TST r1,#0x10 000044 d002 BEQ |L1.76| 000046 4a38 LDR r2,|L1.296| 000048 7912 LDRB r2,[r2,#4] ; key_buff 00004a 4310 ORRS r0,r0,r2 |L1.76| ;;;19 if(input_buff & 0x20)output_buff |=key_buff[5]; 00004c f0110f20 TST r1,#0x20 000050 d002 BEQ |L1.88| 000052 4a35 LDR r2,|L1.296| 000054 7952 LDRB r2,[r2,#5] ; key_buff 000056 4310 ORRS r0,r0,r2 |L1.88| ;;;20 if(input_buff & 0x40)output_buff |=key_buff[6]; 000058 f0110f40 TST r1,#0x40 00005c d002 BEQ |L1.100| 00005e 4a32 LDR r2,|L1.296| 000060 7992 LDRB r2,[r2,#6] ; key_buff 000062 4310 ORRS r0,r0,r2 |L1.100| ;;;21 if(input_buff & 0x80)output_buff |=key_buff[7]; 000064 f0110f80 TST r1,#0x80 000068 d002 BEQ |L1.112| 00006a 4a2f LDR r2,|L1.296| 00006c 79d2 LDRB r2,[r2,#7] ; key_buff 00006e 4310 ORRS r0,r0,r2 |L1.112| ;;;22 ;;;23 GPIOB->ODR=output_buff; 000070 4a2c LDR r2,|L1.292| 000072 1d12 ADDS r2,r2,#4 000074 6010 STR r0,[r2,#0] ;;;24 ;;;25 EXTI_STB_OFF; 000076 f44f3200 MOV r2,#0x20000 00007a 4b29 LDR r3,|L1.288| 00007c 619a STR r2,[r3,#0x18] ;;;26 EXTI->PR |=EXTI_PR_PR2; 00007e 4a2b LDR r2,|L1.300| 000080 6812 LDR r2,[r2,#0] 000082 f0420204 ORR r2,r2,#4 000086 4b29 LDR r3,|L1.300| 000088 601a STR r2,[r3,#0] ;;;27 ;;;28 } 00008a 4770 BX lr ;;;29 ENDPХорошо , я тут накидаю и протащу .3. Массив key_buff2 заполним заранее, сразу после получения пакета по UART:
Надо еще внешний стимулятор сделать, раскинуть порты и подумать как сие соптимизировать на счет пинов . Думается все в один порт ...
Последний раз редактировалось dosikus; 24.01.2014 в 21:14.
ZXM-Phoenix 1024+PROF ROM+SMUC+VGA
Profi 1024+CF+CPM+VGA
ATARI 800XL+SIO2PC+SIO2SD
RK86@Maximite
Тут надо добавлять к результату по &
Да, это бы позволило ставить MК по проще / дешевле. К тому же в некоторых компьютерах сигнал чтения с клавиатуры может формироваться долго, что для механической клавиатуры не важно, а у нашей схемы не будет запаса. Да и некоторые Z80 работают на частоте 7МГц....
Хорошо , я тут накидаю и протащу .
Кстати USB работает только на частоте 48 МГц.
Последний раз редактировалось zx-kit; 24.01.2014 в 21:25.
"L-256"
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Где она справляется , покажи будь добр .
Если это о ZXMC , то не находишь что совершенно разные вещи сравниваем ?
И если ты помнишь - изначально я F0 предлагал - чисто джойстики подключить , без клавы.
У меня уже тесты прошли и все пашет - два STM32F030 +2 x nRF24L01 + джойстик NES .
Начинаю ковырять сторону джойстика на предмет прожорливости ...
Последний раз редактировалось dosikus; 24.01.2014 в 21:58.
ZXM-Phoenix 1024+PROF ROM+SMUC+VGA
Profi 1024+CF+CPM+VGA
ATARI 800XL+SIO2PC+SIO2SD
RK86@Maximite
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)