|
И снова частотомер на 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
|
|
|
|
|
 |
Ответов
|
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
|
|
|
|
Сообщений в этой теме
Peeoner И снова частотомер на Atmega8. Jul 10 2008, 23:45 defunct Цитата(Peeoner @ Jul 11 2008, 02:45) Пишу... Jul 11 2008, 00:10 Peeoner Ну вот все проверил,дествительно глюк именно в пре... Jul 11 2008, 03:42 zhevak Цитата(Peeoner @ Jul 11 2008, 09:42) Тепе... Jul 11 2008, 05:45 Nanobyte Цитата(Peeoner @ Jul 11 2008, 07:42) ...В... Jul 11 2008, 10:21 Qwertty Цитата(Peeoner @ Jul 11 2008, 07:42) глюк... Jul 11 2008, 12:59 =GM= Цитата(Peeoner @ Jul 10 2008, 22:45) Почи... Jul 11 2008, 12:33 akl Цитата(Peeoner @ Jul 11 2008, 04:45) ...в... Jul 11 2008, 12:58 Sneg_87 Цитата(akl @ Jul 11 2008, 18:58) Как Вам ... Oct 13 2009, 04:12 Peeoner ЦитатаПосмотрел вашу ссылку, там моя переписка с Я... Jul 11 2008, 15:09 zltigo Цитата(Peeoner @ Jul 11 2008, 17:09) Ну в... Jul 11 2008, 15:22  zhevak Цитата(zltigo @ Jul 11 2008, 21:22) Moder... Jul 11 2008, 15:37 =GM= Цитата(Peeoner @ Jul 11 2008, 14:09) А на... Jul 11 2008, 16:15  Peeoner Цитата(=GM= @ Jul 11 2008, 19:15) Ну-у-у,... Jul 11 2008, 16:22  Огурцов Цитата(=GM= @ Jul 11 2008, 16:15) На ATti... Jul 11 2008, 17:29   sKWO Цитата(Огурцов @ Jul 11 2008, 21:29) Точн... Jul 11 2008, 19:09    Огурцов Цитата(sKWO @ Jul 11 2008, 19:09) для коп... Jul 11 2008, 19:41    gte Цитата(sKWO @ Jul 11 2008, 23:09) термост... Jul 12 2008, 07:01     sKWO Цитата(gte @ Jul 12 2008, 11:01) И скольк... Jul 12 2008, 16:59      Огурцов Цитата(sKWO @ Jul 12 2008, 16:59) Полагаю... Jul 12 2008, 20:16       foxit Цитата(Огурцов @ Jul 12 2008, 23:16) Ну В... Jul 13 2008, 09:16        sKWO Цитата(foxit @ Jul 13 2008, 12:16) Кварц ... Jul 13 2008, 13:08 Peeoner Правила читал.Вроде не че такого не сказал,забанит... Jul 11 2008, 15:34 zltigo Цитата(Peeoner @ Jul 11 2008, 17:34) Прав... Jul 11 2008, 15:41 Peeoner Спасибо,понял. Народ почемуто тут везде исходники ... Jul 11 2008, 15:45 zltigo Цитата(Peeoner @ Jul 11 2008, 17:45) Наро... Jul 11 2008, 15:51 Peeoner Ну вобщем решил я реализовать метод =GM=,как бы вр... Jul 12 2008, 09:30 Tiny Такой вопрос.
CodeVision, пример из пакета \c... Jul 13 2008, 07:32 foxit Цитата(Tiny @ Jul 13 2008, 10:32) Есть ли... Jul 13 2008, 09:28  Nanobyte Цитата(foxit @ Jul 13 2008, 13:28) ...смо... Jul 14 2008, 14:47 Tiny Извиняюсь, почему-то я разместил свое сообщение не... Jul 13 2008, 09:20 akl Здравствуйте. Имелась в виду LMX2326 в качестве пр... Oct 14 2009, 03:00
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|