Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 15.03.2012, 15:42   #1
AIR172
Junior Member
 
Регистрация: 15.03.2012
Возраст: 47
Сообщений: 7
Вес репутации: 100/0
AIR172 will become famous soon enoughAIR172 will become famous soon enough
По умолчанию Проблемы работы с USB

Всем добрый день!
Может кто-то поможет в решении следующей проблемы. Суть ее в следующем.
Есть измеритель температуры на PIC18F4550 и DS18S20. Показания температуры выводятся на дисплей WH1602 и через USB в Windows-программу на компьютер. Все работает нормально. Захотел задействовать в программе Timer1. Написал функцию обработки прерывания (на С), в которой сбрасываю флаг TMR1IF, назначил прерыванию в регистре IPR1 низкий приоритет. В регистре PIE1 разрешил прерывание по переполнению TMR1. В главной функции main() разрешил прерывания низкого приоритета от периферии INTCONbits.GIEL = 1; Компиляция проходит нормально. А после прошивки устройства и подключения его к USB-порту устройство не работает (на дисплей ничего не выводится) и на компьютере появляется сообщение "Устройство USB не опознано".
Вот такая проблема. Хотелось бы ее решить.
AIR172 вне форума   Ответить с цитированием
Старый 15.03.2012, 16:22   #2
xrenovina
Junior Member
 
Регистрация: 14.03.2012
Сообщений: 12
Вес репутации: 100/30
xrenovina will become famous soon enoughxrenovina will become famous soon enough
По умолчанию Re: Проблемы работы с USB

Тобиш у вас виглядит это дело примерно ТАК?

#pragma code INTERRUPT_LOW_POINT = 0x00000018
void vector_INTERRUPT_LOW(void){
LInt();
_asm retfie 1 _endasm
}

void LInt(void){
if ( PIR1bits.TMR1IF ){
//---
...свой код
//---
PIR1bits.TMR1IF = 0; // Очищаем флаг
}
}

// Инициализация
void main(void){
RCON = 0b10000000; // Разрешаем прерывания
NTCON = 0b10000000; // high и low разрешены
PIE1 = 0b00000001; // TMR1 по переполнению
IPR1 = 0b00000000; // Low для TMR1

//---
...чтото ещё
//---
}


а usb тоже по прерыванию работает?
xrenovina вне форума   Ответить с цитированием
Старый 15.03.2012, 17:35   #3
AIR172
Junior Member
 
Регистрация: 15.03.2012
Возраст: 47
Сообщений: 7
Вес репутации: 100/0
AIR172 will become famous soon enoughAIR172 will become famous soon enough
По умолчанию Re: Проблемы работы с USB

Да, примерно так.
А вот как работает USB - даже не знаю. Взял готовую заготовку из MCHPFSUSB/fw/Cdc, внес изменения в файл "user.c" как описано в http://www.gamma.spb.ru/articles.php?i=29, добавил туда же свой код (работа с дисплеем WH1602 и термодатчиком DS1820) + неделя безуспешных попыток оживить схему и в конце-концов заработало.
В явном виде обработчик прерывания для работы с USB я не писал и бит глобального разрешения прерываний высокого приоритета не устанавливал.
AIR172 вне форума   Ответить с цитированием
Старый 15.03.2012, 20:08   #4
xrenovina
Junior Member
 
Регистрация: 14.03.2012
Сообщений: 12
Вес репутации: 100/30
xrenovina will become famous soon enoughxrenovina will become famous soon enough
По умолчанию Re: Проблемы работы с USB

Ну вобщем насколко помню CDC и всё ихнее борахло там изначально прерываниями непользуется. Нащёт предидушего моево меседжа ... да малость накасячил с битом L прерываний .
Вобщем вот смотри полностью рабочяя хрень ток потестил , стоит на максимальное время ( впринцыпе особо неотличяется от предидущего варианта) :

void main(void)
{
// Инициализация таймер1
RCON = 0b10000000; // Разрешаем приоритет
INTCON = 0b11000000; // high и low разрешены
PIE1 = 0b00000001; // Разрешаем TMR1 Intrrupt по переполнению
IPR1 = 0b00000000; // (0)Low для TMR1

T1CON = 0b10110001; // (7)16бит щётчик, (5-4)1/8делитель, (0)Запускаем таймер
TMR1H = 0x00;
TMR1L = 0x00;


//----
... бла бла
//----
}

Код выполняющийся по прерыванию Low

#pragma code INTERRUPT_LOW_POINT = 0x00000018
void vector_INTERRUPT_LOW(void)
{
LInt();
_asm retfie 1 _endasm // Юзаем обязательно
}

void LInt(void)
{
if( PIR1bits.TMR1IF )
{
Timer1();
PIR1bits.TMR1IF = 0; // Затираем флаг прерывания
}
}

Ну и сама хрень творящая всё что нам угодно

void Timer1(void)
{
//TMR1H = 0x00;
TMR1L = 0x00;
}

Вот сопственно и всё должно работать полюбому!!! Также ето дело неплохо работает с USB ибо места небыло где написать потестить более)
xrenovina вне форума   Ответить с цитированием
Старый 16.03.2012, 18:36   #5
AIR172
Junior Member
 
Регистрация: 15.03.2012
Возраст: 47
Сообщений: 7
Вес репутации: 100/0
AIR172 will become famous soon enoughAIR172 will become famous soon enough
По умолчанию Re: Проблемы работы с USB

К сожалению, не работает.
Но сейчас хоть стала проходить инициализация дисплея и на нем появляется надпись "ТЕМПЕРАТУРА". Сама температура не выводится и на компьютере появляется сообщение "Устройство USB не опознано".
А стоит только закомментировать INTCON = 0b11000000, откомпилировать программу и заново прошить устройство, как все начинает работать нормально, но соответственно без Timer1.
AIR172 вне форума   Ответить с цитированием
Старый 16.03.2012, 18:53   #6
xrenovina
Junior Member
 
Регистрация: 14.03.2012
Сообщений: 12
Вес репутации: 100/30
xrenovina will become famous soon enoughxrenovina will become famous soon enough
По умолчанию Re: Проблемы работы с USB

Надо тебе USB на прирывание пересадить полюбак , впринцыпе дело нехитрое но! нехитрое оно для меня ... а в ихней клинописи там хрен что поймёш 500 файлов а толку чуть.
xrenovina вне форума   Ответить с цитированием
Старый 16.03.2012, 19:15   #7
Vlad&mir
Senior Member
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 1,720
Вес репутации: 4407/101
Vlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond repute
По умолчанию Re: Проблемы работы с USB

Видя интерес общественности к классу USB-CDC, выкладываю в очередной раз работающие примеры на mcc18 c использованием прерываний для PIC18F14K50 и PIC18F4550.
Вложения
Тип файла: rar USB_CDC.rar (184.7 Кб, 326 просмотров)
Vlad&mir вне форума   Ответить с цитированием
Старый 16.03.2012, 20:14   #8
AIR172
Junior Member
 
Регистрация: 15.03.2012
Возраст: 47
Сообщений: 7
Вес репутации: 100/0
AIR172 will become famous soon enoughAIR172 will become famous soon enough
По умолчанию Re: Проблемы работы с USB

Спасибо, Vlad&mir. Буду разбираться, пробовать. Может поможет в решении моей проблемы.
AIR172 вне форума   Ответить с цитированием
Старый 10.04.2012, 18:41   #9
AIR172
Junior Member
 
Регистрация: 15.03.2012
Возраст: 47
Сообщений: 7
Вес репутации: 100/0
AIR172 will become famous soon enoughAIR172 will become famous soon enough
По умолчанию Re: Проблемы работы с USB

Всем добрый день (или вечер - у кого что).
Хочу поделиться впечатлениями от использования USB_CDC от Vlad&mir'a. Vlad&mir - Вам спасибо за помощь.
Результат меня конечно удивил, причем приятно. Практически сразу устройство заработало. При подключении к компьютеру без проблем определилось как виртуальный СОМ-порт. И Timer1 работает по прерываниям (контролирую по периодически включающемуся светодиоду). Данные передаются в Windows-программу корректно - пока проблем не выявил.
При первом знакомстве с архивом удивило небольшое количество файлов по сравнению с MCHPFSUSB от Microchip. Такое впечатление, что разработчики из Microchip сознательно пытались запутать при написании всего этого огромного количества функций и разных подключаемых модулей.
А теперь о проблеме которую все-таки не смог пока решить.
Данные от устройства передаются в компьютер без проблем. А вот передача от компьютера в устройство - здесь есть проблемы.
Мне нужно передать из Windows -программы в устройство 7 байт. Это извлеченное из ОС и декодированное системное время и дата для дальнейшей его записи в часы реального времени на DS1307. Если проще - то с компьютера можно будет установить дату и время в моем устройстве. Так вот - получается принять от компьютера только один байт - тот который передается последним. Может принимаются все 7 байт, но я их где-то теряю? Пока не разобрался.
Vlad&mir - может что-то подскажете, посоветуете.
AIR172 вне форума   Ответить с цитированием
Старый 10.04.2012, 19:00   #10
Vlad&mir
Senior Member
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 1,720
Вес репутации: 4407/101
Vlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond repute
По умолчанию Re: Проблемы работы с USB

Цитата:
Сообщение от AIR172 Посмотреть сообщение
Vlad&mir - может что-то подскажете, посоветуете.
Этот USB-CDC модуль эксплуатируется довольно давно, особых проблем не выявлено. Покажите Ваш проблемный код, если можно. Только удалите все не относящееся к проблеме. Оставьте только прием - передачу.
Протестируйте мой пример возвращающий принятые байты. Он точно работает.
Vlad&mir вне форума   Ответить с цитированием
Старый 11.04.2012, 19:49   #11
AIR172
Junior Member
 
Регистрация: 15.03.2012
Возраст: 47
Сообщений: 7
Вес репутации: 100/0
AIR172 will become famous soon enoughAIR172 will become famous soon enough
По умолчанию Re: Проблемы работы с USB

Цитата:
Сообщение от Vlad&mir Посмотреть сообщение
Покажите Ваш проблемный код, если можно. Только удалите все не относящееся к проблеме. Оставьте только прием - передачу.
Для передачи и приема создал отдельные переменные: USB_TX_BUFF[64] - буфер для передачи; USB_RX_BUFF[64] - буфер для приема;
ByteCount_tx - счетчик передаваемых байт; ByteCount_rx - счетчик принятых байт;

//прием данных
while(USB_CDC_TX_BUSY());
ByteCount_rx = READ_FROM_USB_CDC( &USB_RX_BUFF[0]);
if(ByteCount_rx)
{
write_v = USB_RX_BUFF[0];//в эту переменную сохраняется
//признак того,что переданы
//данные для записи в DS1307
write_y = USB_RX_BUFF[1];//сюда сохраняется год
write_mon = USB_RX_BUFF[2];//сюда месяц
write_d = USB_RX_BUFF[3]; //сюда число месяца
write_s = USB_RX_BUFF[4]; //сюда секунды
write_min = USB_RX_BUFF[5];//сюда минуты
write_h = USB_RX_BUFF[6]; //сюда часы
}
//WriteDS1307();//функция для записи из промежуточных
//переменных write_y...write_h в регистры
//DS1307. Пока ее не использую, поэтому закомментирована

/*нижеследующая часть кода предназначена только для того,
чтобы проконтролировать, что я все-таки принимаю. В готовом устройстве этой части кода не будет. Во 2-ю строку дисплея должны выводится принимаемые данные (один байт). Что удалось выяснить: в Windows - программе сделал интервал таймера по которому передаются данные, равным 1-й сек. Так вот на
дисплей последовательно, с интервалом в одну сек. выводятся все передаваемые 7 байт и последний там фиксируется. Значит
реально я получаю все что мне нужно, только не получается эти байты сохранить в раздельных переменных.*/
write_y = USB_RX_BUFF[0];
write_y >>= 4;
write_y &= 0x0F;
write_y |= 0x30;
AddrLCD(0xC0); //выбираем 1-е знакоместо 2-й строки WH1602
WriteLCD(write_y);
write_y = USB_RX_BUFF[0];
write_y &= 0x0F;
write_y |= 0x30;
AddrLCD(0xC1); //выбираем 2-е знакоместо 2-й строки WH1602
WriteLCD(write_y);

//передача данных

USB_TX_BUFF[0] = temp_msb; //сохраняем в буфер старший байт,
//полученный из DS1820
USB_TX_BUFF[1] = temp_lsb;//младший байт
ByteCount_tx = 2;//передаем 2 байта
WRITE_TO_USB_CDC(& USB_TX_BUFF[0], ByteCount_tx);


Вот так я сделал прием-передачу. Буду благодарен Вам, Vlad&mir если что-то посоветуете.
AIR172 вне форума   Ответить с цитированием
Старый 12.04.2012, 10:27   #12
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Russia, Orel
Возраст: 40
Сообщений: 4,731
Вес репутации: 4545/132
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: Проблемы работы с USB

Цитата:
Сообщение от Vlad&mir Посмотреть сообщение
Видя интерес общественности к классу USB-CDC, выкладываю в очередной раз работающие примеры на mcc18 c использованием прерываний для PIC18F14K50 и PIC18F4550.
Код:
#pragma interrupt high_isr

void high_isr (void)
{ 
    USB_CDC_INTERRUPT();
}
// ****************************************
void USB_CDC_INTERRUPT(void)
{
    if(PIE2bits.USBIE && PIR2bits.USBIF)
     {
        USBDeviceTasks();

        USB_CDC_RC_COUNT();

        PIR2bits.USBIF = 0;
     };
}
Интересно, кто автор этого рабочего примера?

В прерывании вызывается функция, которая вызывает две другие функции, одна из которых USBDeviceTasks() размером в 150 строк кода на Си, да ещё и вызывает другие функции.

Такое прерывание будет тормозить всю систему.
__________________
Прогресс неизбежен.
Pridnya вне форума   Ответить с цитированием
Старый 12.04.2012, 11:22   #13
pfgx
Senior Member
 
Регистрация: 14.11.2007
Сообщений: 1,106
Вес репутации: 822/64
pfgx is a splendid one to beholdpfgx is a splendid one to beholdpfgx is a splendid one to beholdpfgx is a splendid one to beholdpfgx is a splendid one to beholdpfgx is a splendid one to beholdpfgx is a splendid one to behold
По умолчанию Re: Проблемы работы с USB

Строк там 150, но выполнятся за один раз далеко не все, а только соответствующие состоянию. В некоторых исходниках стоит case на 6-7 вариантов.
pfgx вне форума   Ответить с цитированием
Старый 12.04.2012, 13:35   #14
Vlad&mir
Senior Member
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 1,720
Вес репутации: 4407/101
Vlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond repute
По умолчанию Re: Проблемы работы с USB

Цитата:
Сообщение от AIR172 Посмотреть сообщение
Вот так я сделал прием-передачу. Буду благодарен Вам, Vlad&mir если что-то посоветуете.
Я не совсем понял Ваш замысел, но прием-передача, как я понял, работает. Вот вам заготовка:
Код:
//
// ЭТОТ ПРИМЕР ВОЗВРАЩАЕТ НАЗАД USB ПРИНЯТЫЕ БАЙТЫ !!!
//

#include <p18f4550.h>

#include    "ConfigBits4550.h"

#include    "USB_CDC.h"

// ---------------------------------------------------------

#pragma udata

unsigned char ByteCount_rx;

unsigned char USB_TX_BUFF[64];  // буфер для передачи; 
unsigned char USB_RX_BUFF[64];  // буфер для приема;

unsigned char write_v;          // признак
unsigned char write_y;          // сюда сохраняется год
unsigned char write_mon;        // сюда месяц
unsigned char write_d;          // сюда число месяца
unsigned char write_s ;         // сюда секунды
unsigned char write_min;        // сюда минуты
unsigned char write_h;          // сюда часы

// =========================================================
// ================ ВЕКТОРА ПРЕРЫВАНИЙ =====================
// =========================================================

void low_isr(void);
void high_isr(void);
            
#pragma code high_vector=0x08
void interrupt_at_high_vector(void)
{
    _asm GOTO high_isr  _endasm
}

#pragma code low_vector=0x18
void interrupt_at_low_vector(void)
{
    _asm GOTO low_isr   _endasm
}

#pragma code /* return to the default code section */

// ----- ОБРАБОТЧИК ПРЕРЫВАНИЙ ВЫСОКОГО ПРИОРИТЕТА ----------

#pragma interrupt high_isr

void high_isr (void)
{ 
    USB_CDC_INTERRUPT();
}

// ----- ОБРАБОТЧИК ПРЕРЫВАНИЙ НИЗКОГО ПРИОРИТЕТА -----------

#pragma interruptlow low_isr

void low_isr (void)
{

}

// ==========================================================

void main(void)
{
    // ------------------------------------------------------

    INTCON  = 0x00;             INTCON3 = 0x00;
    PIE1    = 0x00;             PIE2    = 0x00;
    CCP1CON = 0x00;             CCP2CON = 0x00;             // Выкл. модули сравнения.
    SSPCON1 = 0x00;             RCSTA   = 0x00;             // Выкл. посдедовательные порты.
    ADCON0  = 0x00;             ADCON1  = 0x0F;             // Выкл. АЦП, Default all pins to digital
    TRISA   = 0xFF;             TRISC   = 0xFF;
    TRISB   = 0xFF;             TRISD   = 0xFF;
    UCON    = 0x00;
                                RCONbits.IPEN     = 1;      // Приоритетная система прерываний включена
                                INTCON2bits.RBPU  = 1;      // ВЫКЛ. ПОДТЯГ. РЕЗ. PORTB
    T1CONbits.T1OSCEN = 0x00;   T1CONbits.TMR1CS  = 0;

    // ------------------------------------------------------
    INTCONbits.GIEH   = 1;      INTCONbits.GIEL  =  1;      // Поехали !!!
    // ------------------------------------------------------

    USB_CDC_OPEN();

    // ----------------------------------------------------------
CONTINUE:   ClrWdt();
    // ----------------------------------------------------------

    //прием данных 

    ByteCount_rx = READ_FROM_USB_CDC(& USB_RX_BUFF[0]); // пришло что-нибудь ???

    if(ByteCount_rx)    // если пришло,
     {
        write_v   = USB_RX_BUFF[0]; //в эту переменную сохраняется
                                    //признак того,что переданы
                                    //данные для записи в DS1307

        write_y   = USB_RX_BUFF[1]; //сюда сохраняется год
        write_mon = USB_RX_BUFF[2]; //сюда месяц
        write_d   = USB_RX_BUFF[3]; //сюда число месяца
        write_s   = USB_RX_BUFF[4]; //сюда секунды
        write_min = USB_RX_BUFF[5]; //сюда минуты
        write_h   = USB_RX_BUFF[6]; //сюда часы

        // =========================================
        // тут мы что-то делаем с принятыми данными
        // =========================================

        // теперь для проверки вернем назад принятое,
        // перевернем, что бы виднее было!

        USB_TX_BUFF[6] = write_v;
        USB_TX_BUFF[5] = write_y;
        USB_TX_BUFF[4] = write_mon;
        USB_TX_BUFF[3] = write_d;
        USB_TX_BUFF[2] = write_s;
        USB_TX_BUFF[1] = write_min;
        USB_TX_BUFF[0] = write_h;
 
        WRITE_TO_USB_CDC(& USB_TX_BUFF[0], 7);  // вернуть назад,
                                                // только, если пришло!
     };

    // =========================================
    // А если от ничего не пришло, то и не делаем ничего.
    // =========================================


goto CONTINUE;  // и так бесконечно!!!!
}
Заполняйте "каркас" (он ТОЧНО рабочий!) вашим кодом.

Вот этот проект и, заодно, тестовая программа на Delphi только (важно!) для прилагаемого примера.
Вложения
Тип файла: rar USB_4550.rar (267.9 Кб, 31 просмотров)
Vlad&mir вне форума   Ответить с цитированием
Старый 12.04.2012, 13:54   #15
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Russia, Orel
Возраст: 40
Сообщений: 4,731
Вес репутации: 4545/132
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: Проблемы работы с USB

Цитата:
Сообщение от Vlad&mir Посмотреть сообщение
Я не совсем понял Ваш замысел, но прием-передача, как я понял, работает. Вот вам заготовка:
Vlad&mir, Вы проигнорировали мой вопрос.

По моему скромному мнению Ваш пример должен попасть в раздел "Классика: Как не следует писать код в прерываниях".
__________________
Прогресс неизбежен.
Pridnya вне форума   Ответить с цитированием
Старый 12.04.2012, 14:14   #16
Machine slave
Senior Member
 
Аватар для Machine slave
 
Регистрация: 18.01.2008
Возраст: 37
Сообщений: 4,264
Вес репутации: 2731/113
Machine slave has a reputation beyond reputeMachine slave has a reputation beyond reputeMachine slave has a reputation beyond reputeMachine slave has a reputation beyond reputeMachine slave has a reputation beyond reputeMachine slave has a reputation beyond reputeMachine slave has a reputation beyond reputeMachine slave has a reputation beyond reputeMachine slave has a reputation beyond reputeMachine slave has a reputation beyond reputeMachine slave has a reputation beyond repute
По умолчанию Re: Проблемы работы с USB

Цитата:
Сообщение от Pridnya Посмотреть сообщение
По моему скромному мнению Ваш пример должен попасть в раздел "Классика: Как не следует писать код в прерываниях".
Обоснуйте.
Machine slave вне форума   Ответить с цитированием
Старый 12.04.2012, 14:39   #17
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Russia, Orel
Возраст: 40
Сообщений: 4,731
Вес репутации: 4545/132
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: Проблемы работы с USB

Надеюсь Вы видели код.
Такой длинный код с многоуровневым вызовом в прерываниях не следует использовать. Прерывание будет выполняться долго и кушать стек.
К тому же порядка 20-ти if-ов подряд и более 10-ти return-ов в одной функции говорят о плохой структуре кода и последующей сложности в сопровождении.
__________________
Прогресс неизбежен.
Pridnya вне форума   Ответить с цитированием
Старый 12.04.2012, 15:07   #18
AleksBak
Senior Member
 
Аватар для AleksBak
 
Регистрация: 27.02.2007
Адрес: г. Баку
Сообщений: 3,124
Вес репутации: 2885/106
AleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond repute
По умолчанию Re: Проблемы работы с USB

Цитата:
Сообщение от Pridnya Посмотреть сообщение
Надеюсь Вы видели код.
Такой длинный код с многоуровневым вызовом в прерываниях не следует использовать. Прерывание будет выполняться долго и кушать стек.
К тому же порядка 20-ти if-ов подряд и более 10-ти return-ов в одной функции говорят о плохой структуре кода и последующей сложности в сопровождении.
20 if-ов подряд это уже перебор с точки зрения программирования и самого вида кода, но вот у меня тоже несколько if-ов в одном из прерываний и оно само длинное (его код), но выполняется только конкретная часть его каждый раз. По-моему так нормально. Лучше в прерывании по-моему сразу определиться, что сделать (но конечно как можно меньше делать). Я когда такую вещь сделал, то прикинул и проверил, что достаточно быстро прерывание выполняется. Или все-таки так не хорошо и всю обработку только в майне делать?
AleksBak вне форума   Ответить с цитированием
Старый 12.04.2012, 15:33   #19
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Russia, Orel
Возраст: 40
Сообщений: 4,731
Вес репутации: 4545/132
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: Проблемы работы с USB

В прерывании лучше принимать данные, а копировать и обрабатывать вне его.
Еще плохо, что в той неудачной функции, вызываемой из прерывания много while-ов.
Видимо, что кто-то при плохом знании Си и интерфейса USB переписал программу с ассемблера.
__________________
Прогресс неизбежен.
Pridnya вне форума   Ответить с цитированием
Старый 12.04.2012, 16:00   #20
FlashBack
Senior Member
 
Аватар для FlashBack
 
Регистрация: 16.02.2010
Адрес: Грузия, Тбилиси
Возраст: 35
Сообщений: 2,232
Вес репутации: 2337/81
FlashBack has a reputation beyond reputeFlashBack has a reputation beyond reputeFlashBack has a reputation beyond reputeFlashBack has a reputation beyond reputeFlashBack has a reputation beyond reputeFlashBack has a reputation beyond reputeFlashBack has a reputation beyond reputeFlashBack has a reputation beyond reputeFlashBack has a reputation beyond reputeFlashBack has a reputation beyond reputeFlashBack has a reputation beyond repute
По умолчанию Re: Проблемы работы с USB

Я на сколько помню, по сути кода, это подстриженный стек от микрочипа. Так что эти функции в прерывании - это оттуда. Да и не ком порт чай обрабатываем
FlashBack вне форума   Ответить с цитированием
Старый 12.04.2012, 16:13   #21
Vlad&mir
Senior Member
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 1,720
Вес репутации: 4407/101
Vlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond repute
По умолчанию Re: Проблемы работы с USB

Цитата:
Сообщение от FlashBack Посмотреть сообщение
Я на сколько помню, по сути кода, это подстриженный стек от микрочипа. Так что эти функции в прерывании - это оттуда. Да и не ком порт чай обрабатываем
Вы меня опередили, я только что хотел направить ув. Pridnya с этими претензиями к программистам Microchip-а. А что касается меня, то Pridnya никто не заставляет пользоваться этим модулем. Пусть напишет свой, может и с нами поделится.
P.S.
История вопроса: http://www.microchip.su/showthread.php?t=4652

Последний раз редактировалось Vlad&mir; 12.04.2012 в 16:22.
Vlad&mir вне форума   Ответить с цитированием
Старый 12.04.2012, 16:22   #22
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Russia, Orel
Возраст: 40
Сообщений: 4,731
Вес репутации: 4545/132
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: Проблемы работы с USB

Цитата:
Сообщение от FlashBack Посмотреть сообщение
Я на сколько помню, по сути кода, это подстриженный стек от микрочипа. Так что эти функции в прерывании - это оттуда. Да и не ком порт чай обрабатываем
Ссылка на несуществующий источник не принимается. Ткните носом в Application Note с кодом.
__________________
Прогресс неизбежен.
Pridnya вне форума   Ответить с цитированием
Старый 12.04.2012, 16:29   #23
Vlad&mir
Senior Member
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 1,720
Вес репутации: 4407/101
Vlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond repute
По умолчанию Re: Проблемы работы с USB

Цитата:
Сообщение от Pridnya Посмотреть сообщение
Ссылка на несуществующий источник не принимается. Ткните носом в Application Note с кодом.
Тролль?
Vlad&mir вне форума   Ответить с цитированием
Старый 12.04.2012, 16:32   #24
AleksBak
Senior Member
 
Аватар для AleksBak
 
Регистрация: 27.02.2007
Адрес: г. Баку
Сообщений: 3,124
Вес репутации: 2885/106
AleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond repute
По умолчанию Re: Проблемы работы с USB

Цитата:
Сообщение от Pridnya Посмотреть сообщение
Ссылка на несуществующий источник не принимается. Ткните носом в Application Note с кодом.
Это существующий источник - этот код, как писалось, переделанный микрочиповский пример. Вообще согласен, что обработка в основном коде должна и безусловно, но когда принимаешь данные в прерывании, то порой много буферов разных для приема и флагов нужно установить - вот исходя из этого и получается много if-ов в прерывании (и switch-ей) и оно кажется длинным по коду, но выполняется только определенная часть ведь. Я так уже пришел к такому выводу и так делаю.
Цитата:
Сообщение от Vlad&mir Посмотреть сообщение
Тролль?
А почему?
AleksBak вне форума   Ответить с цитированием
Старый 12.04.2012, 16:38   #25
Vlad&mir
Senior Member
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 1,720
Вес репутации: 4407/101
Vlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond repute
По умолчанию Re: Проблемы работы с USB

Цитата:
Сообщение от AleksBak Посмотреть сообщение
Это существующий источник - этот код, как писалось, переделанный микрочиповский пример. Вообще согласен, что обработка в основном коде должна и безусловно, но когда принимаешь данные в прерывании, то порой много буферов разных для приема и флагов нужно установить - вот исходя из этого и получается много if-ов в прерывании (и switch-ей) и оно кажется длинным по коду, но выполняется только определенная часть ведь. Я так уже пришел к такому выводу и так делаю.
Совершенно верно. Если запросов USB нет все прерывание есть только выполнение return. В самом "длинном" случае обработка прерывания USB занимает около 15 микросекунд (на 32 MHz).

Почему тролль? Так показалось, тон агрессивный, вопросы неграмотные...

Ну вот, например, по поводу while:
Код:
   while(UIRbits.TRNIF)
    {
      UIRbits.TRNIF = 0;
    };
Неужели непонятно, что разработчик рекомендует убедиться, что UIRbits.TRNIF сброшен и повторить, если не сбросился. Errata какая-то.

Последний раз редактировалось Vlad&mir; 12.04.2012 в 16:48.
Vlad&mir вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
примеры кода для работы с USB flashik Вопросы начинающих 5 08.05.2015 12:45
Модификация usb firmware для pic18 Petya Продукция MICROCHIP 25 24.12.2010 16:28
PIC18F2550 + USB, проблемы с Control Transfer ILoveSpeccy Продукция MICROCHIP 18 24.09.2010 18:02
Проблемы с USB Host у PIC24 mdl84 Продукция MICROCHIP 9 05.12.2009 20:31
команды для работы с USB Sergey1 Общетехнические вопросы 1 14.06.2007 09:30


Часовой пояс GMT +3, время: 20:37.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot