S

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

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

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

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

0

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


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

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

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
0

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


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

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

 

1

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


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

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

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

Правильно ?

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

0

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


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

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

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

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

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

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

 

 

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

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

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

:)

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

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


Ссылка на сообщение
Поделиться на других сайтах
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

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


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

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

Moldova 

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

0

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


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

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.

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

 

0

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


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

Правильное.

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

1

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


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

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

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

0

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


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

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

1

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


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

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

0

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


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

может имеет смысл сразу поднять скорость до 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

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


Ссылка на сообщение
Поделиться на других сайтах
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

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

0

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


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

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

0

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


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

здравствуйте , у меня такая проблема : настроел ацп , чтобы время конверсией ацп было 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
0

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


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

Стас, Вам вроде на соседнем ресурсе Марк уже объяснял, что 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

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


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

Да, правильно там 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
0

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


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

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

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;

правильно ?

 

0

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


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

правильно.

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

1

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


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

огромное спасибо! , заработало как надо 

0

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


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

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

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

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

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


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

Войти

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


Войти сейчас

  • Сообщения

    • Проверьте, не может ли быть проблема связана с работой шумоподавителя. Цепи обвязки DA1 в УМ конских номиналов, я бы уменьшил номиналы резисторов на два порядка, соответственно увеличив ёмкости.
    • Коллега, ты прав, всё познаётся в сравнении, только чего и с чем!!!  Как-то я пыталя найти эту грань, поверь коллега, 825 от 318, хоть в металле, хоть в пластике, отличить, ... нужна АС на уровне. А если по Ослику, то вообще, ВСЕ МС звучат одинаковА
    • интересный ты пацан! Ждешь совета от МАСТЕРОВ, при этом - не идешь к ним! Что ты думаешь - я буду писАть трактат по ремонту для КЛИЕНТА, имея за плечами четверть века в ремонте как мастер?! А те, кто "паяльником потыкали в предохранитель" тебе все равно не дадут ответ Так что путь один - искать в регионе НОРМАЛЬНОГО МАСТЕРА ... меня всегда умиляло, как "УМА" взять в кредит плоскоящик у таких хватает, а платить за его ремонт - ДЕНЕГ НЕТ ... Ну так купи СРТ-ник по цене - треть от ремонта твоего за БУ и смотри ...
    • B
      в режиме 2-го монитора через VGA я вывожу туда таблицу. пока ее двигаю она не читаемая. как только я ее остановил, развернул то через пару секунд все становится нормально, хоть настраивай тв. при просмотре каналов нет намеков на полоски или квадратики, просто все смазывается. представьте что ваш мобильник полежал на морозе некоторое время и вы решили поиграть на нем и вы поймете что я вижу на экране. а на картинках да, там одна рябь. провайдеры все сигналы гасят чтоб к ним подключались.
    • А нельзя ли проверить плату управления без панели управления, то есть самому имитировать сигналы увеличения скорости, чтобы разделить блоки между собой и будь уже уверенным какой блок рабочий а какой нет.  понимаю, что это всё идёт на цифровом уровне  между контроллерами, а дальше уже на ШИМ, но всё же, есть какие нибудь варианты?  Буду проверять кнопки для начало.  
    • А сам то как оказался в "разделе для профессионалов",если даже осциллографа не имеешь?   А ты как думал? Ответь форуму на простой вопрос: Почему всякий ламер имеющий тестер и знающий с какой стороны паяльник в розетку втыкать,мнит себя "Великим Ремонтником" ?  
    • А что я ему дельного могу посоветовать имея только мультик в наличии? По поводу ведра транзисторов предупредил....