16 битный таймер T1 ATmega8

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Родился
Сообщения: 8
Зарегистрирован: Вс мар 30, 2008 00:21:32
Откуда: Запорожье

Сообщение UR4QBP »

Как прочитать 16 битный результат вычислений таймера T1 в МК ATmega8 и поместить его в переменную, например "с".
Что я неправильно делаю:

c= TCNT1L; //Чтение младших 8 битов результата
с+=((int)TCNT1H<<8); //Плюс 8 старших битов результата

У меня в программе выглядит вот так, но результат получается не тот что надо. И еще, можно ли в любом месте программы извлечь результат вычисления таймера T1 ?
Контактная информация:
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 87
Зарегистрирован: Пн ноя 05, 2007 12:44:43
Откуда: C:\Russia\SPb

Сообщение Brutaller »

А что мешает сделать просто так:

Код: Выделить всё

с = TCNT1;
:)

Это на асме надо по отдельности считывать младшую и старшую часть регистра. А на сях это проще. Между прочим с чтением этого регистра есть кое какие грабли, так что если что, очень внимательно читать даташит. Ключевые слова "Accessing 16-bit Registers"
Последний раз редактировалось Brutaller Вс мар 30, 2008 14:34:02, всего редактировалось 3 раза.
Контактная информация:
Реклама
Э...
Аватара пользователя
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва

Сообщение tych »

UR4QBP писал(а):Как прочитать 16 битный результат вычислений таймера T1 в МК ATmega8 и поместить его в переменную, например "с"
Убедитесь что с у вас 16 битная беззнаковая.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Контактная информация:
Родился
Сообщения: 8
Зарегистрирован: Вс мар 30, 2008 00:21:32
Откуда: Запорожье

Сообщение UR4QBP »

Подскажите переполнение таймера Т1 происходит при значени FFFF (65535), это правильно? И можно ли в любой момент прочитать значение регистра TCNT1?
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Аватара пользователя
Сообщения: 87
Зарегистрирован: Пн ноя 05, 2007 12:44:43
Откуда: C:\Russia\SPb

Сообщение Brutaller »

UR4QBP писал(а):Подскажите переполнение таймера Т1 происходит при значени FFFF (65535), это правильно?
Не во всех режимах.
UR4QBP писал(а):И можно ли в любой момент прочитать значение регистра TCNT1?
Да. Но если используются прерывания, то их надо запрещать на момент считывания. Это связано с особенностями доступа к 16-битным регистрам. Еще раз повторяю, ищите в даташите слова Accessing 16-bit Registers, чтоб не нарваться на эти грабли.

Между прочим в даташите примеры есть и на асме и на сях.
Контактная информация:
Реклама
Родился
Сообщения: 8
Зарегистрирован: Вс мар 30, 2008 00:21:32
Откуда: Запорожье

Сообщение UR4QBP »

Brutaller писал(а):
UR4QBP писал(а):Подскажите переполнение таймера Т1 происходит при значени FFFF (65535), это правильно?
Не во всех режимах.
UR4QBP писал(а):И можно ли в любой момент прочитать значение регистра TCNT1?
Да. Но если используются прерывания, то их надо запрещать на момент считывания. Это связано с особенностями доступа к 16-битным регистрам. Еще раз повторяю, ищите в даташите слова Accessing 16-bit Registers, чтоб не нарваться на эти грабли.
У меня таймер начинает считать с нуля TCNT1=0x00, клок идет от внешнего генератора. Прерывания запрещаю устанавливая регистр TIMSK=0x00 и TIMSK=0x44 разрешаю, можно это делать в теле самой программы и с какого значения будет считать таймер после разрешения прерывания? Скажите, считывать значение счетного регистра TCNT1 нужно до или после запрета прерывания?
Контактная информация:
Реклама
Э...
Аватара пользователя
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва

Сообщение tych »

UR4QBP писал(а):Подскажите переполнение таймера Т1 происходит при значени FFFF (65535), это правильно? И можно ли в любой момент прочитать значение регистра TCNT1 ?
Наверно при переходе в 0 - в ДШ должна быь временнАя диаграмма. Читать можно всегда но вероятна ошибка хотя и маловероятна.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 87
Зарегистрирован: Пн ноя 05, 2007 12:44:43
Откуда: C:\Russia\SPb

Сообщение Brutaller »

Вообще то разговор идет о глобальном запрещении прерываний.

Запретили прерывания.
Прочитали регистр.
Разрешили прерывания.

А таймер как отсчитывает так и будет продолжать, пока его не остановить. При чем тут прерывания то?
Контактная информация:
Родился
Сообщения: 8
Зарегистрирован: Вс мар 30, 2008 00:21:32
Откуда: Запорожье

Сообщение UR4QBP »

Таймер останавливаем записывая в регистр управления
TCCR1A=0x00; TCCR1B=0x00;
запускаем : TCCR1A=0x00; TCCR1B=0x06;
правильно?
И еще, практически какая максимально возможная частота
счета таймера Т1 от внешнего клока? По книжке по мегам в 2,5...3 раза ниже тактовой?
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 87
Зарегистрирован: Пн ноя 05, 2007 12:44:43
Откуда: C:\Russia\SPb

Сообщение Brutaller »

UR4QBP писал(а):Таймер останавливаем записывая в регистр управления
TCCR1A=0x00; TCCR1B=0x00;
запускаем : TCCR1A=0x00; TCCR1B=0x06;
правильно?
Не правильно.

Для запуска и остановки таймера нужен только TCCR1B
За это дело отвечают биты CS12, CS11, CS10
Установили все эти три бита в "0", таймер остановился.
А запускаем сответственно установкой в эти биты нужного значения для нужного источника тактовой(или предделитель или внешний источник). В даташите есть соответствующая табличка на стр. 100
Контактная информация:
Родился
Сообщения: 8
Зарегистрирован: Вс мар 30, 2008 00:21:32
Откуда: Запорожье

Сообщение UR4QBP »

interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
c=?; какое будет значение по прерыванию от переполнения таймера?
}
Контактная информация:
Э...
Аватара пользователя
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва

Сообщение tych »

При переполнении 0 должен быть если до выполнения считывания в процедуре таймер не успеет насчитать уже чего либо.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Контактная информация:
Родился
Сообщения: 8
Зарегистрирован: Вс мар 30, 2008 00:21:32
Откуда: Запорожье

Сообщение UR4QBP »

В принципе, понятно, я сразу все пробую на тестовой плате. Хочу написать программу для частотомера, до 65536 кГц меряет точнейше, а свыше начинает неправильно считать.
По прерыванию таймера я к переменной "с" инкрементирую 65536, а когда запрещаю прерывание и останавливаю счетчик, значение счетного региста TCNT1 прибавляю к "с":

// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
c+=65536;
}
.
.
.
.
TIMSK=0x00; TCCR2=0x00; TCCR1B=0x00;
c+=TCNT1;
Вот так.
Контактная информация:
Э...
Аватара пользователя
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва

Сообщение tych »

UR4QBP писал(а):какая максимально возможная частота
счета таймера Т1 от внешнего клока? По книжке по мегам в 2,5...3 раза ниже тактовой ?
И по даташиту более чем в 2 раза меньше тактовой. А вот у PIC аж 50 МГц ! у стареньких в том числе.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Контактная информация:
Родился
Сообщения: 8
Зарегистрирован: Вс мар 30, 2008 00:21:32
Откуда: Запорожье

Сообщение UR4QBP »

tych писал(а): И по даташиту более чем в 2 раза меньше тактовой. А вот у PIC аж 50 МГц ! у стареньких в том числе.
Я в курсе что могут PIC, но пока занимаюсь чисто АVR.
Контактная информация:
Э...
Аватара пользователя
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва

Сообщение tych »

UR4QBP писал(а):и останавливаю счетчик
Счет лучше не останавливать.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 36
Зарегистрирован: Ср дек 06, 2006 02:34:58

Сообщение Barni »

Можно сделать так:
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
FREQ_M = FREQ_M + 0xFF;
}
// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
TCCR0B = 0x00; //stop Timer0
TCCR1B = 0x00; //stop Timer1
TCNT1H=0x23; // Reinitialize Timer 1 value
TCNT1L=0x67;
FREQ = FREQ + FREQ_M + TCNT0;
TCNT0 = 0;
FREQ_M = 0;
if (OVR) COUNT=1;
OVR=!OVR;
TCCR1B=0x03; //start Timer1
TCCR0B=0x07; //start Timer0
}
//Индикация, FREQ = 0, COUNT=0
Делал частотомер на Тини2313 с кварцем 18МГц. Таймер0 считает по внешнему входу(проверял до 5МГц), а Таймер2 делает 2 интервала по 0,2сек. При COUNT=1 индикация. Точность 2,5Гц. Я добавлял прескалер на 400 и измерял до 2ГГц с точностью 1кГц.
Родился
Сообщения: 8
Зарегистрирован: Вс мар 30, 2008 00:21:32
Откуда: Запорожье

Сообщение UR4QBP »

Спасибо, обязательно попробую, скоро в ночь на работу, еще поговорим.
Контактная информация:
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»