У меня в программе выглядит вот так, но результат получается не тот что надо. И еще, можно ли в любом месте программы извлечь результат вычисления таймера T1 ?
Это на асме надо по отдельности считывать младшую и старшую часть регистра. А на сях это проще. Между прочим с чтением этого регистра есть кое какие грабли, так что если что, очень внимательно читать даташит. Ключевые слова "Accessing 16-bit Registers"
Последний раз редактировалось Brutaller Вс мар 30, 2008 14:34:02, всего редактировалось 3 раза.
UR4QBP писал(а):Подскажите переполнение таймера Т1 происходит при значени FFFF (65535), это правильно?
Не во всех режимах.
UR4QBP писал(а):И можно ли в любой момент прочитать значение регистра TCNT1?
Да. Но если используются прерывания, то их надо запрещать на момент считывания. Это связано с особенностями доступа к 16-битным регистрам. Еще раз повторяю, ищите в даташите слова Accessing 16-bit Registers, чтоб не нарваться на эти грабли.
Между прочим в даташите примеры есть и на асме и на сях.
UR4QBP писал(а):Подскажите переполнение таймера Т1 происходит при значени FFFF (65535), это правильно?
Не во всех режимах.
UR4QBP писал(а):И можно ли в любой момент прочитать значение регистра TCNT1?
Да. Но если используются прерывания, то их надо запрещать на момент считывания. Это связано с особенностями доступа к 16-битным регистрам. Еще раз повторяю, ищите в даташите слова Accessing 16-bit Registers, чтоб не нарваться на эти грабли.
У меня таймер начинает считать с нуля TCNT1=0x00, клок идет от внешнего генератора. Прерывания запрещаю устанавливая регистр TIMSK=0x00 и TIMSK=0x44 разрешаю, можно это делать в теле самой программы и с какого значения будет считать таймер после разрешения прерывания? Скажите, считывать значение счетного регистра TCNT1 нужно до или после запрета прерывания?
UR4QBP писал(а):Подскажите переполнение таймера Т1 происходит при значени FFFF (65535), это правильно? И можно ли в любой момент прочитать значение регистра TCNT1 ?
Наверно при переходе в 0 - в ДШ должна быь временнАя диаграмма. Читать можно всегда но вероятна ошибка хотя и маловероятна.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Таймер останавливаем записывая в регистр управления
TCCR1A=0x00; TCCR1B=0x00;
запускаем : TCCR1A=0x00; TCCR1B=0x06;
правильно?
И еще, практически какая максимально возможная частота
счета таймера Т1 от внешнего клока? По книжке по мегам в 2,5...3 раза ниже тактовой?
UR4QBP писал(а):Таймер останавливаем записывая в регистр управления
TCCR1A=0x00; TCCR1B=0x00;
запускаем : TCCR1A=0x00; TCCR1B=0x06;
правильно?
Не правильно.
Для запуска и остановки таймера нужен только TCCR1B
За это дело отвечают биты CS12, CS11, CS10
Установили все эти три бита в "0", таймер остановился.
А запускаем сответственно установкой в эти биты нужного значения для нужного источника тактовой(или предделитель или внешний источник). В даташите есть соответствующая табличка на стр. 100
В принципе, понятно, я сразу все пробую на тестовой плате. Хочу написать программу для частотомера, до 65536 кГц меряет точнейше, а свыше начинает неправильно считать.
По прерыванию таймера я к переменной "с" инкрементирую 65536, а когда запрещаю прерывание и останавливаю счетчик, значение счетного региста TCNT1 прибавляю к "с":