и в чем заключалась моя невнимательность, которая послужила причиной удаления исходника?
я самоучка в программировании, у меня тоже нет специального образования.
neid писал(а):ранее писал же это коэффициент для бегущее среднее
ну писал, и что из этого? если он нигде в вычислениях не участвует в явном виде, то он не нужен.
neid писал(а):за этим, тоже обсуждали if(OCR1B>0 && OCR1B<PWR)
ну обсуждали, и что из этого? если PWR - постоянная величина, которую можно вычислить один раз, то не нужно вычислять ее бессчетное число раз в прерывании
neid писал(а):пока мне так удобней
если удобнее, ну и ладно.
я пишу только на ассемблере, поэтому на Си пример тебе сделать не могу.
хотя я тебе описал словами очень подробно, что нужно сделать. а тебе остается добавить прерывание по переполнению и объявить флаг наступления этого прерывания.
если уж ты сумел так написать свою первую программу, то добавить в нее еще чуточку не должно составлять проблему.
Добавлено after 8 hours 39 minutes 12 seconds:
вот, попробовал изложить на Си то, что я предлагал сделать:
Код: Выделить всё
// тут все твои ранее сделанные объявления
// объявляем переменную-флаг
byte overflow_yes = 0;
// добавляем прерывание по переполнению
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
overflow_yes = 0;
}
// тут все твои ранее орисанные функции
void main(void)
{
// тут все твоя ранее сделанная инициальзация
// настройки таймера несколько изменяем
// чтобы прерывания не наступили сразу же после запуска таймера, сначала устанавливаем все регистры
// и только потом настраиваем режим и делаем пуск таймера
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x1F; // 1F3F(7999) - 1кГц - 1.0000 ms
OCR1AL=0x3F;
OCR1BH=0x00;
OCR1BL=0x00;
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (1<<COM1B0) | (1<<WGM11) | (1<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (1<<WGM13) | (1<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10);
TIMSK=(1<<OCIE1A) | (1<<TOIE1);
// и теперь разрешаем прерывания
sei;
while(1)
{
while (overflow_yes == 0) // пока прерывание не наступило,
; // "топчемся на месте" и ничего не делаем
overflow_yes = 0; // прерывание наступило - сбрасываем флаг
// тут всё ранее написанное "тело" цикла while(1)
}
}
поскольку я для МК на Си не пишу, мог что-нибудь неправильно написать. например, мог не правильно записать объявление переменной-флага overflow_yes.
мог не правильно записать и название прерывания по переполнению.
попутно еще замечу, что нет смысла задвигать биты, которые равны нулю.
достаточно задвинуть только те биты, которые равны единице.
вот так:
TCCR1A=(1<<COM1B1) | (1<<COM1B0) | (1<<WGM11) | (1<<WGM10);
TCCR1B=(1<<WGM13) | (1<<WGM12) | (1<<CS10);
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.