реклама на сайте
подробности

 
 
> Проблема при измерении периода синусоиды, ATmega8
straighter
сообщение Mar 4 2016, 23:31
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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] - для короткого!!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
zombi
сообщение Mar 5 2016, 19:37
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Судя по осциллограммам на формирование одного бита уходит в среднем 10 мкс = 80 тактов процессора.
Что-то много, не?
Go to the top of the page
 
+Quote Post
straighter
сообщение Mar 5 2016, 20:39
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 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 Мгц. Вроде бы все правильно?
Go to the top of the page
 
+Quote Post
controller_m30
сообщение Mar 5 2016, 21:53
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 24-02-09
Пользователь №: 45 309



Цитата(straighter @ Mar 5 2016, 23:39) *
Полный фрагмент кода цикла for (вместе с вспомогательными импульсами на порте PORTC.3) такой:

У меня есть предположение по поводу приведённого кода. Этот код, как мне кажется, выводит импульс синхронизации с опережением на один бит по отношению к битам данных. Потому данные получаются сдвинутыми на один бит вправо - т.е. поделенными на 2.
Возможно что там всё-таки выводится число 2000, но из-за опережающих синхроимпульсов оно читается не верно.

Могу ошибаться, т.к. пишу только на асме, но эта последовательность команд очень на то похожа.
Это можно проверить, если вывести таким способом заранее известную константу (например 0х8001), и посмотреть расположение битов данных относительно синхроимпульсов.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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   Цитата(controller_m30 @ Mar 5 2016, 23:53...   Mar 6 2016, 08:28
|- - zombi   Цитата(straighter @ Mar 6 2016, 00:39) Я ...   Mar 6 2016, 11:52
|- - 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th June 2025 - 18:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.01422 секунд с 7
ELECTRONIX ©2004-2016