Перейти к содержанию
    

USB Virtual COM mega32u4

Работаю с виртуальным COM портом (пример с сайта Atmel, называется AVR272). вырезал все что связанно с примером из файла cdc_task.c

 

Принимаю по прерыванию символ из терминала на компьютере и отвечаю содержимым массива data_tx в случае если пришел символ "q".

написал такой код:

 

 
     Usb_select_endpoint(RX_EP);        //выбираем OUT точку
     if (Is_usb_receive_out())          //  если прерывание по приему данных; UEINTX&(1<<RXOUTI)
     {    
        Usb_ack_control_out();         // подтверждение; UEINTX &= ~(1<<RXOUTI);
        data_rx = Usb_read_byte();  //читаем что пришло
        Usb_ack_fifocon();                 //  освобождение банка точки OUT; UEINTX &= ~(1<<FIFOCON);
        if (data_rx == 'q')                 // если пришел символ "q"
        {
           Usb_select_endpoint(TX_EP);      //выбираем IN точку
           if (Is_usb_in_ready())               //  Если прерывание по готовности передатчика;  UEINTX&(1<<TXINI)
           {
             Usb_send_control_in();                                 // подтверждение обработки прерывания; UEINTX &= ~(1<<TXINI);  
             usb_send_packet(TX_EP,(U8*)&data_tx, 7);      // отправляем   data_tx
             Usb_ack_fifocon();                                       // сбрасываем бит  FIFOCON для отправки; UEINTX &= ~(1<<FIFOCON);
           }
            
        }            
     }

 

 

 

и вставил его в обработчик Прерываний конечных точек

 

 

#pragma vector = USB_Endpoint_vect

__interrupt void USB_Endpoint_interrupt()

{

//сюда

}

 

не заработало, теперь вставил его в обработчик прерываний usb

 

#pragma vector = USB_General_vect

__interrupt void usb_general_interrupt()

{

//сюда

}

 

Работает как часы. Почему? как заставить все это работать в USB_Endpoint_vect? согласно даташиту именно этот вектор отвечает за прерывания использованные мной (RXOUTI, TXINI ) ...

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне тоже интересно, т.к. собираюсь купить данный проц ...

 

__interrupt void USB_Endpoint_interrupt() вообще вызывается? Может Вы его где-то запретили или не включили?

Как это у атмела сделано?

 

PS.

Ихний фреймворк я пока не качал.

Изменено пользователем hd44780

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У атмел этот вектор в примере не используется. Прерывания разрешил, поставил биты RXOUTE , TXINE.

При старте один раз заходит в него но все биты прерываний конечных точек в регистре UEINT молчат. RXOUTI и TXINI в регистре UEINTX тоже.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Апноты атмела не очень хорошы. Точнее очень нехороши.

 

Рекомендую пощупать LUFA - там получше почти всё.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...