![]() |
|
Модераторы: PILOT, ManiaK, Mazzi |
![]()
|
|
| konst696 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 10.8.2004 Репутация: нет Всего: нет |
Привет всем!
Хочу написать прогу для частотомера под p16f84a Столкнулся с проблемой, как заставить поделить контроллер кол-во полученых импульсов на время. Покопался в инете на эту тему, посмотрел исходники для частотомеров, но это меня еще больше запутало. Помогите разобраться, может вообще следует использовать другой метод измерения частоты. Заранее благодарен. |
|||
|
||||
| serg1 |
|
|||
|
Unregistered |
Я бы использовал такой алгоритм.
Подавал на вход прерывания INT0 импульсы, чпстоту которых надо измерить, и по передним фронтам запускал и останавливал таймер. Помоему фсё |
|||
|
||||
| cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 8 Всего: 99 |
konst696, выкладывай те места, которые тебя запутали... -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
| PILOT |
|
|||
|
производство ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2724 Регистрация: 4.4.2002 Где: москва Репутация: 20 Всего: 54 |
Зачем делить?
Показываешь кол-во импульсов за 1 сек и все. СУВ. -------------------- тут могла быть Ваша реклама... |
|||
|
||||
| lummox |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 18.6.2003 Репутация: нет Всего: нет |
Ну да, если частоты порядка кГц, а требуемая точность порядка 3 знаков. Если же меряются десятки Герц, то для достижения той же точности понадобятся десятки секунд. Быстрый результат можно получить измерив период сигнала, а частоту вычислить взяв обратную величину. Видимо это имелось ввиду. Тогда придётся делить эталонную частоту на кол-во импульсов этой частоты за период измеряемого сигнала. |
|||
|
||||
| avtar |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 18.11.2004 Репутация: нет Всего: нет |
пример деления 32/32
на PIC16F628 при 20МГц время выполнения 265 мкС ;--------------------------------------------------------------------- ;------- HEADER ---------- ;--------------------------------------------------------------------- ; FredMaher Madrid 30 Sept 02 [email protected] ; Tony Newton's 24џ24 routine with worked example ;Доработано до 32/32 Тарасов А.в. LIST P=16F628 ; 16F628 Runs at 20 MHz INCLUDE "p16F628.inc" __CONFIG _CP_OFF & _WDT_OFF & _HS_OSC & _PWRTE_ON & _LVP_OFF & _BODEN_OFF ERRORLEVEL -224 ; suppress annoying message because of tris ERRORLEVEL -302 ; suppress message because of page change ;__FUSES _PWRTE_ON & _CP_OFF & _WDT_ON & _HS_OSC & _LVP_OFF & _MCLRE_OFF & _BODEN_OFF ; asds ; Define Information ;#DEFINE RS PORTA, 2 ;#DEFINE E PORTA, 3 ;#DEFINE TOGGLESW PORTB, 6 ; not used at the moment ;#DEFINE LED PORTB, 5 ; Macro Bank0 macro bcf STATUS, RP0 ;Выбор bank 0 bcf STATUS, RP1 endm Bank1 macro bsf STATUS, RP0 ;Выбор bank 1 bcf STATUS, RP1 endm ;--------------------------------------------------------------- CBLOCK 20H ; from 20C to 7F = 67 ;--------------------------------------------------------------- ; MATH ROUTINES ; 32 / 32 Div --> 32 ; TONY NIXON's Algorithm starts here + my retouching+ДОРАБОТКА ДО 32 РАЗРЯДОВ ; SUBROUTINE - 32/32 Деление ; Константа или делимое: nratorC nratorH nratorM nratorL ; Делитель: denomC denomH denomM denomL ; ; Результат: nratorC nratorH nratorM nratorL ; Остаток: remainC remainH remainM remainL nratorC ;20Н константа или делимое для деления,при выходе из п.п. результат деления nratorH nratorM nratorL denomC ;24Н делитель из счетчика импульсов denomH denomM denomL remainC ;28Н Остаток remainH remainM remainL shiftC ;32H Временный регистр счетчик сдвигов shiftH shiftM shiftL BCount ;------------------------------------------------------------------- ENDC ; end of definition block ;------------------------------------------------------------------- ORG 0 ; Старт с 0 goto Main ; jump over to main routine Main: call Div32 Homesweethome nop goto Homesweethome Div32 ;Пример 1000000000/625= 3B9ACA00h / 271h =1600000 ( remainder... remain/denom gives the decimal correctly... = Dec 0.962) movlw 0x3B ; Ввод константы (делимого) movwf nratorC movlw 0x9A movwf nratorH movlw 0xCA movwf nratorM movlw 0x00 movwf nratorL movlw 0x00 ; Ввод делителя movwf denomC movlw 0x00 movwf denomH movlw 0x00 movwf denomM movlw 0x01 movwf denomL divizn movlw .32 movwf BCount movf nratorC,w movwf shiftC movf nratorH,w movwf shiftH movf nratorM,w movwf shiftM movf nratorL,w movwf shiftL clrf nratorC clrf nratorH clrf nratorM clrf nratorL clrf remainC clrf remainH clrf remainM clrf remainL dloop bcf STATUS,C rlf shiftL,f rlf shiftM,f rlf shiftH,f rlf shiftC,f rlf remainL,f rlf remainM,f rlf remainH,f rlf remainC,f ; movf denomC,w subwf remainC,w btfss STATUS,Z goto nochk ; movf denomH,w subwf remainH,w btfss STATUS,Z goto nochk ; movf denomM,w subwf remainM,w btfss STATUS,Z goto nochk ; movf denomL,w subwf remainL,w nochk btfss STATUS,C goto nogo ; movf denomL,w subwf remainL,f btfss STATUS,C decf remainM,f movf remainM,w xorlw 0xff btfsc STATUS,Z decf remainH,f movf denomM,w subwf remainM,f btfss STATUS,C decf remainH,f movf denomH,w subwf remainH,f btfss STATUS,C decf remainC,f movf denomC,w subwf remainC,f bsf STATUS,C nogo: rlf nratorL,f rlf nratorM,f rlf nratorH,f rlf nratorC,f decfsz BCount,f goto dloop ; Return end |
|||
|
||||
| konst696 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 10.8.2004 Репутация: нет Всего: нет |
Благодарю всех за ответы
|
|||
|
||||
| Гость_Alex |
|
|||
|
Unregistered |
Можно сделать следующим образом: у таймера есть предделитель и есть синхронизация с внешним сигналом. Внешним сигналом у нас будет опорный генератор, допустим на 32768 Гц. Тогда установив предделитель Мы можем добиться чтобы таймер работал ровно секунду. А пока он работает мы считаем импульсы. По кривому, а можно другим таймером юзая его как счетчик, а по прерывания от первого таймера останавливаем счет импульсов. Таким образом у нас будет переменная соджержащая кол-во импульсов за интервал времени, который задается предделителем и точность нашего частотомера зависит от точности задающего генератора
|
|||
|
||||
![]()
|
| Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)" | |
|
|
На данный раздел помимо Правил форума распространяются текже следующие правила:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |