Помогите с установкой таймера в atmega8. Нужно сделать задержку в 8мс. И после каждого переполнения вывести в порт некое значение и опять запустить таймер для следующего отсчета, после чего все повторяется аналогично. Вывод в порт и повторный запуск таймера делаю в прерывании. Имею: тактовая частота 4МГц, ставлю коэффициент деления тактовой частоты для таймера 256 (TCCR0=0x04) должен получить частоту на выходе делителя 15625Гц (период 64мкс), для этого периода в 8-ми милисекудах счетчик должен будет инкрементироваться 125 раз. Так как счетчик 8-ми битный - ставлю начальное значение == 3. В результате всего получаю интервал 16мс. Что я делаю не так? Вот часть кода:
char step[]={0b00000001,0b00000100,0b00000010,0b00001000,0b00000000}; //то, что будет выводиться в порт по кругу volatile int nstep=0;
Flint писал(а):для этого периода в 8-ми милисекудах счетчик должен будет инкрементироваться 125 раз. Так как счетчик 8-ми битный - ставлю начальное значение == 3. В результате всего получаю интервал 16мс. Что я делаю не так?
А откуда 125 раз то взялось? Вроде 8-битный счетчик, значит 2^8=256 у него состояний?
Да уж, это я ступил. Не пойму откуда я эти 128 только взял? Да, по поводу счета - я так потом сделал - сначала записать в счетчик новое значение, чтоб он там аппаратно начал считать, а потом уже программно сделать то, что мне надо. Так что задержек между двумя запусками создаваться не будет. Тоько вопрос один остался - как по хорошему сделать - нужно ли в обработчике каждый раз сбрасывать предделитель или нет? А сбросить его только один раз - при первом старте, в main().
Добавлено спустя 1 минуту 54 секунды: avr123.nm.ru, там то я и смотрел
Когда требуется получить заданную частоту всегда лучше использовать режим таймера CTC (обнулить таймер при достижении таймером значения OCRx). Тогда не придется думать ни о чем, сколько нопов использовать, когда куда чего записывать... и частота вызова прерывания будет абсолютно точной (с точностью до присутствия в теле основного цикла программы команд CLI и SEI) Т.е. это значительно проще.
Когда требуется получить заданную частоту всегда лучше использовать режим таймера CTC (обнулить таймер при достижении таймером значения OCRx). Тогда не придется думать ни о чем, сколько нопов использовать, когда куда чего записывать... и частота вызова прерывания будет абсолютно точной (с точностью до присутствия в теле основного цикла программы команд CLI и SEI)
avr123.nm.ru писал(а):Просто когда у человека появится новый вопрос он может не ждать пока кто-то ответит, а просто взять и прочитать.
Бывает такая инфа, про которую не знаешь что вообще такой метод есть, вот в этих случая справочники как раз не помогают, потому что туда тупо не полезешь.
=DeaD= писал(а):Бывает такая инфа, про которую не знаешь что вообще такой метод есть, вот в этих случая справочники как раз не помогают, потому что туда тупо не полезешь.
Вот потому я и показал наглядно что ТАМ была инфа.
вся инфа котрую надо читать есть в ДШ.... и сайт ваш, авр, простите ужасен, имхо.... форум он для ощения скорее чем для обмена ссылками... ответом на первый пост могло бы быть: "128? хм, вообще то вешнина 8-ми битного счетчкиа 255.." и человек бы понял что просто затупил...
обнулить таймер при достижении таймером значения OCRx
Да, можно и так интервал выдержать. Точный интервал мне не принципиален, но буду знать на будущее как точный реализовать. Но как я понял, режим обнуления при достижении значения в этом контроллере для таймера 0 - нет. А есть в таймере 1. Таймер 0 выборал просто из-за более простой конфигурации. Но чувствую мне понадобится еще один таймер, так что тогда будет кстати и местами их поменять.