реклама на сайте
подробности

 
 
> Захват импульсов PS2 мыши через EXTI
pvo125
сообщение Feb 12 2016, 13:44
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 9-04-14
Из: Черногорск Хакасия
Пользователь №: 81 299



Здравствуйте! Пытаюсь присоединить мышь PS2 к stm32f4. Отправку и принятие байт написал через ногодрыг. Далее Посылаю мышки серию команд (сброс - ответ, скорость сэмплов-ответ, включение в стрим режим). Далее мышь (правда через раз ) отвечает на все команды утвердительно ACK и переходит в стрим режим и начинает слать сэмпл по 3 байта (каждый из 11 бит) на каждое перемещение или нажатие кнопок. В общем все нормально сэмплы смотрел осциллом. Далее я просто пытаюсь через EXTI считать по 11 бит первый второй и третий байт и писать их в соответствующий буфер. Ниже функции которые делают это.
Код
void EXTI9_5_IRQHandler (void){
    if(EXTI->PR&EXTI_PR_PR6)
    {
        PS2_Mouse_ISR();
    }
    EXTI->PR=EXTI_PR_PR6;
    NVIC_ClearPendingIRQ(EXTI9_5_IRQn);
    }


Код
void PS2_Mouse_ISR(void){
    uint8_t temp;
    static uint8_t bit_pos=0;
    static uint8_t scancode=0;
    temp=HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7);
    if((bit_pos>=1)&&(bit_pos<=8))
    {
        scancode=scancode>>1;
        if(temp==GPIO_PIN_SET)
            scancode|=0x80;
    }
    bit_pos++;
    if(bit_pos>=11)
    {
        PS2_Mouse_CheckScancode(scancode);
        bit_pos=0;
        scancode=0;
    }
}


Код
void PS2_Mouse_CheckScancode(uint8_t scan){
    static uint8_t count_byte=0;
    if(PS2_MOUSE.status==MOUSE_AKTIV)
    {
        PS2_MOUSE_VAR.buff[count_byte]=scan;
        count_byte++;
        if(count_byte>=3)
        {
            count_byte=0;
            PS2_MOUSE.status=MOUSE_NEW_DATA;
        }
    
    }
}



Если брейкпойнт ставлю на строчку PS2_Mouse_CheckScancode(scancode); те после прияния первых 11 бит (это статусный байт он содержит инфу о нажатии о направлении движения) то при дерганье мыши получаю правильный код scancode=0х08 или scancode=0х0А scancode=0х09 . Т е когда делается пауза после принятия первого байта он оказывается верным. Если же без брейкпоинта то принимаю совершенно непонятные цифры. Такое ощущение как если сбивается счетчик bit_pos.
Пробовал объявлять переменные count_byte bit_pos scancode как volatile. Но нет измениния.

Получается если я ставлю брейк после принятия первого байта в сэмпле или даже всех 3 байт они правильные. (по крайней мере первый статусный там перемещение по х и у нужно в динамике смотреть). А как только начинается сплошной поток сэмплов то приходит можно сказать мусор.

Может быть при паузе флаги успевают сбрасываться (в NVIC и EXTI->PR) а при потоке нет и получаю повторные вхождения? Но с
другой стороны скорость мыши не большая. Частота самих импульсов около 12 кГц а частота следования самих сэмплов вообще настраивал 20 сэмплов в секунду.
Подскажите пожалуйста в каком направлении смотреть. Сами функции честно списал у другого автора. Вроде код рабочий да и не такие уж они сложные вроде все прозрачно. Тем более что при остановке считаются биты правильно.

Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 01:31
Рейтинг@Mail.ru


Страница сгенерированна за 0.01374 секунд с 7
ELECTRONIX ©2004-2016