Перейти к содержанию
    

_Ie0nid

Участник*
  • Постов

    29
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о _Ie0nid

  • Звание
    Участник
    Участник

Посетители профиля

801 просмотр профиля
  1. За книжку большое спаисибо. Хотя, надо признаться, у меня книжек такого плана уже целый килограмм. Вопрос по теме. Есть пример в котором есть такая запись S = "01", ну и другие условия S = "10", и так далее. КТо сможет подсказать, как такой элемент должен выглядеть в квартусе. Это два вывода S1 и S2, или как то по другому. Заранее благодарю.
  2. Извините за низкий интелект, теперь я окончательно запутался. 1. Вот это апостроф - `, или вот это тоже апостроф - '. 2. Вот такая запись if CLK ' event, почему нельзя записать типа CLK=event, или этот одиночный апостроф и имеет значения "=" в данном случае. 3. CLK = '1', почему значение сигнала, логическая еденица, взята в двойные апострофы, это такой синтаксис, все логические значения должны быть в апострофах. 4. Что такое значение вектора (если для меня это еще слишком рано, можете не отвечать). Заранее Благодарю.
  3. УРА!!! ЗАРРАБОТАЛО!! Большое спасибо. А можете мне сказать, что эти кавычки вообще означают, почему там одна, а там две? в книжке этого нет.
  4. Извините, но скобки не совсем помогли, осталось две ошибки, кто знает в чем дело?
  5. //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"
  6. Здравствсуйте. Хорошо, давайте другой пример. 1. В прикрпеленном файле реализован пример простого D тригера из книжки, компилятор выдал ошибки можете сказать в чем дело? 2. На пальцах может кто ни будь объяснить что делает оператор EVENT? 3. В книжке описаны объявление типов. что означают std_logic и std_logic_vector Заранее благодарю. quartus_pict.bmp
  7. Здравствуйте. Совсем отчаялся разобраться в этом языке. Сколько есть у меня книжек, все не дают достаточного понимания в программировании VHDL. Помогите пожалуйста разобраться на простых примерах. Например на AHDL можно составить элемент написав таблицу истинности, покажите как это сделать на VHDL. Желательно в quartus, чтобы не добавлять в мое незнание дополнительных переменных. Может у кого любимые книжки по этой теме, я буду только благодарен. Заранее спасибо.
  8. ЦАП на ШИМ Atmega

    Здраствуйте. "Я уже писал - нет. Вы можете по известным точкам восстановить сигнал в точках выдачи и выдать с другой частотой дискретизации..." - Не смотря на то, что я решил все дать на лету. Прошу разъяснить все таки этот момент. Итак, я закидал в память значения сигнала полученные бог знает когда. Частота дискритезации мне известна, допустим она была 4456 Гц (предположим, на самом деле там другое число). Теперь, естсвенно, частота ШИМа у меня не совпадает, потому как АЦП это делала через 13 тактов, а Шим это делает через 512 и с другими коэффициентами деления. Даже если я буду вставлять задержки, частота ШИМ не будет совпадать с частотй дискритезации. И я естсветенно отклоняюсь от этого сигнала, и память начнет освобождаться медленеей (или быстрей), и вроде как, если представить это все на картинке, выборки будут растягиваться по времени одна от другой, а значит и частота сигнала вроде как на выходе будет уже другая. Я пдозреваю, что здесь решает все коэффициент заполнения, но как-то в голове с трудом вяжется этот физический процесс с возможностью апроксимировать сигнал в тот, что был раньше. Я понимаю, что вопрос почти без последующего практического примнение и все таки прошу подсказать в чем соль, что упускаю. Заранее спасибо.
  9. ЦАП на ШИМ Atmega

    здраствуйте 1. "При этом прерывания по переполнению должны следовать, понятно, с частотой дискретизации" - то есть, лучше всего ,как только я получил значение от АЦП, быстро преобразовать и сразу его ШИМИТЬ, чтобы частота дискретизация АЦП не отличалась от частоты преобразования ШИМ. 2. Я еще упустил как-то момент, имеет ли значение как быстро можно посчитать таймером ШИМА, можно ли это делать максимально быстро, или лучше поделить тактовую частоту таймера. Есть ли какие-то рекомендации у вас на этот счет. 3. И все-таки, если я заполнил когда-то ОЗУ данными, чтобы их восстановить я должен буду это делать ШИМОМ с точной такой же частотой дискретизации? А если частота дискритизации, с которой я их получил имеет довольно дробное значение. МОжно ли как ни будь от нее отклонится. Или есть возможность по другому реализовать эту проблему. Заранее спасибо. Прошу прощения если чего-то не понял
  10. ЦАП на ШИМ Atmega

    Добрый день. Использую ШИМ в качестве ЦАП, и в будущем, допустим RC фильтр. С помощью, также местного АЦП, выборками в 6.6 раз чаще частоты сигнала (допустим 1кГц) оцифровываю аналоговый сигнал, закидываю значение выборки в ОЗУ и тут же ШИМю. ВОпрос-Могу ли я быстро ШИМить данную выборку, потом отключать ШИМ и производить различные вычисления? У меня в таком случае будут получаться очень тонкие печки с длинными промежутками. Правильно ли это? И еще, есть ли возможность, выдрать из ОЗУ накопленные значения выборок взятых с частотой 6.6345 кГц и отправить их на ШИМ. Мне кажется я должен их выпленуть их точно с такой же частотой. Но мне также кажется что я ошибаюсь, потому как кооффициент заполнения, на котором все основано, не меняется. Пожалуста поясните этот момент. И еще, если есть какие-то принципиальные моменты для построения бюджетного ЦАП на ШИМ, пожалуйста поделитесь. Заранее спасибо.
  11. РАЗОБРАЛСЯ, тут еще на работе мне паренек здорово подсказал, так что большое спасибо всем за помощь.
  12. здраствуйте, простите за то что долго не было, и за глупые вопросы. Вы привели формулу, которую я пытался понять с помощью каких то физических принципов, в результате натыкался на точно такие же формулы. Первое: мне объясняли принцип действия цифрового фильтра и она заключается в следующем. Допустим первая выборка равна 8, вторая 8, затем третья равная 10, четвертая равная 8, и пятая снова 8. Если на третью приходилась высокочастотная составляющая, и мы ее в соответствующем такте уменьшаем с соответствующим коэффициентом усиления (например отрицательным), то поучается ФНЧ. Если я не прав то поправьте пожалуйста, потому как:, второе: судя по рисункам которые приводятся в книгах, и по формуле которую привел SASAVITEBSK (за что огромное спасибо, навила хоть на мысли), Y(i) = X(i) + 0.875Y(i-1) - X(i-1), каждая последующая выборка еще раз преобразуется по следующему закону, а затем еще раз по следующему, а затем складывается с текущими. И это кажется странным, потому как если высокачстотная составляющая была большой, она так самой большой и пройдет, если не прав прошу поправить потому как:, третье: Я примерно прикинул формулу на бумажке, она действительно убирает постоянную составляющую, если сигнал постоянный, каждая последующая выборка на выходе будет стремится к нулю. Крутизна фильтра я так понимаю определяется количеством членов формулы (полинома?). А вот коэффициент ослабления? И потом как синтезировать такую формулу исходя из нужного фильтра. Например ФНЧ, или ФВЧ. И наконец, четвертое. В схемах фильтра нарисован сумматор, можете объяснить его физический смысл. Если мы складываем два аналоговых сигнала с разными частотами (например две палки спектра), мы получаем сигнал с этими двумя палками. Если мы складываем выборки в разные такты мы получаем просто число. Или же весь смысл этого сумматора (и вообще всех кубиков в структуре фильтра) в том, чтобы подобрать такую формулу, чтобы она выполняла нужную для нас манипуляцию с выборками (то есть нужную АЧХ). Заранее спасибо.
  13. Добрый день, давно не заходил с проблемами. КТо может помочь куском кода к цифровому фильтру для Codevision. Даже с чего начать не знаю, куда не сунусь везде только формулы да теория. Хочу попробовать отфильтровать сигнал снятый с ацп Atmegи, и преобразовать на выход с помощью ШИМ и RC цепи
  14. Все, сам разобрался. Оказывается, в программе есть возможность выполнение стартового бита еще раз. И к тому же я не сбрасывал биты регистра TwcR, которые отвечают за старт.
  15. Здраствуйте, от вопросов с битами, перешел к практической реализации, в результате получил программу, котора работает всего на половину. Ведомый принимает адресс, ведущий, сигнализирует двойкой в порту Б, типа подтверждение принято и начинаю передачу данных. Но, данные почему-то не принимаются. В порт ведомого выдается значение принятого адресса. Где я ошибся. По графику на осциле, получается стартовый бит, адрессный пакет, в виде 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 для цитирования объемных исходных текстов!
×
×
  • Создать...