Автор Тема: Микроконтроллер - как перспектива примочкостроения  (Прочитано 25219 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Rus

  • Сообщений: 1017
    • ICQ клиент - 305702633
    • Просмотр профиля
    • E-mail
На этом я уже съел собаку.  В первых опусах долго не мог понять, в чем трабл. Но спустя какое-то время это прояснилось.
Сейчас у меня предыстория присутствует в виде хвоста предшествующего кадра, на место которого не перезаписываются, а суммируются отсчеты нового.
Так что все ок ;)
« Последнее редактирование: Марта 14, 2012, 09:09:11 pm от Rus »

Rst7

  • Сообщений: 1619
  • Мимо проходил...
    • Просмотр профиля
    • E-mail
Цитировать
Сейчас у меня предыстория присутствует в виде хвоста предшествующего кадра, на место которого не перезаписываются, а суммируются отсчеты нового.

Что значит "хвост"?
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредствен

Rus

  • Сообщений: 1017
    • ICQ клиент - 305702633
    • Просмотр профиля
    • E-mail
Если взять, например, длину одного блока А, и длину импульса В, то длина их свертки С будет С= А+В-1. Под хвостом я имею ввиду все, что начинается с А+1-й точки и до конца С.
Писал уже страницу назад, что по аналогичному алгоритму навоял прогу под винду, через к-рую слушал и смотрел анализатором реальные звуковые файлы, значительно превышающие размер одного окна. И результат никак не отличался от небезызвестного acoustic mirror, с к-рым и сравнивал.

Rst7

  • Сообщений: 1619
  • Мимо проходил...
    • Просмотр профиля
    • E-mail
Цитировать
Под хвостом я имею ввиду все, что начинается с А+1-й точки и до конца С.

Вот теперь все ясно. Да, такой алгоритм правильный и действительно совпадает по результатам с прямым расчетом (если, конечно, нигде ничего не потеряли в реализации, но раз совпадает, то значит все ок).

Ну и дабы подкинуть информации к размышлению - рекомендую ознакомиться с преобразованием Хартли - http://www.radioscanner.ru/files/signals-analysis/file1862/
Чем хорошо - не надо производить операции с комплексными числами. Заметно меньше умножений, а значит - выше производительность. А так все одинаково - свертка выполняется аналогичным образом.
« Последнее редактирование: Марта 14, 2012, 10:17:26 pm от Rst7 »
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредствен

Rus

  • Сообщений: 1017
    • ICQ клиент - 305702633
    • Просмотр профиля
    • E-mail
Любопытно. Надо будет ознаокмиться. Спасибо)

Rus

  • Сообщений: 1017
    • ICQ клиент - 305702633
    • Просмотр профиля
    • E-mail
Если частота дискретизации в симуляторе плавает на +/- 70Гц, можно необращать внимания, или, если это существенно, как ее пожестче задать можно? Не понятно, почему так? У меня сейчас от таймера она генерится.

Rst7

  • Сообщений: 1619
  • Мимо проходил...
    • Просмотр профиля
    • E-mail
Цитировать
Если частота дискретизации в симуляторе плавает на +/- 70Гц,
...
У меня сейчас от таймера она генерится.

Что значит плавает? И как генерится?
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредствен

Rus

  • Сообщений: 1017
    • ICQ клиент - 305702633
    • Просмотр профиля
    • E-mail
всмысле изменяется. Меряю на одном участке сигнала между соседними отсчетами - 44.117, в другом месте 44.036, при отсутствии сигнала 44.150 и т.д.
А генерится так - АЦП выставлен на одиночное преобразование, к-рое выполняется в обработчике прерывания таймера.
С чем это может быть связано?

Rst7

  • Сообщений: 1619
  • Мимо проходил...
    • Просмотр профиля
    • E-mail
Цитировать
А генерится так - АЦП выставлен на одиночное преобразование, к-рое выполняется в обработчике прерывания таймера.
С чем это может быть связано?

Небось еще и таймер руками перезаряжаете вместо сброса по MAT? А так вообще обычный джиттер по входу в прерывание. АЦП надо тактировать жестко, например, пользуясь теми режимами битового поля START регистра AD0CR, которые запускают преобразование по MATx.x. В соответствующем таймере Вам кроме того нужно установить режим сброса таймера по этому же сигналу MAT. Тогда никакого джиттера не будет.
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредствен

Rus

  • Сообщений: 1017
    • ICQ клиент - 305702633
    • Просмотр профиля
    • E-mail
Цитировать
Небось еще и таймер руками перезаряжаете вместо сброса по MAT?
Да, перезаряжаю, записывая соответствующий бит в Match Control Register.
А как сделать перезарядку по МАТ? Мануал курил - не нашел. Нашел только, как задать реакцию выходов МАТ на совпадение (External Match Register), а вот как его обрабатывать, не совсем понятно...

Rst7

  • Сообщений: 1619
  • Мимо проходил...
    • Просмотр профиля
    • E-mail
Цитировать
Мануал курил - не нашел.

В регистр MRx пишете число тактов таймера для получения нужного периода, например, для периода 44100Гц и тактовой 120МГц надо писать туда (120000000/44100)-1=2720. Потом в соответствующем Match Control Register (MCR) устанавливаете в 1 бит MRxR - это будет приводит к сбросу счетчика таймера в 0 по достижению значения в регистре MRx. Затем запускаете таймер - в Timer Control Register пишете 1. Ну а предварительно настраиваете ADC на запуск по нужному MAT. А процедуру выгребания данных из ADC вешаете на прерывание от ADC по готовности данных.

Все.
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредствен

Rus

  • Сообщений: 1017
    • ICQ клиент - 305702633
    • Просмотр профиля
    • E-mail
Переделал, частота зафиксировалась железно. Спасибо большое!
Правда, немного иначе сделал - в External Match Control поставил режим toggle и считаю до 1360. А если делать, как Вы говорите, то установившийся после совпадения бит EMR как лучше сбрасывать? В прерывании от MRx?

Rst7

  • Сообщений: 1619
  • Мимо проходил...
    • Просмотр профиля
    • E-mail
Цитировать
Правда, немного иначе сделал - в External Match Control поставил режим toggle и считаю до 1360.

Да, походу это самое верное решение, я не дочитал немного даташит на предмет того, что там важен фронт или спад, просто в других камнях часто достаточно только события совпадения для запуска, а уж чего там делает сама ножка - до дупы.
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредствен

Rus

  • Сообщений: 1017
    • ICQ клиент - 305702633
    • Просмотр профиля
    • E-mail
Добрый вечер!
Подскажите, что почитать для понимания сути работы I2S интерфейса. Можно на английском. Вроде так в общем разобрался, сделал инициализацию, но мастер-клока на соответсвующей ноге не видать. И еще, не понятно почему, в регистре I2SDAO по дефолту все нули, хотя по усер-мануалу 0, 5 и 15 биты долджны стоять. :-?
LPC_SC->PCONP |= 1<<27; // power & clok to I2S
 LPC_SC->PCLKSEL1 |= 1<<22;      // set I2S clock to CCKL
 LPC_PINCON->PINSEL0 |= 1<<14 | 1<<16 | 1<<18; //set I2S pins
 LPC_PINCON->PINMODE0 |= 1<<14 | 1<<15 | 1<<16 | 1<<17 | 1<<18 | 1<<19; //Enable pull-down resistors for I2S pins
 LPC_I2S->I2SIRQ |= 1<<1; //Enable transmit interrupts
 LPC_I2S->I2STXRATE      |= 120 | 1<<8; //set x and y
 LPC_I2S->I2STXBITRATE |= 1; //set TX_MCLK devide value to produce bit rate
 LPC_I2S->I2SDAO &= ~(1<<5);  //set I2S transmitter as master
 LPC_I2S->I2SDAO |= 1<<0 | 1<<1; //32-bit wordwidth
 LPC_I2S->I2SDAO |= 1<<2; //mono
Использовать хочу для состыковки lpc1759 c внешним цап-ом.
Буду признателен за любую инфу по теме :)

Rst7

  • Сообщений: 1619
  • Мимо проходил...
    • Просмотр профиля
    • E-mail
Цитировать
Буду признателен за любую инфу по теме

Завтра гляну, заодно со своих исходников скопипастю код. Там, правда, я в режиме Slave I2S использовал.
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредствен

Rus

  • Сообщений: 1017
    • ICQ клиент - 305702633
    • Просмотр профиля
    • E-mail
Rst7
Нашли что-то?
Читал мануал на LPC, но никак не могу въехать, по какому механизму осуществляется передача, там про это ничего не пишется вообще((
 На сколько я понял, передаваемое значение надо писать в регистр FIFO, а потом что с ним делать - не понятно. И еще такой параметр - FIFO level, что он означает?

Затворник

  • Сообщений: 271
    • Просмотр профиля
    • E-mail
Господа! Забыл как называется эффект, понижающий строй с шагом в полтона. Я так вообще понял, что реализовать его возможно только в цифре? В связи с чем вопрос: современные микроконтроллеры способны в достаточном (на уровне гитарного процессора) качестве обработать сигнал? Может, какие предложения озвучите? Спасибо!
Депрессия - это когда выбитые зубы собирают сломанными руками.

KMG

  • Сообщений: 3776
    • ICQ клиент - 412221711
    • AOL клиент - Mike
    • Просмотр профиля
    • E-mail
FIFO level для того чтобы знать сколько свободного места в FIFO, сколько инфы можно туда записать для передачи.
Если передача включена, то FIFO "рассасывается" автоматически со скоростью битрейта.
Чтобы не было разрывов в передаче (заикания звука) нужно следить чтобы FIFO level не становился 0 в процессе передачи всего блока.

Rst7

  • Сообщений: 1619
  • Мимо проходил...
    • Просмотр профиля
    • E-mail
Цитировать
Нашли что-то?
Читал мануал на LPC, но никак не могу въехать, по какому механизму осуществляется передача, там про это ничего не пишется вообще((

Блин, пардон, совсем забыл... Значит так, вот есть кусок моего кода из рабочего проекта.

  DEBUG_PUTS("RX: Init I2S module.\r\n");
  PCONP_bit.PCI2S=1; //Power up I2S module
  I2SDAI=((32UL-1UL)<<6)|(1UL<<5)|3; //32 bits half period, slave mode, 32-bit data
  I2SRXMODE=0;
  I2SRXBITRATE=1-1; //Divide RXMCLK by 1
  PINSEL1|=(2UL<<14)|(2UL<<16)|(2UL<<18); //P0.23 - I2S RXCLK, P0.24 - I2S RXWS, P0.25 - I2S RXSDA
  DEBUG_PUTS("RX: Setup I2S interrupt.\r\n");
  NVIC_IntPri(NVIC_I2S,4<<3); //Приоритет 4.
  NVIC_IntEnable(NVIC_I2S);



....

И собственно говоря, читалка на прерываниях:

void I2S_IRQHandler(void)
{
  UREG i=RX_IQ_WP;
  UINT32 *p=(UINT32*)(((UINT8*)RX_IQ_BUF)+i);
  *p++=I2SRXFIFO;
  *p++=I2SRXFIFO;
  *p++=I2SRXFIFO;
  *p++=I2SRXFIFO;
  i+=4*4;
  i%=sizeof(RX_IQ_BUF);
  RX_IQ_WP=i;
}

Либо вариант с DMA

//RXSIZE
//Souce burst size=1
//Destination burst size=1
//Source transfer width=32-bit
//Destination transfer width=32-bit
//Source increment=0
//Destination increment=1
//Terminal count interrupt enable bit=1
#define RX_DMA_START_VALUE_CTRL (((RX_DMA_SZ)<<0)+(0UL<<12)+(0UL<<15)+(2UL<<18)+(2UL<<21)+(0UL<<26)+(1UL<<27)+(1UL<<31))
//Enable, Source - I2S, Destination - memory (ignored), peripheral to memory, ITC=1
#define RX_DMA_START_VALUE_CONF ((1UL<<0)+(5UL<<1)+(5UL<<6)+(2UL<<11)+(1UL<<15))

//Доинициализация DMA
  DEBUG_PUTS("RX: Configure DMA.\r\n");
  DMACCONFIGURATION=1; //Enable DMA
  DMACC1DESTADDR=(unsigned long)RX_DMA_P;
  DMACC1SRCADDR=(unsigned long)(&I2SRXFIFO);
  DMACC1CONTROL=RX_DMA_START_VALUE_CTRL; //
  DMACC1CONFIGURATION=RX_DMA_START_VALUE_CONF;
  I2SDMA1=(4UL<<8)|(1UL<<0); //RX_DMA1_ENABLE=1, RX_DEPTH_DMA1=4

....

void GPDMA_IRQHandler(void)
{
  UREG intf=DMACINTSTATUS;
  if (intf&2)
  {
    //Прерывание от канала 1, приемник
    DMACINTTCCLEAR=2; //Сбрасываем флаг прерываний
    DMACC1DESTADDR=(unsigned long)RX_DMA_P; //Куда
    DMACC1CONTROL=RX_DMA_START_VALUE_CTRL; //Размер и прочее
    DMACC1CONFIGURATION=RX_DMA_START_VALUE_CONF; //Старт тут
    NVIC_SetPend(NVIC_TIMER3); //Стартуем TMR3_IRQHandler - основной код приемника
  }
}
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредствен

Rus

  • Сообщений: 1017
    • ICQ клиент - 305702633
    • Просмотр профиля
    • E-mail
Спасибо, буду разбираться....
А для передатчика есть примерчик?