ATtiny2313 => Metronom
- Neekeetos
- Держит паяльник хвостом
- Сообщения: 993
- Зарегистрирован: Пн сен 18, 2006 11:16:05
- Откуда: Тула
- Контактная информация:
VenomXP писал(а):Ога понял, еще на железе не тестил, пока примерный код, а как можно ВООБЩЕ избежать этой задержки?
Ну вообще то не все так страшно, если ты сделаешь чтобы тот кусок кода с кнопками и конвертором выполнялся основную массу времени меньше чем 100 тактов то все вполне должно работать и так, кроме того эти временные сдвиги они не накапливаются, тоесть речь идет не о самом такте который обрабатывается таймером и соотв. частота не поменяется, а просто время начала бипа будет гулять на +- половину времени одного основного цикла программы. Чтобы совсем избежать зависимости от кода в мэйне просто перенеси код
Код: Выделить всё
if (START == 1)
{
if (count > 7680)
{
count -= 7680;
beep();
}
}
внутрь таймерного прерывания а бип сделай таким чтобы он длился меньше чем 256 тактов процессора (а реально лучше чтобы он был не больше половины этого числа, а то будут проблемы с прерываниями). Понятно что бип придется как то распределить между таймерными прерываниями, тк он явно длиннее, можно сделать так например:
Код: Выделить всё
if (START == 1)
{
if (count > 7680)
{
count -= 7680;
beep_timer=100;
}
if(beep_timer>0)
{
beep_timer--;
beep_100();// эта функция работает не более 100 тактов,
//выводит к примеру несколько периодов тона которым делается бип
}
}
Получится всего бип длится в примере 100/128Гц(эт частота таймера) = 0,78 секунды и начинается ровно в тот момент когда нужно.
- VenomXP
- Грызет канифоль
- Сообщения: 293
- Зарегистрирован: Пн дек 24, 2007 07:09:09
- Контактная информация:
0.78 секунды это слишком много, допустим при 155 bpm этот тик уже будет сплошным, надо ~0.075 сек, вот еще подправил код, сделал под CodeVisionAVR, проверьте. Я там намудрил с кнопками, незнаю как точно, но примерно так.
- Вложения
-
- tinyMetroCV.c
- (4.09 КБ) 316 скачиваний
Даташит - библия моя...


- Neekeetos
- Держит паяльник хвостом
- Сообщения: 993
- Зарегистрирован: Пн сен 18, 2006 11:16:05
- Откуда: Тула
- Контактная информация:
VenomXP писал(а):0.78 секунды это слишком много, допустим при 155 bpm этот тик уже будет сплошным, надо ~0.075 сек, вот еще подправил код, сделал под CodeVisionAVR, проверьте. Я там намудрил с кнопками, незнаю как точно, но примерно так.
Вроде нормально. Из функции Send задержки убери, они там все равно не нужны тк ты один разряд отображаешь на протяжении целого таймерного прерывания, так что чем быстрее этот разряд засветится тем лучше.
- VenomXP
- Грызет канифоль
- Сообщения: 293
- Зарегистрирован: Пн дек 24, 2007 07:09:09
- Контактная информация:
А с кнопками как, все нормально? Я до конца не вкурил как, они у меня на землю замыкаются, я правильно сделал? Да и еще у меня нормально выставлены эти параметры?Neekeetos писал(а):Вроде нормально. Из функции Send задержки убери, они там все равно не нужны тк ты один разряд отображаешь на протяжении целого таймерного прерывания, так что чем быстрее этот разряд засветится тем лучше.
Код: Выделить всё
TCCR0A = 0;
TCCR0B = 0x04;
TCNT0 = 255;Даташит - библия моя...


- Neekeetos
- Держит паяльник хвостом
- Сообщения: 993
- Зарегистрирован: Пн сен 18, 2006 11:16:05
- Откуда: Тула
- Контактная информация:
VenomXP писал(а):А с кнопками как, все нормально? Я до конца не вкурил как, они у меня на землю замыкаются, я правильно сделал? Да и еще у меня нормально выставлены эти параметры?Код: Выделить всё
TCCR0A = 0;
TCCR0B = 0x04;
TCNT0 = 255;
А то я чет когда считал не так сделал, наглаз поставил
Трудно сказать, я же не знаю какой режим таймера ты выбрал для себя, судя по цифрам они в значительной степени от балды, попробуй указывать побитно настройки таймера по аналогии с этим например
Код: Выделить всё
ADMUX = _BV(REFS1) | _BV(REFS0)|1;
ADCSRA = _BV(ADEN) | _BV(ADATE) | _BV(ADPS2); // /16
ADCSRB = _BV(ADTS2) | _BV(ADTS0);
Кстати программа то уже просится в железо а ты занимаешься буквоедством. ИМХО все там должно работать уже сейчас.
ß òîæå ðåøàë ýòó ïðîáëåìó, íî íà PICå.
Òîëüêî äåëàëàëîñü ýòî íå íà ïðåðûâàíèÿõ, à âíóòðè îñíîâíîé ïðîãðàììû.
Èìååòñÿ 5 êíîïîê óïðàâëåíèÿ. 2 ïåðåáèðàþò òåìï, 1 ïåðåáèðàåò ñòàíäàðòíûé òåìï ñ èíäèêàöèåé íà 2 ñòðî÷íûé ÆÊÈ. åùå îäíà êíîïêà ïåðåêëþ÷àåò òèõóþ äîëþ 3/4, 4/4... è åùå îäíà ïåðåêëþ÷àåò x/4, x/8, x/16.
Ðàñ÷åò ïàóçû èäåò ñëåäóþùèì îáðàçîì:
Ââîäèòñÿ òåìï, ïîñëå ÷åãî äåëþ 60 íà çàäàííûé òåìï, ïîëó÷àþ îòâåò â âèäå 4-õ çíà÷íîãî ÷èñëà (íàïðèìåð 60/128= 0166)
Ïîñëå ÷åãî âûïîëíÿþ öèêëû 0,1 ñåê 0,01 ñåê 0,001 ñåê è 0,0001 ñåê ñòîëüêî ðàç, êàêîå ÷èñëî â îòâåòå.  ðåçóëüòàòå ïîëó÷àþ ïàóçó ñ âûñîêîé òî÷íîñòüþ. Ïðîâåðêà íàæàòèÿ êíîïêè ñòîèò âíóòðè ïåðâîãî öèêëà 0,1 ñåê, ýòè ñòðî÷êè ó÷òåíû â ðàñ÷åòå öèêëà, ïîýòîìó ïîãðåøíîñòü îíè íå âíîñÿò.
Îñòàëàñü ïðîáëåìà èìåííî îçâó÷êè. Ãåíåðàòîð òèê-òàê õî÷ó ñäåëàòü íà âòîðîì ìàëåíüêîì ïèêå, íî òîëüêî íå çíàþ êàèì äîëæåí áûòü ñèãíàë. Åñòü ëè ó êîãî êàêèå ñîîáðàæåíèÿ ïî ýòîìó ïîâîäó, êàêàÿ ÷àñòîòà è êàê îíà ìåíÿåòñÿ âî âðåìåíè, äëÿ ïîëó÷åíèÿ çâóêà ÒÈÊ è çâóêà ÒÀÊ?
Òîëüêî äåëàëàëîñü ýòî íå íà ïðåðûâàíèÿõ, à âíóòðè îñíîâíîé ïðîãðàììû.
Èìååòñÿ 5 êíîïîê óïðàâëåíèÿ. 2 ïåðåáèðàþò òåìï, 1 ïåðåáèðàåò ñòàíäàðòíûé òåìï ñ èíäèêàöèåé íà 2 ñòðî÷íûé ÆÊÈ. åùå îäíà êíîïêà ïåðåêëþ÷àåò òèõóþ äîëþ 3/4, 4/4... è åùå îäíà ïåðåêëþ÷àåò x/4, x/8, x/16.
Ðàñ÷åò ïàóçû èäåò ñëåäóþùèì îáðàçîì:
Ââîäèòñÿ òåìï, ïîñëå ÷åãî äåëþ 60 íà çàäàííûé òåìï, ïîëó÷àþ îòâåò â âèäå 4-õ çíà÷íîãî ÷èñëà (íàïðèìåð 60/128= 0166)
Ïîñëå ÷åãî âûïîëíÿþ öèêëû 0,1 ñåê 0,01 ñåê 0,001 ñåê è 0,0001 ñåê ñòîëüêî ðàç, êàêîå ÷èñëî â îòâåòå.  ðåçóëüòàòå ïîëó÷àþ ïàóçó ñ âûñîêîé òî÷íîñòüþ. Ïðîâåðêà íàæàòèÿ êíîïêè ñòîèò âíóòðè ïåðâîãî öèêëà 0,1 ñåê, ýòè ñòðî÷êè ó÷òåíû â ðàñ÷åòå öèêëà, ïîýòîìó ïîãðåøíîñòü îíè íå âíîñÿò.
Îñòàëàñü ïðîáëåìà èìåííî îçâó÷êè. Ãåíåðàòîð òèê-òàê õî÷ó ñäåëàòü íà âòîðîì ìàëåíüêîì ïèêå, íî òîëüêî íå çíàþ êàèì äîëæåí áûòü ñèãíàë. Åñòü ëè ó êîãî êàêèå ñîîáðàæåíèÿ ïî ýòîìó ïîâîäó, êàêàÿ ÷àñòîòà è êàê îíà ìåíÿåòñÿ âî âðåìåíè, äëÿ ïîëó÷åíèÿ çâóêà ÒÈÊ è çâóêà ÒÀÊ?