User Tag List

Показано с 1 по 10 из 258

Тема: ZX Remote GamePad

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    Регистрация
    11.04.2009
    Адрес
    г. Санкт-Петербург
    Сообщений
    3,603
    Записей в дневнике
    15
    Спасибо Благодарностей отдано 
    19
    Спасибо Благодарностей получено 
    67
    Поблагодарили
    52 сообщений
    Mentioned
    1 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от dosikus Посмотреть сообщение
    Гы ... На F4 без оптимизации , тупой вывод из массива в соответствии с захваченными адресами - 330nS . 168МГц тактовая от HSE.
    Отлично ! 150 ns от начала импульса прерывания до результата команды EXTI_STB_ON;

    Теперь давайте займемся оптимизацией:

    1. Импульс прерывания нужно сделать другой полярности. То есть при чтении из порта клавиатуры IN_FE (IN_K&K) сигнал равен 0, а не 1.

    2. Немного сократим функцию прерывания:
    Код:
    ...
              EXTI_STB_ON;
              
              GPIOB->ODR = key_buff2 [(GPIOB->IDR)&0x00ff];
    
              EXTI_STB_OFF;
    ...
    3. Массив key_buff2 заполним заранее, сразу после получения пакета по UART:
    Код:
    ...
    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"

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2

    Регистрация
    29.03.2005
    Адрес
    Ярославль
    Сообщений
    1,102
    Спасибо Благодарностей отдано 
    14
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от zst Посмотреть сообщение


    1. Импульс прерывания нужно сделать другой полярности. То есть при чтении из порта клавиатуры IN_FE (IN_K&K) сигнал равен 0, а не 1.
    Дык в курсе , все это легко переделывается :
    Код:
         EXTI->IMR |= EXTI_IMR_MR2;
         EXTI->RTSR |=EXTI_RTSR_TR2;   <- меняем на  EXTI->FTSR |=EXTI_FTSR_TR2;
         NVIC_SetPriority(EXTI2_IRQn ,12);
         NVIC_EnableIRQ(EXTI2_IRQn );
    2. Немного сократим функцию прерывания:
    Код:
    ...
              EXTI_STB_ON;
              
              GPIOB->ODR = key_buff2 [(GPIOB->IDR)&0x00ff];
    
              EXTI_STB_OFF;
    ...
    Вы все таки хотите буфер на 256 , А смысл, если теперь укладываемся ?
    Я тут протащил эмуляцию - самый тяжелый вариант когда входной буфер адресов равен 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

  4. #3

    Регистрация
    11.04.2009
    Адрес
    г. Санкт-Петербург
    Сообщений
    3,603
    Записей в дневнике
    15
    Спасибо Благодарностей отдано 
    19
    Спасибо Благодарностей получено 
    67
    Поблагодарили
    52 сообщений
    Mentioned
    1 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от dosikus Посмотреть сообщение
    Вы все таки хотите буфер на 256 , А смысл, если теперь укладываемся ?
    Я тут протащил эмуляцию - самый тяжелый вариант когда входной буфер адресов равен 0xFF.
    Смотрите сами - 600nS . Думаю норм если, учесть что это быдлокод, да еще и отладку выкинуть.
    ...
    if(input_buff & 0x01)output_buff |=key_buff[0];
    Тут надо добавлять к результату по &
    ...
    Хорошо , я тут накидаю и протащу .
    Да, это бы позволило ставить MК по проще / дешевле. К тому же в некоторых компьютерах сигнал чтения с клавиатуры может формироваться долго, что для механической клавиатуры не важно, а у нашей схемы не будет запаса. Да и некоторые Z80 работают на частоте 7МГц.

    Кстати USB работает только на частоте 48 МГц.
    Последний раз редактировалось zx-kit; 24.01.2014 в 21:25.
    "L-256"

  5. #4

    Регистрация
    29.03.2005
    Адрес
    Ярославль
    Сообщений
    1,102
    Спасибо Благодарностей отдано 
    14
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от zst Посмотреть сообщение

    Кстати USB работает только на частоте 48 МГц.
    Это Вы о чем? И к чему ? 4xx есть OTG Hs а это 480мбитс.


    Повесил на вход кнопку :



    Как видите все стабильно, те же 600nS при проверке всего порта.
    ZXM-Phoenix 1024+PROF ROM+SMUC+VGA
    Profi 1024+CF+CPM+VGA
    ATARI 800XL+SIO2PC+SIO2SD
    RK86@Maximite

  6. #5

    Регистрация
    11.04.2009
    Адрес
    г. Санкт-Петербург
    Сообщений
    3,603
    Записей в дневнике
    15
    Спасибо Благодарностей отдано 
    19
    Спасибо Благодарностей получено 
    67
    Поблагодарили
    52 сообщений
    Mentioned
    1 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от dosikus Посмотреть сообщение
    Это Вы о чем? И к чему ? 4xx есть OTG Hs а это 480мбитс.
    В листке данных на STM32F407VG (http://www.st.com/st-web-ui/static/a...DM00037051.pdf) в разделе USB (стр.36) написано:
    "..The USB OTG full-speed controller requires a dedicated 48 MHz clockthat is generated by a PLL connected to the HSE oscillator..."

    Что я ошибочно понял как: если вы работаете с USB, то частоту с 168 нужно снизить до 48 МГц. Поэтому особо крутой арм для работы и ненужен. Все равно частота 48 МГц будет.

    PS. Все нормально. Я неправильно перевел, вот версия перевода от гугла: OTG USB контроллер на полной скорости требуется специальный часы 48 МГц что порождается PLL, соединенного с генератором.
    Последний раз редактировалось zx-kit; 24.01.2014 в 22:17.
    "L-256"

  7. #6

    Регистрация
    29.03.2005
    Адрес
    Ярославль
    Сообщений
    1,102
    Спасибо Благодарностей отдано 
    14
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от zst Посмотреть сообщение

    PS. Наверно, я неправильно перевел: OTG USB контроллер на полной скорости требуется специальный часы 48 МГц что порождается PLL, соединенного с генератором.
    Да, Вы не правильно и перевели и поняли .
    Частота тактирования USB выставляется различными множителями конфигурилками PLL . См картинку :


    ZXM-Phoenix 1024+PROF ROM+SMUC+VGA
    Profi 1024+CF+CPM+VGA
    ATARI 800XL+SIO2PC+SIO2SD
    RK86@Maximite

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Super GamePAD
    от zx-kit в разделе Устройства ввода
    Ответов: 1
    Последнее: 02.01.2014, 10:39
  2. Unreal+PC Gamepad
    от breeze в разделе Эмуляторы
    Ответов: 5
    Последнее: 20.10.2007, 23:09

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •