StasRadeon

PIC Timer прерывания

48 сообщений в этой теме

StasRadeon    1

Ваши мнения ? как можно исправить. Можете подсказать куда  посмотреть , что можно изменить ?

UART с рейтом в 128000 работает 

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


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

Чтобы знать куда посмотреть, что изменить, да и вообще что делать, нужно знать цель. А её из Ваших уст не очень слышно.
Мы понимаем, что у Вас плохо с Русским, но всё-таки, попытайтесь внятно объяснить вопрос.
 

  • Одобряю 1

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


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

Я работаю с  Microphone Sensor (KY-038), и хотелось зарегистрировать голос. А для этого , мне нужно как минимум 8000 значение от ацп , чтобъ потом в Матлаб ево преображать для дольнешово дело.  И я так подумал , если нужно 8000 значения. Зная что Ф = 1/Т, то мне нужно получать  данные с периодом в 125 мкс и  передать  через UART.  Хочу сделать распознавание голоса с неуроновами сетями на недорогой микроконтроллер . 

Извините за мой русский. 

    //Baudrate 128.000
    //  U1BRG = (40.000.000 / (16 * BaudRate)) - 1
    //  U1BRG = (36850000 / (16 * 128.000)) - 1
    //  U1BRG = 19.53125
    

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

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


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

Чтобы передавать данные, которые преобразуются с определённой частотой, нужно выбирать скорость передачи равной или (лучше) выше, чем частота преобразования. Иначе данные просто будут не успевать передаваться.
Сделайте частоту UART, хотя бы, раза в 2 выше, тогда все данные буду передаваться вовремя и корректно.
Это с учётом того, что на каждое одно преобразование Вы будете передавать 1 символ. Сколько символов Вы будете передавать, во столько раз должна быть выше частота UART.

 

  • Одобряю 1

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


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

Найдите миллионы труднодоступных

электронных компонентов

StasRadeon    1

Это значит что если я отправлю 3 символа ( потому что работаю ацп на 10 битов и я отправляю [0-256 максимум ] аdc value  ( но не сложно и 1024 ) ) то будет нужно  в 3 раза быстрее, правильно понел ? То значит нужно будет UART -> 256.000 ? 

и значит что Freq , не должен быть 40 Мнz , а 80 Mhz 

Правильно ?

и видно что мне нужно использовать и Direct Memory Acces (DMA) 

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


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

Дело не в ДМА. ДМА лишь позволяет буферизовать поток данных, но если скорость выгрузки из буфера ДМА будет ниже, чем скорость поступления данных, то буфер ДМА неизбежно будет переполнен.

Нужно увеличивать скорость связи с компьютером.  Расчет делать лениво, но для 125 мкс периода получается поток 8кслов/с  то есть 16 кбайт/с.

Сиречь простой переброс в УАРТ с рейтом ВЫШЕ, чем 16000 даст искомое.

Но есть одно но. Передача данных на компьютер имеет ограничения по латентности. И это определяется операционной системой. Так интервал транзакций на компьютер может колебаться от 1 до 10 мс МИНИМУМ.

Но даже если гнать по HID USB мосту с кадрами по 64 байта, то легко можно получить 32кбайт/с, а при CDC USB еще больше.

 

 

2 часа назад, StasRadeon сказал:

Извините за мой русский. 

Вы из Румынии или из Молдавии?

:)

Изменено пользователем my504
  • Одобряю 1

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


Ссылка на сообщение
Поделиться на других сайтах
Alex    551
1 час назад, StasRadeon сказал:

Это значит что если я отправлю 3 символа ( потому что работаю ацп на 10 битов и я отправляю [0-256 максимум ] аdc value  ( но не сложно и 1024 ) ) то будет нужно  в 3 раза быстрее, правильно понел ? То значит нужно будет UART -> 256.000 ?

Поняли правильно. Только зачем 3 байта ? 1024 значений укладываются хорошо и в 2 байта.
Отсюда, как уже выше сказали, Вам нужен поток не менее 16 килобайт/сек. , а это 128 кбит/сек. Это минимум.
 

1 час назад, StasRadeon сказал:

и значит что Freq , не должен быть 40 Мнz , а 80 Mhz

Никак не связано. При тактировании периферии в 40 МГц, легко можно получить скорость в 128 килобод.
 

PS: А вообще, для голоса и 8 бит хватит за глаза. Да и частоту дискретизации смело можно понижать. На 8 КГц музыка нормально играет (без высоких), не говоря уж о голосе :)


 

  • Одобряю 1

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


Ссылка на сообщение
Поделиться на других сайтах
StasRadeon    1
1 час назад, my504 сказал:

Вы из Румынии или из Молдавии?

Moldova 

Хорошо, и как мне повысить на 16 килобайт/сек ? Проблема в УАРТ как видно. Дайте маленький пример,  пожалуйста 

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


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

bits_per_character -> 8 data bits + 1 start bit + 1 stop bit
    
bytes x bits_per_character / bits_per_second

16000 x 10 / 128000 = 1.25 seconds.
16 x 1024 x 10 / 128000 = 1.28 seconds.

правильное мышление  ? 

 

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


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

Правильное.

Да, 128 кбит/сек не хватит. Нужна скорость побольше.
 

  • Одобряю 1

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


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

но когда я смотрел в Device Manager в ПК , порт больше чем 128.000 не принимает. 

А как сделать так что побоище. Допустить поставим 256000, -> 0.64 seconds; Тоже мало  

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


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

Почему мало ? 256000 хватает.
10 бит * 2 байта * 8000 КГц = 160000 кбит/сек.
 

  • Одобряю 1

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


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

через два-три часа отпишусь, буду дома чтоба тестировать . спасибо большое 

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


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

может имеет смысл сразу поднять скорость до 921 600 кбит/с (dspic33fj128mc802 по datasheet вроде поддерживает: Two UART modules (10 Mbps)), а потом посмотрите на сколько можно снизить скорость

многие переходники USB-COM поддерживают скорость до 921 600 кбит/с (но данные переходники можно использовать только для отладки, на длительное время нельзя - USB отваливается)
а если требования к надёжности выше, то можно это:
http://www.moxa.ru/shop/boards/pci_express/cp-102e/cp-102el/
http://www.moxa.ru/shop/com_v_ethernet/industrial/ia_5000a/nport_ia_5150a/
http://www.moxa.ru/shop/converters/fiber/icf-1150/icf-1150-m-sc/

  • Одобряю 1

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


Ссылка на сообщение
Поделиться на других сайтах
StasRadeon    1
void InitUART1() {
    
	U1MODEbits.UARTEN = 0;	
    U1STAbits.UTXEN = 0;
	U1MODEbits.ABAUD = 0;	
	U1MODEbits.BRGH = 0;	//High Speed mode
	U1MODEbits.PDSEL = 0;	// Fara paritate
	U1MODEbits.STSEL = 0;	// 1 bit de Stop/
	//  U1BRG = (Fcy / (16 * BaudRate)) - 1
	//  U1BRG = (36850000 / (16 * 256000)) - 1
	//  U1BRG = 10
	U1BRG = 10;//256.000//239;
	U1MODEbits.UARTEN = 1;	//Activam UART
	U1STAbits.UTXEN = 1; //Activam Transmisia
    _delay__us(30); // 1/256000
    //DELAY_105uS

это последние модификацие в коде, но тоже не очень быстро ;

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


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

Спасибо огромное всем , отпишусь когда будет проект готовый. ^_^

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


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

здравствуйте , у меня такая проблема : настроел ацп , чтобы время конверсией ацп было 22.4 us.

настроил чтоба конверсия не было автоматической , а сделал функцию

unsigned int read_adc_value(void)
{
    AD1CON1bits.SAMP = 1; // start 
    //while(!AD1CON1bits.SAMP);
    __delay_us(10);
    AD1CON1bits.SAMP = 0; // stop 
    while(!AD1CON1bits.DONE);
    return ADCBUF0;
}

Когда в MPLAB X ставлю breakpoint показывает мне время конверсией около 5 ms .

Пожалуйста, может кто то посмотреть и подскажет где я не делаю правильно .

Мой расчеты :

=====PLL -> 80 MHz====================

    CLKDIVbits.PLLPRE = 0;
    PLLFBDbits.PLLDIV = 43 - 2;
    CLKDIVbits.PLLPOST = 0;

    // 43 x: 79.2275 MHz = 39.61375 MIPS

====================================

========ADC -> 22us =================
 Tad=Tcy*(adcs+1)=(1/40)*4 = 1.6us
 Tc = 14 * 1.6 = 22.4 us

====================================

Работаю на то чтобы взять 8000 - 10000 значения от ацп в секунду , и потом все значения переслать в ПК. 

Если есть другие идеи  как  можно взяты эти 8000 - 10000 значения  по быстрее , пожалуста скажите и мне.

 

Microcontroller  : DSPIC33fj128MC802

ADC_DSPIC33.X.rar

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

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


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

Стас, Вам вроде на соседнем ресурсе Марк уже объяснял, что Tad не может быть меньше 117.6ns,  параметр AD50 даташита,

У Вас Fcy=40MHz, Tcy=25ns.

А в настройках и коментах к ним вообще бред написан...

Цитата

    AD1CON3bits.ADRC = 1; ????//0 // foloseste ceasul magistralei
    AD1CON3bits.ADCS = 3; ????// Timpul necesar unei conversii este de 22.4 us
// Ceasul pentru conversia AD are formula Tad=Tcy*(adcs+1)
// Tad=Tcy*(adcs+1)=(1/40)*64=1.6us ????
// Se seteaza intrarile analogice

 

  • Одобряю 1

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


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

Да, правильно там 63 + 1 ;

Tad=Tcy*(adcs+1)=(1/40Mhz)*64=1.6us 

Tc = 14 * 1.6 = 22.4 us

про AD1CON3bits.ADRC = 1; написано -> 1 = ADC internal RC clock

все же , я чего то не делаю правильно 

 

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

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


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

:wall: что правильно? откуда у вас 63 взялось? какое отношение RC осцилятор имеет предделителю? к разберитесь как работает тактирование ADC...

  • Одобряю 1

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


Ссылка на сообщение
Поделиться на других сайтах
StasRadeon    1
19 минут назад, IMXO сказал:

разберитесь как работает тактирование ADC

FRC + PLL -> 80 MHZ

    CLKDIVbits.PLLPRE = 0;
    PLLFBDbits.PLLDIV = 43 - 2; 
    CLKDIVbits.PLLPOST = 0;

FOSC  = 80 MHz

FCY  = FOSC / 2 = ~40 MHz (39.61375 MIPS)

Tcy (the instruction cycle) = 1/40 MHz = 25ns

Tad > 117.6ns ;

Tad = Tcy /(ADCS + 1) = (1/40MHz) * 5 = ~125ns;

правильно ?

 

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


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

правильно.

забыли AD1CON3bits.ADRC =0;

  • Одобряю 1

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


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

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сообщения

    • А не расскажешь, что это за выпрямитель? Чес слово просто интересно. У брата была шаха и там в гене был диодный выпрямитель, как на картинке    
    • Трех проводная логика веселей, негде такое не встречал ..  это рационально
    • Так Пидератор форума Авалс доступ закрыл , а так бы наклал.
    • Выше было. На 4PDA тема про данный планшет. Там напрямую от модельных "липолек" его заражают. Как и от авто аккумулятора.
    • Сегодня весь весь вечер играет - что-то не очень, если прибавить.
      Неравномерность каналов, смазанность ВЧ и т.д, и т,п.
      Короче, перелопачивать (доводить) надо, если хочется нормального звука. В общем - обычно. Ничего выдающегося. Починил и отдал.
    • Там где новая версия USART есть Receiver timeout, когда произошел останавливаем прием. ДМА настраиваем на макс. размер буфера если достигли все это переполнение. Там где нет  использую IDLE но там фиксированная длина в 1.5 символа иногда это слишком мало. В тех что постарше (F4) хочу попробовать сделать прием на 2 каналах ДМА. второй канал для таймера. Но зато все работает в фоне.
    • "Данное зарядное устройство предназначено для зарядки cерии планшетов Asus EeePad Transformer, ASUS EeePad Transformer Prime, ASUS EeePad Slider: TF101, TF201 TF300, TF700, SL101
      Зарядка состоит из двух элементов: непосредственно адаптера питания с USB разъемом и кабелем. Кабель имеет интерфейс USB 3.0 и также используется для обмена данными (синхронизации) с компьютером.
      Отличительной особенностью этого адаптера питания является то, что он позволяет заряжать не только планшетный компьютер ASUS, но и другие устройства. Для чего произодитель предусмотрел автоматическое определение типа подключенного аппарата. Если подключен планшет ASUS EeePad, то производится подача напряжения 15V. Где-то на просторах описано, что в юсб3.0 должнозамыкаться. Если в разъем на корпусе зарядного устройства вставлен USB-кабель с другим гаджетом на конце (например мобильным телефоном или плеером), то производится зарядка "классическим" напряжением 5V. Именно этот функционал вводит в заблуждение многих пользователей - увы, любое другое обычное зарядное устройство с USB-выходом планшет Eee Pad не заряжает."