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

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

Rst7

  • Сообщений: 1619
  • Мимо проходил...
    • Просмотр профиля
    • E-mail
Цитировать
Нужно записать в его ROM массив данных из wav файла для дальнейших манипуляций с этим массивом. Как это сделать?

В адекватных средах разработки это может сделать линкер - положить бинарный файл в отдельную секцию. Конкретно надо курить мануал по применяемому линкеру.

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

Rus

  • Сообщений: 1017
    • ICQ клиент - 305702633
    • Просмотр профиля
    • E-mail
Уважаемые знатоки цифровых технологий, помогите пожалуйста отладить алгоритм свертки, не могу найти ошибку. Сделал в c++builder приложение, которое открывает две вавки и делает свертку.
Вот картинка: http://imageshack.us/photo/my-images/189/convz.jpg/
Сверху входной сигнал (синус, 1кГц, 1.17 сек), ниже импульс (0.25 сек.) и внизу результат.
Сначала все идет как надо (сравнивал с аудиоредактором) - переходный процессик и начинается установившийся режим.
Но дальше не могу понять, откуда берется скачок амплитуды и вообще непойми что в конце. Помогите разобраться ::)

Вот текст проги:
//---------------------------------------------------------------------------
#include <stdio.h>
#include <vcl.h>
#pragma hdrstop

#include "sound.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"


short format_tag, channels, block_align, bits_per_sample,*sound_buffer;
BYTE id[4];
DWORD size, format_length, sample_rate, avg_bytes_sec, data_size ;
FILE *fp;

short iformat_tag, ichannels, iblock_align, ibits_per_sample,*isound_buffer;
BYTE iid[4];
DWORD isize, iformat_length, isample_rate, iavg_bytes_sec, idata_size ;
FILE *ifp;
unsigned int i,j,k;

float *rsound_buffer;


TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
Label17->Visible=0;
Label18->Visible=0;
Label19->Visible=0;
Label20->Visible=0;
Label21->Visible=0;
Label22->Visible=0;
Label23->Visible=0;
Button2->Enabled=0;

Label7->Visible=0;
Label24->Visible=0;
Label25->Visible=0;
Label26->Visible=0;
Label27->Visible=0;
Label28->Visible=0;
Label29->Visible=0;
Button4->Enabled=0;
}
//----------Читаем описание формата входного файла---------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
fp = fopen("C:/16_44test.wav","rb");
if(fp)
{
fread(id,sizeof(BYTE),4,fp);
if((id[0]=82)|(id[1]=73)|(id[2]=70)|(id[3]=70))  //Check if RIFF
{
fread(&size,sizeof(DWORD),1,fp);
}
else ShowMessage("Not RIFF");
fread(id,sizeof(BYTE),4,fp);
if ((id[0]=87)|(id[1]=65)|(id[2]=86)|(id[3]=69)) //Check if WAVE
{
fread(id,sizeof(BYTE),4,fp); //Read "fmt"
fread(&format_length,sizeof(DWORD),1,fp);
fread(&format_tag,sizeof(short),1,fp);
Label18->Caption=IntToStr(format_tag);
fread(&channels,sizeof(short),1,fp);
Label19->Caption=IntToStr(channels);
fread(&sample_rate,sizeof(DWORD),1,fp);
Label20->Caption=IntToStr(sample_rate);
fread(&avg_bytes_sec,sizeof(DWORD),1,fp);
Label21->Caption=IntToStr(avg_bytes_sec);
fread(&block_align,sizeof(short),1,fp);
Label22->Caption=IntToStr(block_align);
fread(&bits_per_sample,sizeof(short),1,fp);
Label23->Caption=bits_per_sample;
fread(id,sizeof(BYTE),4,fp);   //Read DATA subchunk
fread(&data_size,sizeof(DWORD),1,fp); //Read DADA size
Label17->Caption=IntToStr(data_size);
Label17->Visible=1;
Label18->Visible=1;
Label19->Visible=1;
Label20->Visible=1;
Label21->Visible=1;
Label22->Visible=1;
Label23->Visible=1;
Button2->Enabled=1;
}
else
ShowMessage("It is NOT a Wave file!!");
}
else ShowMessage("Shit!!!\nCan't open =(");
}
//-----------Читаем блок данных входного файла, выводим на график-----------
void __fastcall TForm1::Button2Click(TObject *Sender)
{                                 //создаем входной массив
sound_buffer=(short*)calloc((data_size+idata_size)/2,sizeof(short));
for(i=0;i<=data_size/2;i++)       //заполняем его
{
fread(sound_buffer+i,sizeof(short),1,fp);
Chart1->Series[0]->AddXY(i,sound_buffer[i],clRed);
}
}
//--------Читаем описание формата файла импульса-----------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)
{
ifp = fopen("C:/impulse.wav","rb");
if(ifp)
{
fread(iid,sizeof(BYTE),4,ifp);
if((iid[0]=82)|(iid[1]=73)|(iid[2]=70)|(iid[3]=70))  //Check if RIFF
{
fread(&size,sizeof(DWORD),1,ifp);
}
else ShowMessage("Not RIFF");

fread(iid,sizeof(BYTE),4,ifp);
if ((iid[0]=87)|(iid[1]=65)|(iid[2]=86)|(iid[3]=69)) //Check if WAVE
{
fread(iid,sizeof(BYTE),4,ifp); //Read "fmt"
fread(&iformat_length,sizeof(DWORD),1,ifp);
fread(&iformat_tag,sizeof(short),1,ifp);
Label24->Caption=IntToStr(iformat_tag);
fread(&ichannels,sizeof(short),1,ifp);
Label25->Caption=IntToStr(ichannels);
fread(&isample_rate,sizeof(DWORD),1,ifp);
Label26->Caption=IntToStr(isample_rate);
fread(&iavg_bytes_sec,sizeof(DWORD),1,ifp);
Label27->Caption=IntToStr(iavg_bytes_sec);
fread(&iblock_align,sizeof(short),1,ifp);
Label28->Caption=IntToStr(iblock_align);
fread(&ibits_per_sample,sizeof(short),1,ifp);
Label29->Caption=ibits_per_sample;
fread(iid,sizeof(BYTE),4,ifp);   //Read DATA subchunk
fread(&idata_size,sizeof(DWORD),1,ifp); //Read DADA size
Label7->Caption=IntToStr(idata_size);

Label7->Visible=1;
Label24->Visible=1;
Label25->Visible=1;
Label26->Visible=1;
Label27->Visible=1;
Label28->Visible=1;
Label29->Visible=1;
Button4->Enabled=1;
}
else
ShowMessage("It is NOT a Wave file!!");
}
else ShowMessage("Shit!!!\nCan't open =(");
}
//---------Читаем блок данных файла импульса, выводим на график--------------

void __fastcall TForm1::Button4Click(TObject *Sender)
{                                     //создаем массив импульса
isound_buffer=(short*)calloc(idata_size/2,sizeof(short));
for(i=0;i<=idata_size/2;i++)
{
fread(isound_buffer+i,sizeof(short),1,ifp);
Chart2->Series[0]->AddXY(i,isound_buffer[i],clRed);
}
}
//------------Собственно свертка---------------------------------------------

void __fastcall TForm1::Button5Click(TObject *Sender)
{                                         //создаем выходной массив
rsound_buffer=(float*)calloc((idata_size+data_size)/2,sizeof(float));

k=idata_size/2;
for(j=0;j<=(idata_size+data_size)/2;j++) //семплы результата
{
for(i=0;i<=idata_size/2-k;i++)
rsound_buffer[j]+=isound_buffer[i]*sound_buffer[j-i];
if(k>0)k--;
Chart3->Series[0]->AddXY(j,rsound_buffer[j],clRed);
}
}
//---------------------------------------------------------------------------
ЗЫ Горизонтальные оси чартов не настраивал, это не особо важно - главное, форму сигнала видно.

Rst7

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

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

Rus

  • Сообщений: 1017
    • ICQ клиент - 305702633
    • Просмотр профиля
    • E-mail
@ Rst7
Ну это рабочий вариант... Не совсем понял, как форматировать?
Со скачком амплитуды посредине разобрался - в последнем цикле по i заменил "<=" на просто "<". Теперь получается вот так: http://imageshack.us/photo/my-images/35/convx.jpg/
Осталось разобраться, почему появляется импульс в конце данных. Чую, где-то в циклах свертки собака зарылась...

Короче, заработала моя приблуда, ура! Сравнивал на слух с популярным Sony Acoustic Mirror, разницы не заметил. Следующим шагом будет обработка в реал-тайме с линейного входа, а потом в ARM ее ::) Только б не забросить это дело, пока дойду до этого)
« Последнее редактирование: Ноября 25, 2011, 10:36:31 pm от Rus »

VAT

  • Сообщений: 1453
    • Просмотр профиля
    • E-mail
Народ, 10 лет назад я будучи разработчиком-железячником по случаю написал несколько программ на ассемблере для AVR 2313. Причем одной из прог напроч заняв  все ресурсы всех памятей. т.е. насобачился неплохо.
Вопрос такой.
десять лет паузы - все основательно забыто. Сейчас возможно потребуется несложные по сравнению с теми программами программульки написать.. Стоит "С" изучать или дуть по накатанному?   
« Последнее редактирование: Ноября 28, 2011, 04:45:28 pm от VAT »

ivana

  • Сообщений: 3
  • GtLab.Net forever!
    • Просмотр профиля
    • E-mail
Имхо молодого бойца - и дуть по накатанному и изучить С. Общее понимание ассемблера плюс архитектуры МК не будет лишним при использовании С, а иногда и до asm может потребоваться опускаться.

VAT

  • Сообщений: 1453
    • Просмотр профиля
    • E-mail
ну а что дает собственно С при простых задачах? задача типа регистрировать события на портах и потом индицировать что там происходило. возможно с сохранением данных в епром на случай отключения питания.
  
« Последнее редактирование: Ноября 28, 2011, 06:07:02 pm от VAT »

ivana

  • Сообщений: 3
  • GtLab.Net forever!
    • Просмотр профиля
    • E-mail
Имхо - возможность мыслить в более человечески-ориентированных абстракциях: математика, типы, условные операторы и т.п. Вдобавок, компилятор берет на себя много рутинной работы - распределение ОЗУ, сохранение промежуточных переменных при путешествии по уровням контекста и вплоть до распределения переменных в 1-2-4 ячеек ОЗУ или регистров - в зависимости от разрядности МК. То есть, можно писать код забыв о структуре ядра - компилятор сделает все что надо, или портирует код с одного ядра на другое. Хотя по-хорошему о структуре ядра забывать не надо :) Короче - С дает возможность программисту жить и думать в удобном мире стройных человеческих абстракций. Есть конечно плата за это - с компилятором надо уметь дружить, аккурано использовать различные опции оптимизации и знать соглашения о передаче параметров или использовании регистров и т.п. - для возможности создания симбиозов С-asm.

VAT

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

_Gunpowder_

  • Сообщений: 109
    • Просмотр профиля
    • E-mail
Rus, из картинки следует, что проблема явно в границах циклов. Вроде как файлы свернуты только один раз.

По коду я так и не понял какие используются диапазоны данных для свертки. Почему размеры данных и импульса постоянно делятся на 2  :-?

А вот здесь ты себя перехитрил. Тут заключена ошибка, приводящая к однократному выполнению свертки:

k=idata_size/2;
...
for(i=0;i<=idata_size/2-k;i++) {
..
if(k>0)k--;
}
« Последнее редактирование: Ноября 29, 2011, 04:33:43 pm от _Gunpowder_ »
Framus, Musicman -> CAE Wah -> diy-FuzzFace, diy-Scrambler -> diy-Mark, diy-Jubelee, diy-Orange, diy-Krank, diy-Uberschall -> Moogerfooger -> Carbon Copy -> diy-MOD'S 20W PP -> Senn e906, Audix i5

Rst7

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

Не надо подменять понятия. Как бы вот:

Цитировать
Короче, заработала моя приблуда, ура!
Последняя редакция: 26.11.2011 :: 00:36:31 от Rus

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

ivana

  • Сообщений: 3
  • GtLab.Net forever!
    • Просмотр профиля
    • E-mail
Цитировать
мне казалось, что программы для микроконтроллеров уж очень завязаны на архитектуру, на порты
На периферию (порты, устройства и т.п.) - очень даже завязаны. Я говорил про архитектуру ядра. Один и тот же код на С компиляторы успешно засунут и в 8-миразрядный AVR без аппаратного умножения (если он туда влезет) и в 32-х разрядный мощный процессор - и тебе не надо будет думать что интеджер в 8 бит не влезет и надо использовать 2-х или 4-х байтовую математику с переносом. Или думать как засунуть блок сложных условных переходов в breq/brne/sbis/ или что ещё. Один и тот же код на С превратится в совершенно разные коды на asm в результате компиляции - в зависимости от возможностей МК и параметров оптимизации в установках компилятора. В этом смысле С в известной мере абстрагирует логику разработчика от особенностей платформы. Ну а работу с периферией придется шлифовать, ибо обращение к ней различается порой весьма сильно.

ЗЫ Михаил KMG выкладывал ссылку на свои коды для AVR - футвсвич с индикацией. Написано на С. Можно самому написать на asm? Можно. Но на С проще, если конечно ты не гений ассемблера с нулевыми знаниями в С. Влез этот код на нужный МК? Влез. Портируется на другие МК? Портируется, с учетом шлифовки обращения с периферией.

ЗЗЫ я вот сейчас как раз на asm начну детально думать как писать драйвер шагового движка - и думать над умножением лонгов и с плавающей запятой, делением, трехэтажными условиями и прочими прелестями - и все это на 8-битном AVR! Как говорит командир - хорошая практика набить руку на asm  ::)

VAT

  • Сообщений: 1453
    • Просмотр профиля
    • E-mail
Спасибо,
на что обратить внимание стоит, что изменилось за 10 лет в этом направлении? AVR не устарел морально? какой сейчас наиболее популярный микроконтроллер о 16-20ног?  AVRstudio сильно улучшилась?

Rst7

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

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

ivana

  • Сообщений: 3
  • GtLab.Net forever!
    • Просмотр профиля
    • E-mail
Цитировать
AVR не устарел морально?
Имхо для своих задач вполне подходит. Тот же вышеупомянутый футсвич на Cortex M3 делать имхо как-то... из пушки по воробьям, что ли :)
Цитировать
AVRstudio сильно улучшилась?
Вышла новая, кажется 5-я версия. Где, по слухам, нет этих идиотских ошибок из-за кириллицы в именах каталогов и даже имени учетной записи пользователя (!), есть возможность ставить комментарии на выделенный кусок строк, процедуры и функции на С сворачиваются по "+" в одну строку и еще много того. что надо было сделать ещё в версии 1. Но я продолжаю работать на 4-й потому что 5-я ещё далеко не все модели МК поддерживает.

research

  • Гость
Как я понимаю, начинать работу с кортексом как раз не грех с футсвича. На пониженной тактовой с низким энергопотреблением. Иначе так все и обомрет как ВАЗ 2105.

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

Rst7

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

Только в корпусах 8 ног - совсем крайний случай. Все. Точка. Если надо больше ног - уже 32 бита.
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредствен

Rst7

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

Большой кортекс:
http://www.embeddedartists.com/products/lpcxpresso/lpc1769_xpr.php
За 20 евро имеете плату с LPC1769 (и заодно Ethernet PHY на этой же плате уже стоит, снаружи надо только разъем с трансом подключить) + JTAG-Отладчик (который можно отпилить и потом использовать отдельно)

Маленький кортекс:
http://www.embeddedartists.com/products/lpcxpresso/lpc1114_xpr.php

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

ivana

  • Сообщений: 3
  • GtLab.Net forever!
    • Просмотр профиля
    • E-mail
Если уж на таком камне футсвичи писать, тогда туда же можно засунуть тюнер как минимум, драм-машинку, а потом и эмулятор Зума-505 го или ещё какого проца ::)

Кстати, метроном делается на раз-два вместе с индикацией текущей частоты. Тюнер тоже - безо всяких АЦП даже (хотя можно и с ними) - превращаем сигнал в меандр триггером и снимаем частоту по 0/1 на входной ноге, остается грамотно вывести показание на индикатор. И даже это всё, вместе с футсвичем, имхо можно засунуть в 8-миногую 8-мибитную Tiny-13 какую-нибудь (если хватит ног, ОЗУ и памяти программы :) ) ::)
« Последнее редактирование: Декабря 02, 2011, 03:13:09 pm от Ivana »

research

  • Гость
На словах это все легко как два пальца, а на деле нет ни тюнеров, ни драм машин, ни толкового бит крашера.