|
Проблема при измерении периода синусоиды, ATmega8 |
|
|
|
Mar 4 2016, 23:31
|
Участник

Группа: Участник
Сообщений: 23
Регистрация: 29-06-12
Пользователь №: 72 555

|
Уважаемые форумчане, помогите разобраться... ATmega8 работает с кварцем 8 Мгц. На вход встроенного компаратора подаю синусоиду 4 кГц от стабильного генератора. По положительному перепаду на выходе компаратора происходит захват значения в Timer/Counter1. Возникает прерывание, вычисляется разность между последним захваченным значением и предыдущим захваченным значением. По идее, эта разность должна быть равна 2000, т.к. 8МГц/4кГц=2000. Но на самом деле получается 1000. Почему? Это значение (1000) я могу наблюдать в виде последовательного кода на выходе PORTC.1 с помощью осциллографа. Фрагмент программы, прерывание по захвату Таймера1: i Код nterrupt [TIM1_CAPT] void timer1_capt_isr(void) { b=ICR1; if (b>a) { e=b-a; }; a=b; for(i=0; i < 16; i++) { if(0x0001 & (e>>(15-i))) PORTC.1=1; //если бит-единица, то и выставляем единицу else PORTC.1=0; //иначе - выставляем ноль } PORTC.1=0; }
Сообщение отредактировал IgorKossak - Mar 5 2016, 10:40
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
|
 |
Ответов
|
Mar 5 2016, 20:39
|
Участник

Группа: Участник
Сообщений: 23
Регистрация: 29-06-12
Пользователь №: 72 555

|
Цитата(zombi @ Mar 5 2016, 21:37)  Судя по осциллограммам на формирование одного бита уходит в среднем 10 мкс = 80 тактов процессора. Что-то много, не? Не знаю, как посчитать, сколько тактов процессора требуется? Полный фрагмент кода цикла for (вместе с вспомогательными импульсами на порте PORTC.3) такой: Код for(i=0; i < 16; i++) { PORTC.3=1; PORTC.3=0;
if(0x0001 & (e>>(15-i))) PORTC.1=1;//если бит-единица, то и выставляем единицу else PORTC.1=0;//иначе - выставляем ноль } Я измерил длительность импульса "1" на PORTC.3 - получилось 250нс. Т.к. команда PORTC.3=1 (на ассемблере ей соответствует SBI 0x15,3) выполняется за два такта, то значит один такт равен 125нс, что соответствует частоте 8 Мгц. Вроде бы все правильно?
|
|
|
|
|
Mar 5 2016, 21:53
|
Местный
  
Группа: Участник
Сообщений: 356
Регистрация: 24-02-09
Пользователь №: 45 309

|
Цитата(straighter @ Mar 5 2016, 23:39)  Полный фрагмент кода цикла for (вместе с вспомогательными импульсами на порте PORTC.3) такой: У меня есть предположение по поводу приведённого кода. Этот код, как мне кажется, выводит импульс синхронизации с опережением на один бит по отношению к битам данных. Потому данные получаются сдвинутыми на один бит вправо - т.е. поделенными на 2. Возможно что там всё-таки выводится число 2000, но из-за опережающих синхроимпульсов оно читается не верно. Могу ошибаться, т.к. пишу только на асме, но эта последовательность команд очень на то похожа. Это можно проверить, если вывести таким способом заранее известную константу (например 0х8001), и посмотреть расположение битов данных относительно синхроимпульсов.
|
|
|
|
|
Mar 6 2016, 08:28
|
Участник

Группа: Участник
Сообщений: 23
Регистрация: 29-06-12
Пользователь №: 72 555

|
Цитата(controller_m30 @ Mar 5 2016, 23:53)  ... Этот код, как мне кажется, выводит импульс синхронизации с опережением на один бит по отношению к битам данных. Почему с опережением на целый бит? У нас длительность бита примерно 10мкс, а время выполнения команд "PORTC.3=1; PORTC.3=0;" примерно 0,5мкс. Цитата(controller_m30 @ Mar 5 2016, 23:53)  Это можно проверить, если вывести таким способом заранее известную константу (например 0х8001), и посмотреть расположение битов данных относительно синхроимпульсов. Да, это можно будет проверить.
|
|
|
|
Сообщений в этой теме
straighter Проблема при измерении периода синусоиды Mar 4 2016, 23:31 akl Возможно, есть дребезг в моменты перехода полуволн... Mar 5 2016, 02:59 zombi А если в прерывании просто инвертировать PORTC.1 к... Mar 5 2016, 12:24 straighter Цитата(zombi @ Mar 5 2016, 14:24) А если ... Mar 5 2016, 13:12  zombi Цитата(straighter @ Mar 5 2016, 17:12) На... Mar 5 2016, 14:52   straighter Цитата(zombi @ Mar 5 2016, 16:52) А почем... Mar 5 2016, 18:14    pilot1440 ACSR=0x04;
а какое условие прерывания у компаратор... Mar 13 2017, 12:45 zombi Или clkcpu не 8MHz или на счетчик поступает не clk... Mar 5 2016, 14:41 controller_m30 Приведите ещё настройки всех регистров компаратора... Mar 5 2016, 14:52  zombi Цитата(straighter @ Mar 5 2016, 23:39) Вр... Mar 5 2016, 21:11     straighter Попробую так написать, поставить строб после бита. Mar 6 2016, 15:02      zombi Цитата(straighter @ Mar 6 2016, 18:02) ст... Mar 6 2016, 15:20       straighter Да, вроде бы понял. Попробую так и написать. Mar 6 2016, 15:24  zombi Цитата(controller_m30 @ Mar 6 2016, 00:53... Mar 6 2016, 04:45
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|