Прескалер в переводе с английского означает предделитель.
В прикладном программировании бывают аппаратные делители это которые есть или нет в каждом Мк по своему.
И еще есть программный делитель.
Это когда действие происходит не каждый раз при проходе подпрограммы, а только после обнуления какой то специальной переменной.
пример алгоритма деления на 5:
начало
если переменная равна нулю,
выполняем действие
загружаем в переменную число 5
если не равна нулю,
отнимаем из переменой 1
идем в начало.
Последний раз редактировалось vitalik_1984 Чт янв 31, 2013 19:59:18, всего редактировалось 1 раз.
Регистр TCCR0=0x01 - аппаратный прескалер 1:1, т.е. на тактовой частоте МК.
У ATmega8 нет регистра OCR0.
Протеус - ISIS Professional rev. 7.7 SP2 (сборка 9089)
codenamehawk писал(а):ИМХО можно не учитывать эти "11 тактов на вход плюс 1 такт на загрузку регистра TCNT0"
Прерывания и так происходят каждые 1/4000 сек , а дополнительные такты просто сместят сигнал немного правее, не меняя его ширины (длительности).
Позвольте с Вами не согласиться коллега, это справедливо только для Compare match, а тут мы вмешиваемся в счетчик TCNT0 и изменяем его? поэтому все критично.
dem66, Я ж конкретно показывал пример для таймера 0, потому, что так стоял вопрос, но если будешь использовать таймер 1, тогда все намного проще, используй не переполнение, а совпадение, тогда можно не вникать на время входа в прерывание, ну ниче, зато теперь будешь знать как работать с переполнением.
С таймером 1 так вообще шоколадно получится, с любой тактовой, потому, что у нас есть регистр ICR1.
В принципе с таймером 1 и без ICR1 нормально получится. C ICR1 скважность хорошо регулировать с заданным разрешение длины периода.
В общем так, тоже что и раньше но с таймером 1 и по совпадению, делаем частоту сигнала 2кГц на PORTB.0:
Для инициализации таймера:
OCR1A = 2500-1;
TCCR1B = (0b01<<WGM12)|(0b001<<CS10); режим таймера СТС, аппаратный прескалер 1:1
TIMSK = (1<<OCIE1A); Timer1 Compare Match A
В прерывании таймера просто меняем логическое состояние пина PORTB.0.
Последний раз редактировалось zero648 Пт фев 01, 2013 14:15:23, всего редактировалось 2 раза.
dem66 писал(а):Теперь скажите как реализовать два таймера?
У второго частота будет меньше, буквально до 1Khz, и он будет управлять этим таймером.
В чем заключается это управление, что будет меняться, частота, скважность, еще чтото?
Да, кстати, если сигнал снимать с PB1, а не с PB0, тогда обработчик прерывания можно удалть совсем, все будет работать аппаратно, надо только настроить выход РВ1 соответственно.
В данном случае нужно PB1 сделать выходом и режим выхода канала "переключать при совпадении":
TCCR1A = (0b01<<COM1A0); Toggle OC1A/OC1B on Compare Match
В качестве второго счетчика можно использовать второй канал таймера 1, настраивается аналогично, за исключением прескалера, его не трогаем иначе испортим первый канал.
OCR1B = 10000-1;
TIMSK |= (1<<OCIE1B); Timer1 Compare Match B
Частота расчитывается так, вернее значение регистра OCR1:
тактовая частота делим на нужную частоту и минус один.
10000000/1000-1=9999 ; 1 кГц для канала В
Для канала А нужно тактовую предварительно поделить пополам, т.к. полупериоды.
dem66 писал(а):Ок, все запустил, все четко. А как теперь мне для него частоту расчитывать?
Для переполнения я то уже понял как, а как тут?
Боже столько демогогий кодовых изза таймера меговского
Не тугодумте народ нафига вы юзаете OSC T1
Если тебе нужен асинхронный режим сигнала не проще ли задействова Т2 который тебе с одной строчки это все сделает???
А не городить куча хламокода под таймер которому это не пресуще???
Во-первых РВ2 на выход надо сделать:
DDRB |= (1 << PB2);
Во-вторых на выходе РВ2 не настроен режим:
TCCR1A |= (0b01<<COM1B0);
Если прерывания не используешь, то убери TIMSK, зачем его трогать.
dem66 писал(а):не понимаю Раньше говорили о том что б все генерить на одну лапу, теперь уже не две
Как бы объяснить то..., короче, аппаратно в меге так устроено, что канал А выведен на ногу РВ1, а канал В на ногу РВ2, значит, если нужно иметь разную частоту на одной ноге, тогда работайте только с одним каналом А или В.