|
И снова частотомер на Atmega8., нужен алгоритм |
|
|
|
Jul 10 2008, 23:45
|
Группа: Новичок
Сообщений: 10
Регистрация: 2-07-08
Пользователь №: 38 711

|
Добрый день всем! На этом форуме я вобщем новичек. Вот уже меня достал этот вопрос,бо я лажу-и везде готовые схемы,без самой идеи как оно работает! Не надо мне готовые варианты нада сама идея!!! Вобщем в чем суть то вопроса Сваял так сказать частотомер на Atmega8+LMXxxxx пределитель,с выводом на МЭЛТ MT10T7-7. Тут запортачка с самим принципом измерения! Пишу на ассемблере,писать на С для таких контролеров,как по мне это полное извращение! И так. Использую 2 таймера-8битный Т0,и 16 битный Т1. Измерительная частота поступает сразу на вход Т1(PD5). После инициализацие портов,дисплея и LMX,инициализирую таймеры-- на Т0 пускаю сигнал с кварца,поделенный на 8, вход T1 подкл к источнику сигнала. А забыл-в Т0 записую константу,что бы прерывание от него наступило после 100 импульсов поступивших на него. Потом запускаю бесконечный цикл. Наступает прирывани через 100имульсов тактируемые частотой 1МГЦ(8МГЦ/8). Останавлваем Т1,изымаем даные с регистров,преобразуем 16бит в 5 десятичных знаков,выводим на экран. запускаем таймеры-счетчики,возвращаемся в бесконечный цикл. Так вот в чем глюк! Когда тестил прогу,тестил ее на частах до 2х Мгц,т е 8 бит 16битного счетчика,потом прикурил LMX,тут чюдеса когда значение в Т1 больше 255,почемуто не корректно просходит преобразование двоичного числа в десятичное...один алгорит нарыл преобразования,а все остальное бред какойто...возникли сомнения -правильно ли у меня преобразование 2х 8битных регистров с T1 в десятичный код? бо в инете токо один пример нарыл,остальное для школы 11 класса! Вопрос. Будет ли работать моя идея??? И какие тут подводные камни,и точность.Вобще работает,но я не уверен чт идея верна И как реализуют алгоритм на одном 8 битном таймере? ведь прерывание,изьятие из регистра и запись,это погрешность ,и приличная! Почитав это http://electronix.ru/forum/index.php?showt...29796&st=75 ,я пришол в УЖАС!!! Мне хватит и 5 разрядов. Сразу скажу частоту мерять до 3 ГГц,точность +-0.5МГЦ не критично! Схема собрана,работает,но вот с алгоритмом измерения походу не то. Посмотрел тут схемы,почемуто народ использует 8 битный таймер-счетчик...да и прошивы все hex,пришлось дизасемблить и смотреть....ну просто бесит..что нигде ни кто подробно не описал по человечиски.... Жду коментарием. За любой ответ буду благодарен.
Сообщение отредактировал Peeoner - Jul 10 2008, 23:59
|
|
|
|
3 страниц
1 2 3 >
|
 |
Ответов
(1 - 32)
|
Jul 11 2008, 00:10
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(Peeoner @ Jul 11 2008, 02:45)  Пишу на ассемблере, .... тут чюдеса когда значение в Т1 больше 255,почемуто не корректно просходит преобразование двоичного числа в десятичное...один алгорит нарыл преобразования,а все остальное бред какойто...возникли сомнения -правильно ли у меня преобразование 2х 8битных регистров с T1 в десятичный код? Если проблема только с преобразованием, то это пустяки. Алгоритм преобразования - собирать остатки от деления на 10 пока частное не 0. Алгоритм деления на 10 16-ти разрадного числа используя только умножение и сдвиг: y = (x * 0xCCCD) >> 19 Общие рекомендации для продожения беседы,  1. Проверьте порядок доступа к спаренным регистрам ( L регистр должен читаться перед H) 2. Ознакомьтесь с режимом таймера Input Capture, возможно пригодится или натолкнет на новую идею. 3. Поищите по форуму еще ;> =GM= тут толкал много интересных идей. А вообще ваш вариант вполне работоспособен.
|
|
|
|
|
Jul 11 2008, 00:23
|
Группа: Новичок
Сообщений: 10
Регистрация: 2-07-08
Пользователь №: 38 711

|
Вот участок кода самого цикла измерения,сильно не пинать. Я варрировал тут с изменением циклов измерения,так как у меня предделитель выставлен на 1280,в этом примере 8МГЦ/1024 и тактируем Т0, то что тут команды поставлены немного не корректно,т е T1 подстичает еще 5-10имульсов,для теста не критично,подправлю когда все будет нормально работать. С Input Capture негодиться,бо там низкая частота,а сам по себе таймер считает намного быстрее(вроде)..хотя я подумаю,10 разрядов было бы интересно заполнить,но там матиматека нифиговая получиться... Код ;Инициализация таймера 0 ldi tmp,(1<<toie0) out timsk,tmp
;Инициализация 16 битноо таймера 1 ldi tmp,0x07;07 mov lw,tmp ldi tmp,0x03 out tifr,tmp ldi tmp,0x9c;9c ;запись в регистр таймера периода счета out tcnt0,tmp ldi tmp,0x03;02 mov k,tmp ldi tmp,0x00 ;подготовка константы для остановки t1 out tccr0,k ;Тактовые импульсы с кварца /1024 out tccr1b,lw;Подключения входа таймера к внешнему источнику ser nxx
sei ;разрешение прерываний
loop: rjmp loop
tim0: ;Прерывания от таймера формирующего пириод измерения
push nxx ;Сохранение регистров в стеке (станет необходимым in nxx,sreg ;когда основная программа будет выполнять push nxx ;какие-либо действия)
out tccr1b,tmp ;Остановка 16 битного счетчика импульсо in lw,tcnt1l ;Копируем младший байт со счетчика входных импульсов in hi,tcnt1h ;Копируем старший байт
ldi tmp,0x00 out tcnt1l,tmp ;Очищяем счетчик импульсов out tcnt1h,tmp ;
out tccr0,tmp ;Останавливаем таймер периода счета out tcnt0,tmp ;очищяем таймер периода счета
;Преобразуем двоичное 16битное число в десятичное
;.def lw=r17 ;.def hi=r18 ;************************************************************************ ;Преобразуем двоичное 16битное число в десятичное вида ;{0x0(цифра 10000)} {тысячи,сотни} {десятки,единицы} ;************************************************************************ ; ; ; ; ; ;.def lw =r17 ;двоичное значение, младший байт ;.def hi =r18 ;двоичное значение, старший байт ;.def dig0 =r18 ;BCD значение, цифры 1 и 0 ;.def dig1 =r19 ;BCD значение, цифры 3 и 2 ;.def dig2 =r20 ;BCD значение, цифра 4 ;Примечание: Переменные hi и dig0 должны размещаться в одном ;регистре. ;*************************************************************************
BCD5: ldi dig2, -1 BCD5_loop_1: inc dig2 subi lw, low(10000) sbci hi, high(10000) brsh BCD5_loop_1 subi lw, low(-10000) sbci hi, high(-10000) ldi dig1, -0x11 BCD5_loop_2: subi dig1, -0x10 subi lw, low(1000) sbci hi, high(1000) brsh BCD5_loop_2 subi lw, low(-1000) sbci hi, high(-1000) BCD5_loop_3: inc dig1 subi lw, low(100) sbci hi, high(100) brsh BCD5_loop_3 subi lw, -100 ldi dig0, -0x10 BCD5_loop_4: subi dig0, -0x10 subi lw, 10 brsh BCD5_loop_4 subi lw, -10 add dig0,lw
Сообщение отредактировал zltigo - Jul 11 2008, 15:17
|
|
|
|
|
Jul 11 2008, 03:42
|
Группа: Новичок
Сообщений: 10
Регистрация: 2-07-08
Пользователь №: 38 711

|
Ну вот все проверил,дествительно глюк именно в преобразование чисел, до 255 оно нормально показуеть а после 255,начинают мелькать цифры,как бы случайная величина образуеться... вывод цифр на дисплей нормально работает. глюкас в этом алгоритме,который я взял с атмеловского сайта http://www.atmel.ru/Articles/Atmel13_app1.htm а он оказуеться глюконутый! А в инете не одного примера,только этот. Вот умножение и деление это хорошо,вот только в Avr нет прямого модуля деления и умножения,а как умножать и делить посредством других команд,понятия не имею,опять же литературы не фига нету... в инете тоже не нарыл. Может кто хоть название подскажет каких нить книженцей которые скачать моно? Или у кого готовый алгоритм на ассемлере есть? Теперь камень предкновения,то што я не умею преобразовать 2байта таймера в 5 цифр...вот пипец.....
Сообщение отредактировал Peeoner - Jul 11 2008, 03:45
|
|
|
|
|
Jul 11 2008, 05:45
|

Знающий
   
Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065

|
Цитата(Peeoner @ Jul 11 2008, 09:42)  Теперь камень предкновения,то што я не умею преобразовать 2байта таймера в 5 цифр...вот пипец..... Может все-таки перейти на Си? Смотрите как просто: Код char mystring[10]; unsigned int counter; counter = 12345; // число 12345 -- только как пример [b] sprintf(mystring, "", counter);[/b] // Вывод числа на МЭЛТ for (i = 0; i < strlen(mystring); i++) { МЭЛТ = mystring[i]; // эта строка -- только пример. Код не рабочий!!! } Жирным выделена строка, которая делает преобразование, которое наводит на Вас ужас. Все просто и красиво. Более того, программу напишите намного быстрее, чем на ассеблере. Работать программа будет не чуть не медленнее, т.к. счетом занимается аппаратура, а не программный код. Не хочу оскорблять Ваши религиозные чувства относительно языков программирования, просто предлагаю рассматреть и другие варианты решения задачи.
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
|
Jul 11 2008, 10:21
|

За битами по регистрам гоняюсь
  
Группа: Свой
Сообщений: 457
Регистрация: 24-04-06
Из: Таганрог
Пользователь №: 16 446

|
Цитата(Peeoner @ Jul 11 2008, 07:42)  ...Вот умножение и деление это хорошо,вот только в Avr нет прямого модуля деления и умножения,а как умножать и делить посредством других команд,понятия не имею,опять же литературы не фига нету... Вообще-то у ATmega есть команды умножения и деления, но это так, к слову ... А вот здесь есть куча подпрограмм на экологически чистом ассемблере: http://elm-chan.org/cc_e.html
--------------------
Курсор влево, курсор вправо - считается хакерством. FORMAT C: производится без предупреждения
|
|
|
|
|
Jul 11 2008, 12:33
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(Peeoner @ Jul 10 2008, 22:45)  Посмотрел вашу ссылку, там моя переписка с Яrik'ом (кстати, он довёл-таки точность измерения частоты 1 МГц программой на си до 1 Гц), никакого ужаса не заметил, зато почитав ваши сообщения, понял, что вы учились в олбанской школе и были там хорошистом или даже отличником. Потом посмотрел вашу программу и тут пришёл в тихий ужас: нет ни одного завершённого фрагмента, просто какие-то куски кода. По делу. Алгоритм измерения частоты методом ворот достаточно примитивен. Берёте некий счётчик, открываете его на некоторый период времени - счётчик начинает считать приходящие импульсы, закрываете - перестаёт считать. Если окно было открыто на 1 секунду, то искомая частота в герцах равна количеству импульсов в счётчике. Если окно открыто на 0.1с, то частота в десятках герц и т.д. Если окно некратно таких числам, то придётся каждый раз пересчитывать, поэтому все стараются выставить кратное окно. У вас, кстати, длительность окна не кратна, надо пересчитывать. Да и длительность какая-то смехотворная - порядка 40 мс, подойдёт только для оценки величины частоты. Видите ли, частотомер это точный измерительный прибор, и разработчики всегда стараются выжать максимум из разрабатываемого устройства, так они устроены. А уж что выводить на дисплей, 5-6-7-8-9-10 разрядов, это отдельная песня.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Jul 11 2008, 12:58
|
Частый гость
 
Группа: Свой
Сообщений: 127
Регистрация: 4-04-07
Из: Ижевск
Пользователь №: 26 773

|
Цитата(Peeoner @ Jul 11 2008, 04:45)  ...везде готовые схемы,без самой идеи как оно работает! Не надо мне готовые варианты нада сама идея!!! И так. ...И как реализуют алгоритм на одном 8 битном таймере? ведь прерывание,изьятие из регистра и запись,это погрешность ,и приличная! Почитав это http://electronix.ru/forum/index.php?showt...29796&st=75 ,я пришол в УЖАС!!! Мне хватит и 5 разрядов. Сразу скажу частоту мерять до 3 ГГц,точность +-0.5МГЦ не критично! Схема собрана,работает,но вот с алгоритмом измерения походу не то. ...нигде ни кто подробно не описал по человечиски.... Жду коментарием. За любой ответ буду благодарен. Цитата(defunct @ Jul 11 2008, 05:10)  ... 2. Ознакомьтесь с режимом таймера Input Capture, возможно пригодится или натолкнет на новую идею. 3. Поищите по форуму еще ;> =GM= тут толкал много интересных идей.
А вообще ваш вариант вполне работоспособен. Как Вам такой алгоритм: Тизм=Тх*Nx*A и Тизм=to*nox, где Тизм- принятое время измерения; Тх-период измеряемой частоты; Nx-целое число периодов измеряемой частоты; to-период тактовой частоты микроконтроллера Fo; nox-целое число периодов тактовой частоты микроконтроллера Fo; A-коэффициент деления LMX. Делаем преобразование Тх*Nx*A=to*nox Тх=to*nox/Nx*A или Fx=Fo*Nx*A/nox!!! Для примера: Принимаем время измерения примерно 0.25 сек. Fo=8'000'000 Hz Принимаем A=234'560. Допустим, что измеряется Fx=3'210'987'000 Hz 3'210'987'000 Hz/234'560=13'698.405xxx Hz-> 1'000'000мкс/13'698.405xxx=73.049ххх мкс за время измерения пройдет 250000/73.049ххх=3422.351ххх периодов Nx. Дожидаемся окончания текущего периода Nx=3423-> 73.049ххх*3423=250073.049ххх мкс и nox=200379. Подставляем в выражение Fx=8'000'000*3423*234560/200379=3'210'987'037 Hz. Достоинством данного метода, особенно для любительских условий, является: -Fo-может меняться в широких пределах. Просто она должна быть известна -отсутствие жесткого требования выдержки измерительного интервала, кратного единице времени -легкая реализация на любом микроконтроллере. Загрубить полученный результат можно всегда. Пристальнее рассмотрите возможности Input Capture, на которые обращает внимание =GM=Удачи! PS Пока писал Вам ответил =GM=, но, думаю, мое сообщение будет не лишнее.
|
|
|
|
|
Jul 11 2008, 12:59
|
Местный
  
Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527

|
Цитата(Peeoner @ Jul 11 2008, 07:42)  глюкас в этом алгоритме,который я взял с атмеловского сайта http://www.atmel.ru/Articles/Atmel13_app1.htm а он оказуеться глюконутый! А в инете не одного примера,только этот. Этот алгоритм используют сотни людей, и У ВСЕХ он работает нормально. Тем более, что он очень простой. Просто применять его нужно правильно.
|
|
|
|
|
Jul 11 2008, 15:09
|
Группа: Новичок
Сообщений: 10
Регистрация: 2-07-08
Пользователь №: 38 711

|
Цитата Посмотрел вашу ссылку, там моя переписка с Яrik'ом (кстати, он довёл-таки точность измерения частоты 1 МГц программой на си до 1 Гц), никакого ужаса не заметил, зато почитав ваши сообщения, понял, что вы учились в олбанской школе и были там хорошистом или даже отличником. Потом посмотрел вашу программу и тут пришёл в тихий ужас: нет ни одного завершённого фрагмента, просто какие-то куски кода.
По делу. Алгоритм измерения частоты методом ворот достаточно примитивен. Берёте некий счётчик, открываете его на некоторый период времени - счётчик начинает считать приходящие импульсы, закрываете - перестаёт считать. Если окно было открыто на 1 секунду, то искомая частота в герцах равна количеству импульсов в счётчике. Если окно открыто на 0.1с, то частота в десятках герц и т.д. Если окно некратно таких числам, то придётся каждый раз пересчитывать, поэтому все стараются выставить кратное окно. У вас, кстати, длительность окна не кратна, надо пересчитывать. Да и длительность какая-то смехотворная - порядка 40 мс, подойдёт только для оценки величины частоты. Видите ли, частотомер это точный измерительный прибор, и разработчики всегда стараются выжать максимум из разрабатываемого устройства, так они устроены. А уж что выводить на дисплей, 5-6-7-8-9-10 разрядов, это отдельная песня. Ну в албанской школе не учюся,давно уже отучился,грамматика на форуме ,думаю, это не столь критично.Да и коменты в тексте программы чисто для себя,что бы не пришлось думать "а што же я тут делал" кода прога поваляеться пол года на компе,и придеться что то править. Код в програме завершен,я просто привел кусок который относиться к циклу измерения,просто незнаю нужен ли весь код,вроде и так понятно А на диспелй выводить цифры,ни какой песни нету,все достаточно легко,как по мне проще чем число преобразовать))) Я прекрасно понимаю что частотомер точный прибор,но мне не нужно сверх точности. Вот скажем на частоте в 3 000 МГЦ,поделеную на 1280 какую вы точность получите???? Используя обычный китайский КВАРЦ на 8мгц... Я все же подумаю над идеей =GM= ... Устройство для себя разрабатывалось. >Этот алгоритм используют сотни людей, и У ВСЕХ он работает нормально. Тем более, что он очень простой. Просто применять его нужно правильн Ну может конешно и я ошибся,поверю вам наслово. А вы его сами применяли хоть раз??? А по поводу С--напишите 100 строчек кода,откомпильте и посмотрите сколько hex файл у вас бедет весить,а потом напишите на ассемблере и сравните! А всякая оптимизация и прочее не дают особого эффекта
Сообщение отредактировал Peeoner - Jul 11 2008, 15:16
|
|
|
|
|
Jul 11 2008, 15:22
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Peeoner @ Jul 11 2008, 17:09)  Ну в албанской школе не учюся,давно уже отучился,грамматика на форуме ,думаю, это не столь критично. Moderator: Всему есть предел. Настойчиво рекомендую ознакомится с правилами данного форума.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 11 2008, 15:34
|
Группа: Новичок
Сообщений: 10
Регистрация: 2-07-08
Пользователь №: 38 711

|
Правила читал.Вроде не че такого не сказал,забаните,сам разберусь.
Сообщение отредактировал Peeoner - Jul 11 2008, 15:44
|
|
|
|
|
Jul 11 2008, 15:37
|

Знающий
   
Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065

|
Цитата(zltigo @ Jul 11 2008, 21:22)  Moderator: Всему есть предел. Настойчиво рекомендую ознакомится с правилами данного форума. Не могу при людно не выразить уважение zltigo. Четко, сильно, политкорректно. Молодец! Я снова приникся уважением. Respects to you!
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
|
Jul 11 2008, 15:45
|
Группа: Новичок
Сообщений: 10
Регистрация: 2-07-08
Пользователь №: 38 711

|
Спасибо,понял. Народ почемуто тут везде исходники сует на форуме,во все окно,буду иметь ввиду.
Сообщение отредактировал Peeoner - Jul 11 2008, 15:47
|
|
|
|
|
Jul 11 2008, 16:15
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(Peeoner @ Jul 11 2008, 14:09)  А на диспелй выводить цифры, никакой песни нету, все достаточно легко, как по мне проще чем число преобразовать))) Ну-у-у, я имел в виде верные значащие цифры, а не просто цифры. Цитата(Peeoner @ Jul 11 2008, 14:09)  Я прекрасно понимаю что частотомер точный прибор, но мне не нужно сверхточности. Вот скажем на частоте в 3 000 МГw, поделеную на 1280 какую вы точность получите???? Используя обычный китайский КВАРЦ на 8мгц... На ATtiny24 (20 МГц клок) я бы сказал, что можно получить порядка +-2 Гц, с обработкой можно получить точными все 10 цифр частоты. Например, Fx=2 999 999 998 Гц точно, не слабо, э? Причём, достичь такого на копеечном приборе. Интересно, за сколько такой прибор можно купить? Конечно, кое-над-чем придётся потрудиться, но это не смертельно. Да, и делил бы на 300, а не на 1280, и точнее, и всяко дешевле.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Jul 11 2008, 16:22
|
Группа: Новичок
Сообщений: 10
Регистрация: 2-07-08
Пользователь №: 38 711

|
Цитата(=GM= @ Jul 11 2008, 19:15)  Ну-у-у, я имел в виде верные значащие цифры, а не просто цифры. На ATtiny24 (20 МГц клок) я бы сказал, что можно получить порядка +-2 Гц, с обработкой можно получить точными все 10 цифр частоты. Например, Fx=2 999 999 998 Гц точно, не слабо, э? Причём, достичь такого на копеечном приборе. Интересно, за сколько такой прибор можно купить? Конечно, кое-над-чем придётся потрудиться, но это не смертельно. Да, и делил бы на 300, а не на 1280, и точнее, и всяко дешевле. ну все вы меня заинтреговали вашим методом...доделаю эту хрень буду пробовать. коэфициент деления можно установить от 992 до 32767,хотя надо попробовать.
|
|
|
|
|
Jul 11 2008, 17:29
|
Гуру
     
Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588

|
Цитата(=GM= @ Jul 11 2008, 16:15)  На ATtiny24 (20 МГц клок) я бы сказал, что можно получить порядка +-2 Гц, с обработкой можно получить точными все 10 цифр частоты. Например, Fx=2 999 999 998 Гц точно, не слабо, э? Причём, достичь такого на копеечном приборе. Интересно, за сколько такой прибор можно купить? Точных ? Десять ? На копеечном приборе ? Мне кажется, только термостабилизация будет стоить на пару порядков дороже, чем этот "копеечный прибор" (
|
|
|
|
|
Jul 11 2008, 19:09
|

Местный
  
Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530

|
Цитата(Огурцов @ Jul 11 2008, 21:29)  Точных ? Десять ? На копеечном приборе ? Мне кажется, только термостабилизация будет стоить на пару порядков дороже, чем этот "копеечный прибор" ( термостабилизация чего? кварца контроллера? Вы о чём? Вы же не генерите образцовый сигнал а кто Вам сказал что сам измеряемый сигнал будет очёнь стабильным? для копеечного прибора термостабилизация не применяется, а указывается температурный диапазон прибора и indоor use only
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
|
Jul 12 2008, 09:30
|
Группа: Новичок
Сообщений: 10
Регистрация: 2-07-08
Пользователь №: 38 711

|
Ну вобщем решил я реализовать метод =GM=,как бы вроде с методом все понятно,подправте если не так понял.Использую 3
таймера: T0-считаю M(количество импульсов входной частоты) T1-считаю N(тактовую частоту кварца,в данном случае 8Мгц) T2-использую для подсчета (формирования прерывания) Tизм.
На платке соединяю вход таймера T0 и ICP1(вход узла захвата).
1.Инициализирую все что мне нужно. Разрешаю прерывания от всех таймеров,и модуля захвата. 2.Жду какого нить прерывания в бесконечном цикле.
3.Поступает прерывание от ICP1. Запрещаю прерывание от модуля захвата. Запускаю T2 счетчик времени измерения. Смотрю метку-это начальное или конечное время. Переписую значения из T0,T1 в регистры как M1,N1 или M2,N2 Занимаюсь расчетом предыдущего измерения,считаю по формуле M=M2-M1;N=N2-N1 Fx=(Fо*M)/N и вывожу данные на дисплей.
4. Поступает прерывание от Т2,т.е. истекло время измерения.Разререшаю прерывание от ICP1. Записую "метку",что это у
меня будет конечные значения.Выхожу в бесконечный цикл.
теперь касаемо самих расчетов.К примеру у меня частота кварца 8мгц,на вход я подаю 4Мгц(это для оценки),в реале даже при деление на 1000,мне до 3ГГц с головой хватит! т2-второй счетчик 8 битный,поэтому логично подавать на него 8000/1024=7825Гц.Тогда период измерения Tизм=0.127795521...Е-3 С=0.128E-3 C. F0=8 000 000Гц T0=0.125E-6 c Tx=0,25E-6 c N=1024 M=512 Считаем. Fx=(F0*M)/N=(8 000 000 *512)/1024=4 000 000Гц. Вроде верна формула. Теперь проблемы... Ну 16битный счетчик посчитает 1024 имульса без переполнения,а вот 8 битный-2раза переполниться,надо обрабатывать прерывание от него,и записывать в регистр скоко он раз переполнился,можем потерять +-4 значение в счетчике,пока бум обрабатывать прерывание И самое интересное операция с умножением и делением! Что бы обеспечить точность в 10 знаков,нужно варрировать 32 битными величинами!И к тому же я не понимаю,откуда 10 знаков?? это что после герц еще 3 знака?? В моем случае при предделителе в 1000,я получю 4000.000Мгц,те с точностью до 1кгц,неплохо вобщем))) Для большей точности надо варрировать 32битами... Но AVR как то 8битная!!! Ну вот к примеру мы считаем Fx=(7А1200h*200h)/400h=3D0900h Интересно как счиатать такие величины посредством 8 битных регистров? Разбивать побайтно,перемножать.Корректировать с четом сдвигов и прочего,и так для каждого значения??? Операция умножения имееться в AVR ке,а вот деления я не нарыл,алгоритм деления нарыл. А вот как варрировать с 32 битными величинами,ну или в моем случае с 3 байтами,я как то не представляю.Память что ли подключать?
Подам я пока что на T0 -измеряемый сигнал,и отсчет времени буду вести по Т2,а там уже подумаю... Я понимаю что на С проще. Но меня совесть загрызет если AVR-ка будет делать 10-15 левых циклов ,о которых я понятия иметь не буду,так как писал на С. Да и для меня это так сказать практика,и более понятнее что и как береться,и проще с архитектурой разобраться.Хреново что двоичной математики не знаю..
Сообщение отредактировал Peeoner - Jul 12 2008, 09:46
|
|
|
|
|
Jul 12 2008, 16:59
|

Местный
  
Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530

|
Цитата(gte @ Jul 12 2008, 11:01)  И сколько значащих цифр при этом будут реальными? Полагаю не менее шести. Проверял стабильность кварца контроллера используя режим CTC таймера. Исспользовал для измерения частоты не китайский частотомер, не помню как называется , год назад было, так вот частота генерируемая так по памяти из кварца фирмы Siward 7.3728 MHz, LP-3.5S, 30ppm и равнялась 230400 Гц - ошибка в один герц накапливалась в течении 15-ти ... 20-ти секунд.
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
|
Jul 13 2008, 07:32
|
Частый гость
 
Группа: Участник
Сообщений: 82
Регистрация: 10-07-06
Пользователь №: 18 720

|
Такой вопрос. CodeVision, пример из пакета \cvavreval\examples\DS1820 Термометр с использованием Dallas Semiconductor DS1820, кварц 3.6864MHz В программе используются библиотеки для работы с DS1820. Насколько я поинмаю, для обработки получаемых данных от DS1820 нужны определенные интервалы времени. Я сделал проектик на Mega 16. Такого кварца у меня нет. Есть 4МГц, 4,5МГц и выше. Внутренние частоты МК - 1, 2, 4, 8. Попробывал в Протеусе симуляцию на 4 МГц. Работает. Но в реальном устройстве - нет. Попробывал подключить внешнюю RC-цепь (4,2К 22пФ), выставив соответсвующие фюзы. Опять же на индикаторах ерунда. Есть ли выход из данного положения? Можно ли обойтись без кварца на 3.6864MHz?
|
|
|
|
|
Jul 13 2008, 09:16
|
Участник

Группа: Участник
Сообщений: 63
Регистрация: 17-04-07
Пользователь №: 27 098

|
Цитата(Огурцов @ Jul 12 2008, 23:16)  Ну Вы же сами пишете "30ppm". Что означает 4,52 десятичных цифр. А для шести, наверно, д.б. _1_ ppm, так ведь ? посмотрите это http://electronix.ru/forum/index.php?showt...19&hl=30ppmКварц "10ppm". видел такие часовые и ещё должны быть на другие частоты. Бля ник соседа. Колян простит
Сообщение отредактировал foxit - Jul 13 2008, 09:16
|
|
|
|
|
Jul 13 2008, 09:28
|
Участник

Группа: Участник
Сообщений: 63
Регистрация: 17-04-07
Пользователь №: 27 098

|
Цитата(Tiny @ Jul 13 2008, 10:32)  Есть ли выход из данного положения? Можно ли обойтись без кварца на 3.6864MHz? смотрим описание мастера шины и2с , генерим задержки согласно рекомендациям производителя DS1820, заглядываем к атмелу, ставим подтягивающие резисторы, выдерживаем длину кабеля, проверяем работоспобность контроллера, шьём провильно фусы. если нет, создаём новую тему с подробным описанием проблемы и не суём термодатчик в тему измерения частоты.
Причина редактирования: Излишнее цитирование.
|
|
|
|
|
Jul 13 2008, 13:08
|

Местный
  
Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530

|
Цитата(foxit @ Jul 13 2008, 12:16)  Кварц "10ppm". видел такие часовые и ещё должны быть на другие частоты. и ещё добавлю, что после предделителя я бы использовал бы плиску в качестве ассинхронного счётчика, результаты с счётчика завёл бы на контроллер с которого можно спокойно выводить на индикатор, это добавит максимум 7 баксов стоимости. более подробно посмотрите тут тут
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
|
Jul 14 2008, 14:47
|

За битами по регистрам гоняюсь
  
Группа: Свой
Сообщений: 457
Регистрация: 24-04-06
Из: Таганрог
Пользователь №: 16 446

|
Цитата(foxit @ Jul 13 2008, 13:28)  ...смотрим описание мастера шины и2с , генерим задержки согласно рекомендациям производителя DS1820 ... Всё-таки, наверное, не I2C, а 1-Wire. Однако, допуски на задержки там достаточно велики, я менял кварцы +/- 3 мГц без всяких последствий, длина проводов тоже не особенно критична.
--------------------
Курсор влево, курсор вправо - считается хакерством. FORMAT C: производится без предупреждения
|
|
|
|
|
Oct 13 2009, 04:12
|

Участник

Группа: Участник
Сообщений: 41
Регистрация: 12-10-09
Пользователь №: 52 882

|
Цитата(akl @ Jul 11 2008, 18:58)  Как Вам такой алгоритм: Все вроде бы понятно, кроме "A-коэффициент деления LMX". что это?
Причина редактирования: Излишнее цитирование.
--------------------
coding, кодинг, koDinГ, copyriting, printing ....
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|