МитяРа писал(а):А может поступить проще - собрать схему "..шарика", посмотреть осцилом, какая форма одного периода сигнала, а потом постараться то-же самое программно сформировать...
Вот эта идея мне нравится. Собрать эту схему не проблема. Вот только осцилла у меня нет. Может кто поможет с этим?
sachok писал(а):Шарик мне тоже нравится. Только посмотрите на схемы включения там кажись ошибка. эмиттер VT1 на + питания, а не на корпус. просто питание не правильно нарисовано от МК. Транзистор я думаю обязательно нужно ставить что бы МК остался цел.
Вот тут проблемка:( нет у меня МП25 (МП нету в общем) поставил КТ361 не заработало так что завтра переделаю и посмотрю что там, а то на ночь глядя осциллограф доставать не охота.
Извините. Проблемка у меня никак КТ не хотят работать. Не могу сейчас ничем помочь. Если кто то настроит схему на КТ тогда смогу посмотреть что там, сейчас имею очень мало времени.
Тут мне пришла в голову еще идея . Запихнуть в этот девайс еще и Камертон, устройство для настройки инструментов, выдающее идеальную ноту Ля частота которой составляет 440 Гц. Ну думаю это будет не сложно рализовать при помощи ШИМ'а.
Отличная тема! Вчера решил как раз мероном собрать... Вот только в контроллерах не разбираюсь.
Я думаю, что нужны не только кнопки +/-1 bpm, но и +/- 10! т.к. иначе слишком долго и нудно переключать будет. Или кнопку сделать, переключающую "цену" нажатия кнопок "+" и "-" на 1, 10 и 50. Еще было бы здорово, если бы метроном пикал на каждый пятый клик (Обозначает первую долю в такте в размере 4/4)
А если возможно сделать не только на пятый ( а на 2, 3,... 12)... То вообще здорово Но это сложная программа, наверное.
если использовать компилятор mikroC PRO for AVR то там есть библиотека sound с помощью которой можно вывести на любую ножку мк сигнал нужной частоты и длительности
InvisibleKid писал(а):Отличная тема! Вчера решил как раз мероном собрать... Вот только в контроллерах не разбираюсь.
Я думаю, что нужны не только кнопки +/-1 bpm, но и +/- 10! т.к. иначе слишком долго и нудно переключать будет. Или кнопку сделать, переключающую "цену" нажатия кнопок "+" и "-" на 1, 10 и 50. Еще было бы здорово, если бы метроном пикал на каждый пятый клик (Обозначает первую долю в такте в размере 4/4)
А если возможно сделать не только на пятый ( а на 2, 3,... 12)... То вообще здорово Но это сложная программа, наверное.
Все будет не пережевывайте Осталось совсем чуток... На счет долей знаю, Муз образование есть
DIM4 писал(а):если использовать компилятор mikroC PRO for AVR то там есть библиотека sound с помощью которой можно вывести на любую ножку мк сигнал нужной частоты и длительности
VenomXP писал(а):В схема с выхода порта через ограничивающее сопротивление можно сразу выводить либо на наушники либо подклбчать к усилителю. Что скажете?
А просто короткий прямоугольный импульс не подходит разьве? Это ведь и есть щелчек по сути. Кроме того что ты с тиками разбираешься когда у тебя сама основная функция не очень работает? Ты же задаешь период частоты в то время как реально нужно саму частоту, в результате имея всего 256 значений периода ты врятле можешь точно отсчитать нужную частоту, будет погрешность. В принципе можешь просто переделать свой код немного изменив прерывание и условие тика вот так :
interrupt [TIM0_OVF] void timer0_ovf_isr(void) // Считаем длительности каждого тика. Читаем состояние кнопок и выводим значение n на индикатор
{
TCNT0 = 225;
count+=freq;
read_but();
Send();
}
В этом случае ты сможешь напрямую задавать частоту с помощью переменной Freq, а шаг изменения частоты будет фиксированый и равен Ftimer/32000 а генерируемая частота в таком случае будет F=Ftimer*Freq/32000. Советую выбрать частоту таймера и число вместо 32000 чтобы шаг попадал в нужную тебе сетку, тоесть 1 bpm =1/60 Hz ~ 0,016666(6).
Neekeetos писал(а):В этом случае ты сможешь напрямую задавать частоту с помощью переменной Freq, а шаг изменения частоты будет фиксированый и равен Ftimer/32000 а генерируемая частота в таком случае будет F=Ftimer*Freq/32000. Советую выбрать частоту таймера и число вместо 32000 чтобы шаг попадал в нужную тебе сетку, тоесть 1 bpm =1/60 Hz ~ 0,016666(6).
Не очень понял, можно наглядный пример в виде кода?
Neekeetos писал(а):В этом случае ты сможешь напрямую задавать частоту с помощью переменной Freq, а шаг изменения частоты будет фиксированый и равен Ftimer/32000 а генерируемая частота в таком случае будет F=Ftimer*Freq/32000. Советую выбрать частоту таймера и число вместо 32000 чтобы шаг попадал в нужную тебе сетку, тоесть 1 bpm =1/60 Hz ~ 0,016666(6).
Не очень понял, можно наглядный пример в виде кода?
Так ведь я в предыдущем посте нарисовал что требуется заменить, все остальное тоже самое. Заместо переменной n частота будет задаваться в моем примере переменной freq которую надо будет гдето объявить и записать в нее значение требуемой частоты.
Neekeetos писал(а):В этом случае ты сможешь напрямую задавать частоту с помощью переменной Freq, а шаг изменения частоты будет фиксированый и равен Ftimer/32000 а генерируемая частота в таком случае будет F=Ftimer*Freq/32000. Советую выбрать частоту таймера и число вместо 32000 чтобы шаг попадал в нужную тебе сетку, тоесть 1 bpm =1/60 Hz ~ 0,016666(6).
То есть в freq будет содержатся число сообщающее количество ударов в минуту, ну или количество bpm, так?
Еще вопрос что за Ftimer и откуда появилось значение 32000?
Советую выбрать частоту таймера и число вместо 32000 чтобы шаг попадал в нужную тебе сетку, то есть 1 bpm =1/60 Hz ~ 0,016666(6).[
Вот вы этой фразе ниче не понял, может вы какое то слово забыли или знак препинания, что нужно выбрать, вместо чего и причем здесь число 32000?
Neekeetos писал(а):В этом случае ты сможешь напрямую задавать частоту с помощью переменной Freq, а шаг изменения частоты будет фиксированый и равен Ftimer/32000 а генерируемая частота в таком случае будет F=Ftimer*Freq/32000. Советую выбрать частоту таймера и число вместо 32000 чтобы шаг попадал в нужную тебе сетку, тоесть 1 bpm =1/60 Hz ~ 0,016666(6).
То есть в freq будет содержатся число сообщающее количество ударов в минуту, ну или количество bpm, так?
если сделаешь шаг равным 1bpm то во freq будет частота в bpm
VenomXP писал(а):
Еще вопрос что за Ftimer и откуда появилось значение 32000?
Советую выбрать частоту таймера и число вместо 32000 чтобы шаг попадал в нужную тебе сетку, то есть 1 bpm =1/60 Hz ~ 0,016666(6).[
Вот вы этой фразе ниче не понял, может вы какое то слово забыли или знак препинания, что нужно выбрать, вместо чего и причем здесь число 32000?
Число задает порог переполнения переменной count. Частота ее переполнений и есть выходная частота которую ты хочешь получить.
Повторяться не буду, опишу вкратце как все рассчитать. Назовем число 32000 словом ЧИСЛО. Физическую частоту прерываний таймера - ЧАСТОТА_ТАЙМЕРА (тупой пример- если у тебя кварц на 4М и делитель перед таймером на 2, а сам таймер 8 битный и считает до 256 то она будет равна 7812,5Гц ). Частота которую ты хочеш получить на выходе - ЧАСТОТА , переменная freq ее задает из программы. Далее формула из предыдущих постов будет выглядеть так :
ЧАСТОТА = ЧАСТОТА_ТАЙМЕРА*freq/ЧИСЛО
к примеру ты хочешь чтобы freq задавало частоту с точностью до 1bpm, это 0,016666Гц, таймер возьмем тот что в примере выше - у которого прерывания идут с частотой 7812,5Гц, ищем число, такое чтобы был шаг 1bpm:
0,016666Гц = 7812,5Гц * 1( freq=1 те 1bpm)/ЧИСЛО
ЧИСЛО= 7812,5/0,0166666 = 468750 , число как видно не влезает в тип int, у которого до 65535 только /для беззнакового/, меняем делитель таймера, чтобы частота прерываний была еще в 16 раз меньше, тоесть прескалер делается не 2 а 32, тогда ЧАСТОТА_ТАЙМЕРА = 488,28125Гц
ЧИСЛО = 488,28125 / 0,01666666 = 29296,875, округляя - 29297
из за округления отклонение от заданного bpm будет 0,000427% в меньшую сторону.
Что то я пробовал все это посчитать для Часового кварца 32768 Гц, ничего у меня не выходит, может чего то не понимаю, помогите, как будут выглядеть расчеты для него?
VenomXP писал(а):Что то я пробовал все это посчитать для Часового кварца 32768 Гц, ничего у меня не выходит, может чего то не понимаю, помогите, как будут выглядеть расчеты для него?
Если таймер тактируется без делителя от часов МК которые 32768Гц и он 8 битный, то его прерывания будут с частотой 32768/256= 128Гц , далее
ЧИСЛО= 128Гц/(0,0166666666666)= 7680. Погрешность установки при этом равна нулю.
Вот посидел надо кодом, получилось вот так, Neekeetos и все кто может проверьте плиз правильность, пока что вместо тика просто включаем/гасим светодиод.
VenomXP писал(а):Вот посидел надо кодом, получилось вот так, Neekeetos и все кто может проверьте плиз правильность, пока что вместо тика просто включаем/гасим светодиод.
Все вроде бы должно работать, но есть пару замечаний. У тебя основной цикл в программе так построен что вывод бипа следует за проверкой кнопок и функцией Convert в цикле. соответственно будет приличная задержка между временем когда его нужно выводить по таймеру и когда он реально выводится, и эта разница во времени не постоянна а зависит от числа которое преобразуется. Могу посоветовать сделать выполнение Convert только в том случае если нажата кнопка, тогда косяк будет только если кнопки жмакать. Кстати как светодиод то, моргает правильно?