HEkeD

Members
  • Публикации

    16
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

О HEkeD

  • Звание
    Новенький

Информация

  • Город
    Пермь

Электроника

  • Стаж в электронике
    Менее года
  • Сфера радиоэлектроники
    микроконтроллеры
  1. Здравствуйте. Имею следующую задачу. На мк pic18f4550 сформировать массив данных с АЦП, отфильтровать его и отправить на мк. Но мне немножко непонятен сам процесс. Ниже привел фрагмент кода. WORD_VAL ReadPOT(void) { WORD_VAL w; w.Val = 0; ADCON0bits.GO = 1; // начинаем АЦП while(ADCON0bits.GO); // ждем, пока не закончилось w.v[0] = ADRESL; // записываем в переменные w.v[1] = ADRESH; //---Здесь начинается формирование массива данных для фильтрования---// using namespace std; double massiv1[]; for (i = 1; i <= 1000; i++);// задаем начальное значение 1 и конечное значение 1000 с шагом 1 { massiv1[i]= (w.v[1] << 8) + w.v[0]; } //---Здесь заканчивается формирование массива данных для фильтрования---// //---Фильтр---// int i,j,z,k1,k2,hw,n,window; double tmp,input,output; window = 5; if(fmod(window,2)==0) window++; hw=(window-1)/2; output[0]=massiv1[0]; for (i=1;i<n;i++){ tmp=0; if(i<hw){ k1=0; k2=2*i; z=k2+1; } else if((i+hw)>(n-1)){ k1=i-n+i+1; k2=n-1; z=k2-k1+1; } else{ k1=i-hw; k2=i+hw; z=window; } for (j=k1;j<=k2;j++){ tmp=tmp+massiv1[j]; } output[i]=tmp/z; } //---end фильтр---// w = output[]; return w; }//end ReadPOT После фильтра уже нет старшего и младшего байта,непонятно,как сделать обратное преобразование,поскольку по USB передача идет именно так. Нужно ли вообще это преобразование? Как передаются данные на мк, можно ли отправить весь отфильтрованный массив? void ProcessIO(void) { // если еще не настроено или в режиме сна, то не делать ничего if((USBDeviceState < CONFIGURED_STATE)||(USBSuspendControl==1)) return; //Проверить, если мы получили исходящий пакет if(!HIDRxHandleBusy(USBOutHandle)) { //Мы только что получили исходящий пакет. Проверим первый байт, чтобы понять что за команда switch(ReceivedDataBuffer[0]) { case 0x80: //вкл/выкл светодиод mLED_1_Toggle(); break; case 0x81: //проверить статус переключателя sw // проверяем, свободен ли буфер записи, перед тем, как записать туда if(!HIDTxHandleBusy(USBInHandle)) { ToSendDataBuffer[0] = 0x81; //создаем сообщение с информацией о переключателе sw if(sw3 == 1) { ToSendDataBuffer[1] = 0x01; } else { ToSendDataBuffer[1] = 0x00; } //готовим USB модуль для отправки данных хосту USBInHandle = HIDTxPacket(HID_EP,(BYTE*)&ToSendDataBuffer[0],64); } break; case 0x37: //проверить напряжение на АЦП { WORD_VAL w; // проверяем, свободен ли буфер записи, перед тем, как записать туда if(!HIDTxHandleBusy(USBInHandle)) { w = ReadPOT(); //считываем напряжение. функция определена ниже. ToSendDataBuffer[0] = 0x37; //делаем сообщение - напряжение на АЦП ToSendDataBuffer[1] = w.v[0]; //Передаем младший байт ToSendDataBuffer[2] = w.v[1]; //старший байт //готовим USB модуль для отправки данных хосту USBInHandle = HIDTxPacket(HID_EP,(BYTE*)&ToSendDataBuffer[0],64); } } break; } //готовим выходную конечную точку, чтобы хост смог отправить нам еще пакет ифнормации USBOutHandle = HIDRxPacket(HID_EP, (BYTE*)&ReceivedDataBuffer, 64); } }//end ProcessIO Без фильтра и формирования массива все прекрасно работает. Это код из исходников microchip для hid устройств, смысл таков, я получаю с датчика напряжение, эти напряжения нужно отправить на ПК,чтобы увидеть результат,например, в виде графика,чтобы график был плавным необходимо отфильтровать массив напряжений, а более глубокий смысл таков: эмуляция контроллера для обработки сигнала с датчика давления. Поэтому хотелось бы разобраться с фильтрованием непосредственно на контроллере. main.rar
  2. Обработка Массива

    Здравствуйте. Имею следующую задачу. На мк pic18f4550 сформировать массив данных с АЦП, отфильтровать его и отправить на мк. Но мне немножко непонятен сам процесс. Ниже привел фрагмент кода(также он полностью прикреплен в архиве) WORD_VAL ReadPOT(void) { WORD_VAL w; w.Val = 0; ADCON0bits.GO = 1; // начинаем АЦП while(ADCON0bits.GO); // ждем, пока не закончилось w.v[0] = ADRESL; // записываем в переменные w.v[1] = ADRESH; //---Здесь начинается формирование массива данных для фильтрования---// using namespace std; double massiv1[]; for (i = 1; i <= 1000; i++);// задаем начальное значение 1 и конечное значение 1000 с шагом 1 { massiv1[i]= (w.v[1] << 8) + w.v[0]; } //---Здесь заканчивается формирование массива данных для фильтрования---// //---Фильтр---// int i,j,z,k1,k2,hw,n,window; double tmp,input,output; if(fmod(window,2)==0) window++; hw=(window-1)/2; output[0]=massiv1[0]; for (i=1;i<n;i++){ tmp=0; if(i<hw){ k1=0; k2=2*i; z=k2+1; } else if((i+hw)>(n-1)){ k1=i-n+i+1; k2=n-1; z=k2-k1+1; } else{ k1=i-hw; k2=i+hw; z=window; } for (j=k1;j<=k2;j++){ tmp=tmp+massiv1[j]; } output[i]=tmp/z; } //---end фильтр---// w = output[]; return w; }//end ReadPOT После фильтра уже нет старшего и младшего байта,непонятно,как сделать обратное преобразование,поскольку по USB передача идет именно так. Нужно ли вообще это преобразование? И как передаются данные на мк, можно ли отправить весь отфильтрованный массив? void ProcessIO(void) { // если еще не настроено или в режиме сна, то не делать ничего if((USBDeviceState < CONFIGURED_STATE)||(USBSuspendControl==1)) return; //Проверить, если мы получили исходящий пакет if(!HIDRxHandleBusy(USBOutHandle)) { //Мы только что получили исходящий пакет. Проверим первый байт, чтобы понять что за команда switch(ReceivedDataBuffer[0]) { case 0x80: //вкл/выкл светодиод mLED_1_Toggle(); break; case 0x81: //проверить статус переключателя sw // проверяем, свободен ли буфер записи, перед тем, как записать туда if(!HIDTxHandleBusy(USBInHandle)) { ToSendDataBuffer[0] = 0x81; //создаем сообщение с информацией о переключателе sw if(sw3 == 1) { ToSendDataBuffer[1] = 0x01; } else { ToSendDataBuffer[1] = 0x00; } //готовим USB модуль для отправки данных хосту USBInHandle = HIDTxPacket(HID_EP,(BYTE*)&ToSendDataBuffer[0],64); } break; case 0x37: //проверить напряжение на АЦП { WORD_VAL w; // проверяем, свободен ли буфер записи, перед тем, как записать туда if(!HIDTxHandleBusy(USBInHandle)) { w = ReadPOT(); //считываем напряжение. функция определена ниже. ToSendDataBuffer[0] = 0x37; //делаем сообщение - напряжение на АЦП ToSendDataBuffer[1] = w.v[0]; //Передаем младший байт ToSendDataBuffer[2] = w.v[1]; //старший байт //готовим USB модуль для отправки данных хосту USBInHandle = HIDTxPacket(HID_EP,(BYTE*)&ToSendDataBuffer[0],64); } } break; } //готовим выходную конечную точку, чтобы хост смог отправить нам еще пакет ифнормации USBOutHandle = HIDRxPacket(HID_EP, (BYTE*)&ReceivedDataBuffer, 64); } }//end ProcessIO main.rar
  3. Компиляция Кода

    Извиняюсь за глупый вопрос, но куда сохраняется hex файл?
  4. Компиляция Кода

    Ошибку удалось устранить, дело было в компиляторе
  5. Компиляция Кода

    Alex, а ты заменял файл user на тот,что я скинул?
  6. Компиляция Кода

    Значит mplab, спасибо!
  7. Компиляция Кода

    Возникла ещё одна проблема, не могу скомпилировать готовый пример microchip, компилятор не находит head файлы в тех папках,в которых они находятся.Проект ниже. Файл user.c необходимо скопировать этот файл в каталог C:\MCHPFSUSB\fw\Cdc\user\, заменить в проекте файл user.c CDC_RS232_Emulation.zip user.rar
  8. Компиляция Кода

    Разобрался,криво стоял компилятор
  9. Компиляция Кода

    Вот именно,файлов нет в исходниках, возможно они идут с компиляторами,но найти не получается. Я посмотрел много исходников и проектов, глобальных переменных никогда в проектах не было,они просто указывались в скобках
  10. При попытке скомпилировать проект,появляется следующая ошибка(картинка) хотя этот файл( вроде как), должен находится где-то по умолчанию. МК pic18f4550. Проект тоже прикрепил Project1.rar
  11. Обработка Сигнала В Мк Pic16C781

    гениально... и как в таком случае будем осуществлять контроль выхода из строя датчика тока??? ну типа там датчик тока = кз или =обрыв.... Впринципе пока что это не пренципиально чт обрыв или кз , можно конечно тогда с помощью операционника сделать Для этого я тут и пытаюсь разобраться с этим , с чего то надо ведь начинать
  12. Обработка Сигнала В Мк Pic16C781

    Для начала я преобразовываю токовый сигнал 4-20мА в напряжение 0-5В по схеме на рисунке, и на входы ацп мк ,я так понимаю нужно делать?(МК ATmega32)
  13. Обработка Сигнала В Мк Pic16C781

    Хотел принять на борт схему из данной статьи http://cxem.net/mc/mc81.php
  14. Обработка Сигнала В Мк Pic16C781

    Продолжение темы, решил получить сигнал 4-20 mA в proteus, попробовал собрать схему( прилагается ниже) по примеру, но вышла какая-то ерунда. Хотя использовал аналогичные элементы.Просьба помочь разобраться,может я напутал чего-то. Моя схема первая, схема пример - вторая.
  15. Обработка Сигнала В Мк Pic16C781

    Нет, не курсовая. Будущий КИПовец,поэтому хочу со всем этим разобраться