_Ie0nid
Участник*-
Постов
29 -
Зарегистрирован
-
Посещение
Репутация
0 ОбычныйИнформация о _Ie0nid
-
Звание
Участник
Посетители профиля
-
VHDL в QUARTUS для очень начинающего
_Ie0nid ответил _Ie0nid тема в Программирование
За книжку большое спаисибо. Хотя, надо признаться, у меня книжек такого плана уже целый килограмм. Вопрос по теме. Есть пример в котором есть такая запись S = "01", ну и другие условия S = "10", и так далее. КТо сможет подсказать, как такой элемент должен выглядеть в квартусе. Это два вывода S1 и S2, или как то по другому. Заранее благодарю. -
VHDL в QUARTUS для очень начинающего
_Ie0nid ответил _Ie0nid тема в Программирование
Извините за низкий интелект, теперь я окончательно запутался. 1. Вот это апостроф - `, или вот это тоже апостроф - '. 2. Вот такая запись if CLK ' event, почему нельзя записать типа CLK=event, или этот одиночный апостроф и имеет значения "=" в данном случае. 3. CLK = '1', почему значение сигнала, логическая еденица, взята в двойные апострофы, это такой синтаксис, все логические значения должны быть в апострофах. 4. Что такое значение вектора (если для меня это еще слишком рано, можете не отвечать). Заранее Благодарю. -
VHDL в QUARTUS для очень начинающего
_Ie0nid ответил _Ie0nid тема в Программирование
УРА!!! ЗАРРАБОТАЛО!! Большое спасибо. А можете мне сказать, что эти кавычки вообще означают, почему там одна, а там две? в книжке этого нет. -
VHDL в QUARTUS для очень начинающего
_Ie0nid ответил _Ie0nid тема в Программирование
Извините, но скобки не совсем помогли, осталось две ошибки, кто знает в чем дело? -
VHDL в QUARTUS для очень начинающего
_Ie0nid ответил _Ie0nid тема в Программирование
//Andrey_B //Имейте совесть и немного уважения к другим. Лично я не буду смотреть рисунок размером в 4 без малого мегабайта. Хорошо, давайте вот так: library IEEE; use IEEE.std_logic_1164.all; entity element001 is port(DATA,CLK: in std_logic; Q:out std_logic); end element001; architecture element001_ARCH of element001 is begin process (CLK) begin if CLK `event and CLK = `1` then Q<=DATA; end if; end process; end element001_ARCH; Error (10500): VHDL syntax error at element001.vhd(12) near text ` Error (10500): VHDL syntax error at element001.vhd(12) near text "`"; expecting "then" Error (10500): VHDL syntax error at element001.vhd(14) near text "if"; expecting "process" -
VHDL в QUARTUS для очень начинающего
_Ie0nid ответил _Ie0nid тема в Программирование
Здравствсуйте. Хорошо, давайте другой пример. 1. В прикрпеленном файле реализован пример простого D тригера из книжки, компилятор выдал ошибки можете сказать в чем дело? 2. На пальцах может кто ни будь объяснить что делает оператор EVENT? 3. В книжке описаны объявление типов. что означают std_logic и std_logic_vector Заранее благодарю. quartus_pict.bmp -
VHDL в QUARTUS для очень начинающего
_Ie0nid опубликовал тема в Программирование
Здравствуйте. Совсем отчаялся разобраться в этом языке. Сколько есть у меня книжек, все не дают достаточного понимания в программировании VHDL. Помогите пожалуйста разобраться на простых примерах. Например на AHDL можно составить элемент написав таблицу истинности, покажите как это сделать на VHDL. Желательно в quartus, чтобы не добавлять в мое незнание дополнительных переменных. Может у кого любимые книжки по этой теме, я буду только благодарен. Заранее спасибо. -
Здраствуйте. "Я уже писал - нет. Вы можете по известным точкам восстановить сигнал в точках выдачи и выдать с другой частотой дискретизации..." - Не смотря на то, что я решил все дать на лету. Прошу разъяснить все таки этот момент. Итак, я закидал в память значения сигнала полученные бог знает когда. Частота дискритезации мне известна, допустим она была 4456 Гц (предположим, на самом деле там другое число). Теперь, естсвенно, частота ШИМа у меня не совпадает, потому как АЦП это делала через 13 тактов, а Шим это делает через 512 и с другими коэффициентами деления. Даже если я буду вставлять задержки, частота ШИМ не будет совпадать с частотй дискритезации. И я естсветенно отклоняюсь от этого сигнала, и память начнет освобождаться медленеей (или быстрей), и вроде как, если представить это все на картинке, выборки будут растягиваться по времени одна от другой, а значит и частота сигнала вроде как на выходе будет уже другая. Я пдозреваю, что здесь решает все коэффициент заполнения, но как-то в голове с трудом вяжется этот физический процесс с возможностью апроксимировать сигнал в тот, что был раньше. Я понимаю, что вопрос почти без последующего практического примнение и все таки прошу подсказать в чем соль, что упускаю. Заранее спасибо.
-
здраствуйте 1. "При этом прерывания по переполнению должны следовать, понятно, с частотой дискретизации" - то есть, лучше всего ,как только я получил значение от АЦП, быстро преобразовать и сразу его ШИМИТЬ, чтобы частота дискретизация АЦП не отличалась от частоты преобразования ШИМ. 2. Я еще упустил как-то момент, имеет ли значение как быстро можно посчитать таймером ШИМА, можно ли это делать максимально быстро, или лучше поделить тактовую частоту таймера. Есть ли какие-то рекомендации у вас на этот счет. 3. И все-таки, если я заполнил когда-то ОЗУ данными, чтобы их восстановить я должен буду это делать ШИМОМ с точной такой же частотой дискретизации? А если частота дискритизации, с которой я их получил имеет довольно дробное значение. МОжно ли как ни будь от нее отклонится. Или есть возможность по другому реализовать эту проблему. Заранее спасибо. Прошу прощения если чего-то не понял
-
Добрый день. Использую ШИМ в качестве ЦАП, и в будущем, допустим RC фильтр. С помощью, также местного АЦП, выборками в 6.6 раз чаще частоты сигнала (допустим 1кГц) оцифровываю аналоговый сигнал, закидываю значение выборки в ОЗУ и тут же ШИМю. ВОпрос-Могу ли я быстро ШИМить данную выборку, потом отключать ШИМ и производить различные вычисления? У меня в таком случае будут получаться очень тонкие печки с длинными промежутками. Правильно ли это? И еще, есть ли возможность, выдрать из ОЗУ накопленные значения выборок взятых с частотой 6.6345 кГц и отправить их на ШИМ. Мне кажется я должен их выпленуть их точно с такой же частотой. Но мне также кажется что я ошибаюсь, потому как кооффициент заполнения, на котором все основано, не меняется. Пожалуста поясните этот момент. И еще, если есть какие-то принципиальные моменты для построения бюджетного ЦАП на ШИМ, пожалуйста поделитесь. Заранее спасибо.
-
Цифровой Фильтр на ATmega
_Ie0nid ответил _Ie0nid тема в В помощь начинающему
РАЗОБРАЛСЯ, тут еще на работе мне паренек здорово подсказал, так что большое спасибо всем за помощь. -
Цифровой Фильтр на ATmega
_Ie0nid ответил _Ie0nid тема в В помощь начинающему
здраствуйте, простите за то что долго не было, и за глупые вопросы. Вы привели формулу, которую я пытался понять с помощью каких то физических принципов, в результате натыкался на точно такие же формулы. Первое: мне объясняли принцип действия цифрового фильтра и она заключается в следующем. Допустим первая выборка равна 8, вторая 8, затем третья равная 10, четвертая равная 8, и пятая снова 8. Если на третью приходилась высокочастотная составляющая, и мы ее в соответствующем такте уменьшаем с соответствующим коэффициентом усиления (например отрицательным), то поучается ФНЧ. Если я не прав то поправьте пожалуйста, потому как:, второе: судя по рисункам которые приводятся в книгах, и по формуле которую привел SASAVITEBSK (за что огромное спасибо, навила хоть на мысли), Y(i) = X(i) + 0.875Y(i-1) - X(i-1), каждая последующая выборка еще раз преобразуется по следующему закону, а затем еще раз по следующему, а затем складывается с текущими. И это кажется странным, потому как если высокачстотная составляющая была большой, она так самой большой и пройдет, если не прав прошу поправить потому как:, третье: Я примерно прикинул формулу на бумажке, она действительно убирает постоянную составляющую, если сигнал постоянный, каждая последующая выборка на выходе будет стремится к нулю. Крутизна фильтра я так понимаю определяется количеством членов формулы (полинома?). А вот коэффициент ослабления? И потом как синтезировать такую формулу исходя из нужного фильтра. Например ФНЧ, или ФВЧ. И наконец, четвертое. В схемах фильтра нарисован сумматор, можете объяснить его физический смысл. Если мы складываем два аналоговых сигнала с разными частотами (например две палки спектра), мы получаем сигнал с этими двумя палками. Если мы складываем выборки в разные такты мы получаем просто число. Или же весь смысл этого сумматора (и вообще всех кубиков в структуре фильтра) в том, чтобы подобрать такую формулу, чтобы она выполняла нужную для нас манипуляцию с выборками (то есть нужную АЧХ). Заранее спасибо. -
Цифровой Фильтр на ATmega
_Ie0nid опубликовал тема в В помощь начинающему
Добрый день, давно не заходил с проблемами. КТо может помочь куском кода к цифровому фильтру для Codevision. Даже с чего начать не знаю, куда не сунусь везде только формулы да теория. Хочу попробовать отфильтровать сигнал снятый с ацп Atmegи, и преобразовать на выход с помощью ШИМ и RC цепи -
TWI-atmega16 (практическая реализация)
_Ie0nid ответил _Ie0nid тема в В помощь начинающему
Все, сам разобрался. Оказывается, в программе есть возможность выполнение стартового бита еще раз. И к тому же я не сбрасывал биты регистра TwcR, которые отвечают за старт. -
TWI-atmega16 (практическая реализация)
_Ie0nid опубликовал тема в В помощь начинающему
Здраствуйте, от вопросов с битами, перешел к практической реализации, в результате получил программу, котора работает всего на половину. Ведомый принимает адресс, ведущий, сигнализирует двойкой в порту Б, типа подтверждение принято и начинаю передачу данных. Но, данные почему-то не принимаются. В порт ведомого выдается значение принятого адресса. Где я ошибся. По графику на осциле, получается стартовый бит, адрессный пакет, в виде 1010101, бит 0 - типа запись, бит 0 - подтверждение - и все, дальше ни чего не происходит. Подскажите, что не так, вот примерные листинги программы на CODEVISION. /*ведущий передатчик без ошибок*/ #include <mega16.h> #include <delay.h> int reg_stat, address, data; //все прерывания обзываются на самом верху, после дефайна не поймет #define int_off (TWCR |= (1<<7));// выход из прерывания #define int_on (TWCR |= (0<<7)); //вход в прерывания /*разрешаем работу прерывания, сбрасываем флаг, формируем старт*/ #define start_bit (TWCR |= (1<<7)|(1<<5)|(0<<4)|(1<<2)|(1<<0)); #define start_slaw (TWCR |= (1<<7)|(1<<2)); //передача данных или адреса #define stop_bit (TWCR |= (1<<7)|(1<<4)|(1<<2)); //стоп /*инициируем, отключаем прерывания, причем записью 0, старты и стопы разрешаем только работу модуля*/ #define twi_init (TWCR |= (0<<7)|(0<<6)|(0<<5)|(0<<4)|(0<<3)|(1<<2)|(0<<0)) master_transe() { twi_init ; address = 0xAA; data = 0x1; start_bit; /*twi_init ; start_bit; TWDR = 0x55; start_slaw; //если убрать цикл, то он всегда будет передавать пакет, и постояно менять состояние порта, //то есть заходитть в прерывание с каждым удачной передачей /*twi_init ; start_bit; такой кусок программы уже работает и дает, импульс*/ } interrupt [18] void twi_rasrul(void) { reg_stat = TWSR; switch (reg_stat) { /*по этому коду был сформирован старт, передаем адресс, вышли все удачно, срабатывает прерывание, переход*/ case 0x08: TWDR = address; PORTB =1; start_slaw; break; /*по этому коду, удачно был передан адресс и получено подтверждение, то есть ведомый удерживает низкий уровень, свободен*/ case 0x18: TWDR = data; #asm("nop"); start_slaw; PORTB = 2; break; case 0x28: #asm("nop"); PORTB =4; stop_bit ; break; } } void main() //так начинается тело в кодевизион { DDRB = 0xff; DDRA = 0x00; // вход PORTA = 0xff; //поддтягивающие #asm("sei");// разрешаем глобальное прерывание //разрешение прерывания TWBR = 0xff; /*TWSR = 0 с четвертого разряда начинается коды статуса. скорей всего относительно их идет распределение разрядов. А первые три это степень в скорости чем больше число, тем меньше скорость. пока не трогаю. */ while(1) { if (PINA.0 == 1) { master_transe(); delay_ms(1000000000000); while (PINA.0 == 1); /*это чтобы не выходило из кнопки, пока не перекликну*/ } } } /*ведомый приемник*/ #include <mega16.h> #include <delay.h> int reg_stat, address, data; //все прерывания обзываются на самом верху, после дефайна не поймет #define init_off (TWCR |= (1<<7)|(1<<6));// выход из прерывания #define init_on (TWCR |= (0<<7)); //вход в прерывания #define start_bit (TWCR |= (1<<7)|(1<<5)|(1<<2)); /*устанавливаем флаг для сброса прерывания. сформировываем состояние старт разрешаем рабобту модуля ТВИ*/ #define start_slaw (TWCR |= (1<<7)|(1<<2)|(1<<0)); //передача данных или адреса #define stop_bit (TWCR |= (1<<7)|(1<<4)|(1<<2)); //стоп #define receiver_init (TWCR |= (1<<7)|(1<<6)|(0<<4)|(1<<2)|(1<<0)); interrupt [18] void twi_rasrul(void) { reg_stat = TWSR; switch (reg_stat) { case 0x60: #asm("nop"); #asm("nop"); #asm("nop"); PORTB = TWDR; break; } } void main() //так начинается тело в кодевизион { DDRB = 0xFF;//выход DDRA = 0x00; // вход PORTA = 0xff; //поддтягивающие #asm("sei");// разрешаем глобальное прерывание //разрешение работы модуля, разрешение выдачи бита подтверждения // разрешения прерывания //TWBR = 0xff; значение этих битов в режиме ведомого безразличны TWAR = 0xAA;//указание адреса устройства receiver_init; /*так как в адресном пакете он получит 0, то он автоматически перейдет в режим ведомого приемника*/ while(1); } От модератора. Используйте, пожалуйста, теги codebox для цитирования объемных исходных текстов!