Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить

Определить состояние USB mikrocPRO for pic

Пн окт 02, 2017 15:11:28

Здравствуйте. Задавал вопрос в общей теме по программировании на С но думаю нужна отдельная тема.
Проблема в следующем: есть устройство на PIC18F2550 подключаемое по USB и определяется как HID Keybord. К этому устройству подключена PS2 клавиатура и программный код реализовывает по сути переходник PS2-USB плюс дополнительный функционал. Возможна работа и без подключения к USB, т.е. автономно принимать команды от PS2 клавиатуры.
Код написан в среде MikroCPRO for PIC с использованием стандартной библиотеки USB HID. Проблема заключается в том, что когда вытягиваешь USB разъем с порта то прекращается выполнение основной программы. И стандартная библиотека не имеет функции получения состояния модуля USB, чтобы при дисконекте перенаправить ветку на работу без USB.
Находил на каком то иностранном форуме точно такую же проблему решили с помощью прерывания по USBIF но не выложили как это было достигнуто. Перелопатил регистры USB модуля и ничего не пришло в голову. PICами ранее не занимался и по этому прошу помощи у опытных разработчиков. Заранее спасибо за любую информацию.
Спойлер
Код:
#include "main.h"
#include "kb.h"

unsigned char readbuff[64] absolute 0x500;
unsigned char writebuff[64] absolute 0x540;
unsigned char modifier=0b00000000;
unsigned char reserved=0;
unsigned char keycode[6];
unsigned char progPass[17] = {0};

void interrupt(){
     USB_Interrupt_Proc();        // USB servicing is done inside the interrupt
     PS2_interrupt();             //Ïðåðûâàíèå ïî INT0 ïðè ïîñòóïëåíèè äàííûõ ñ PS2
}
void interrupt_low(){
     PS2_Timeout_Interrupt();     //Ïðåðûâàíèå ïî timer0 ÷åðåç 1ìñ â ñëó÷àå îøèáî÷íûõ äàííûõ ïî PS2
}

void Led_Indicate(unsigned char blink){
  unsigned char i;
  for(i=0; i<=blink; i++){
     LED_PIN = ~LED_PIN;
     delay_ms(100);
  }
  LED_PIN = 0;
}

unsigned char ArrCmp(unsigned char * arr1, unsigned char * arr2, unsigned char pos, unsigned char ln){
   unsigned char i;
   for (i=0; i<ln; i++){
      if(arr1[i+pos] != arr2[i]) return 0;
   }
   return 1;
}

void main(){
unsigned char i;
        INTCON = 0;
        //Initialize ports
        ADCON1 = 0x0F;  // Configure all PORT pins as digital
        //----------
        TRISA= 0b00010000;
        TRISB= 0b00000011;
        TRISC= 0b10111000;
       
        //Initialize periferal
        init_kb();
        HID_Enable(readbuff,writebuff);
        UART1_Init(9600);                      // Initialize hardware UART1 and establish communication at 9600 bps
        delay_ms(100);
        INTCON2.RBPU = 0;                     //Âêëó÷èòü ïîäòÿæêó
        //OK indicator
        Led_Indicate(2);
        PWR12 = 1;                           
        INTCON |= (1<<GIE)|(1<<PEIE);
        //Main cycle
        while(1) {


       if(button(&PORTC, RC7, 200, 0)){
           LED_PIN = 1;
           PWR5 = 1;                         
           VIDEO_PIN = 1;                   
           delay_ms(300);
           LED_PIN = 0;
        }

        if(keycode[0] == 0x45){
           uart_write(30);
        }
        if(ArrCmp(&progPass, &progStr, 0, 16)){
           switch(progPass[16]){
              case 0x1E: UART1_Write(201); break;
              case 0x1F: UART1_Write(202); break;
              case 0x20: UART1_Write(203); break;
              case 0x21: UART1_Write(204); break;
              default: break;
           }
           progPass[0] = 0;
        }else if(ArrCmp(&progPass, &delStr, 8, 8)){
           switch(progPass[16]){
              case 0x1E: UART1_Write(205); break;
              case 0x1F: UART1_Write(206); break;
              case 0x20: UART1_Write(207); break;
              case 0x21: UART1_Write(208); break;
              case 0x22: UART1_Write(209); break;
              default: break;
           }
           progPass[8] = 0;
        }
        //////////////////////////////////////////////////////////////
//----------
                //USB
               writebuff[0]=modifier;
               writebuff[1]=reserved;
               writebuff[2]=keycode[0];
               writebuff[3]=keycode[1];
               writebuff[4]=keycode[2];
               writebuff[5]=keycode[3];
               writebuff[6]=keycode[4];
               writebuff[7]=keycode[5];
               while(!HID_Write(writebuff,8));
               delay_ms(30);
        }
HID_Disable();
}

Re: Определить состояние USB mikrocPRO for pic

Ср окт 04, 2017 16:25:14

Видимо подобным вопросом никто не задавался. :cry:
Может кто то посоветует хорошую библиотеку USB HID на с под pic18f2550, буду благодарен.

Re: Определить состояние USB mikrocPRO for pic

Ср окт 04, 2017 19:32:38

MPLab не подойдет?
Линк.

Re: Определить состояние USB mikrocPRO for pic

Чт окт 05, 2017 09:46:14

MPLab не подойдет?

У mikroc свой компилятор но я пробую перейти на MPLABX, изучаю его. Пытаюсь скомпилировать проект с usb, сыпет кучу ошибок. Спасибо за линк, буду разбираться и переносить проект на MPLABX.

Re: Определить состояние USB mikrocPRO for pic

Чт окт 05, 2017 10:23:37

Виснет, скорее всего, на этой строке :
Код:
while(!HID_Write(writebuff,8));


Сделайте выход из цикла по тайм-ауту (можно примитивному, без таймера).

Re: Определить состояние USB mikrocPRO for pic

Чт окт 05, 2017 21:08:12

Я полностью убрал цикл, оставил только HID_Write(writebuff,8); Все ровно зависает. У меня сложилось такое мнение, что если программа входит в функцию передачи и если usb не подключен она где то в библиотеке зацикливается и ждет подключения usb. Ели бы были исходные коды данной библиотеки, а то сама либа компилирована и доступа к ней нет. Я на libstok нашел библиотеку для microc там больше функционала, но почему то не во всех ПК работает. Пытаюсь разобраться, может я где то накосячил.

Кстати с MPLAM Х ничего не получилось ввиду использования бесплатной версии. Мое устройство использует еще загрузчик по USB, а для сборки микрочиповсего бутлодера мне выдает ошибку, что нужен компилятор pro версии. В общем дальше пытаюсь решить задачу на microC.

Добавлено after 2 hours 32 minutes 55 seconds:
Перевел проект на библиотеку вот от сюда https://libstock.mikroe.com/projects/vi ... ce-library
Все вроде бы работает стабильно но не во всех USB портах, т.е. вставляю в порт ноутбука поддерживающий зарядку по USB и устройство определяется, работает нормально. Вынимаю вставляю в другой порт (обычный) и пишет неизвестное USB-устройство. Хотя перепрошиваю на код со стандартной библиотекой и USB работает во всех портах.
У меня наверное не хватает знаний, чтобы понять почему так происходит. Может из-за того что у меня не подключен +5в от USB хоста к моему устройству? Может где то нужно указать, что устройство работает от внешнего источника питания?

Добавлено after 6 hours 17 minutes 24 seconds:
Обнаружил нюанс с USB портами своего ноутбука. Приведенная выше библиотека скачанная с libstok не работает на USB 3.0. На 2.0 работает. Хотя интерфейсы обратно совместимы. Буду дальше разбираться почему.

Re: Определить состояние USB mikrocPRO for pic

Ср окт 11, 2017 17:09:00

Еще раз здравствуйте. Не разобрался почему не работает на USB 3.0, ну да и не важно. Мне USB2.0 хватит, не коммерческое устройство.
Возникла следующая проблема. Можно как то определить, что устройство находится в режиме BIOS? т.е. Так называемом boot режиме, до загрузки Операционной системы? Идея в следующем. Включается ПК и BIOS просит ввести пароль, нажатием кнопки пароль вводится и продолжается загрузка системы. Когда система загружена то контроллер видит, что он работает в режиме системы и пароль не вводит. Как то можно инициализировать режим системы и boot? Спасибо.

Re: Определить состояние USB mikrocPRO for pic

Ср окт 11, 2017 20:29:35

Может по сигналу CS на микросхеме БИОСа? Предполагаю, что после отработки старта и запуска ОС сигнал CS деактивируется.

Re: Определить состояние USB mikrocPRO for pic

Чт окт 12, 2017 12:09:45

Расшифруете что за сигнал CS? Немного не понял как по USB узнать наличие этого сигнала. Можете по подробнее пожалуйста.

Re: Определить состояние USB mikrocPRO for pic

Чт окт 12, 2017 15:15:53

Я подумал, что вы прямо к материнке хотите подключиться.
Через USB вряд ли можно определить этап загрузки ПК.

CS = Chip Select. Вывод на некоторых чипах для разрешения работы.
Ответить