| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > Частотомер на PIC |
| Автор: konst696 1.9.2004, 13:38 |
| Привет всем! Хочу написать прогу для частотомера под p16f84a Столкнулся с проблемой, как заставить поделить контроллер кол-во полученых импульсов на время. Покопался в инете на эту тему, посмотрел исходники для частотомеров, но это меня еще больше запутало. Помогите разобраться, может вообще следует использовать другой метод измерения частоты. Заранее благодарен. |
| Автор: serg1 2.9.2004, 05:30 |
| Я бы использовал такой алгоритм. Подавал на вход прерывания INT0 импульсы, чпстоту которых надо измерить, и по передним фронтам запускал и останавливал таймер. Помоему фсё |
| Автор: cardinal 2.9.2004, 10:37 | ||
konst696, выкладывай те места, которые тебя запутали... |
| Автор: PILOT 2.9.2004, 13:23 |
| Зачем делить? Показываешь кол-во импульсов за 1 сек и все. СУВ. |
| Автор: lummox 30.9.2004, 13:39 | ||
Ну да, если частоты порядка кГц, а требуемая точность порядка 3 знаков. Если же меряются десятки Герц, то для достижения той же точности понадобятся десятки секунд. Быстрый результат можно получить измерив период сигнала, а частоту вычислить взяв обратную величину. Видимо это имелось ввиду. Тогда придётся делить эталонную частоту на кол-во импульсов этой частоты за период измеряемого сигнала. |
| Автор: avtar 18.11.2004, 11:50 |
| пример деления 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 8.12.2004, 13:42 |
| Благодарю всех за ответы |
| Автор: Гость_Alex 4.1.2005, 15:50 |
| Можно сделать следующим образом: у таймера есть предделитель и есть синхронизация с внешним сигналом. Внешним сигналом у нас будет опорный генератор, допустим на 32768 Гц. Тогда установив предделитель Мы можем добиться чтобы таймер работал ровно секунду. А пока он работает мы считаем импульсы. По кривому, а можно другим таймером юзая его как счетчик, а по прерывания от первого таймера останавливаем счет импульсов. Таким образом у нас будет переменная соджержащая кол-во импульсов за интервал времени, который задается предделителем и точность нашего частотомера зависит от точности задающего генератора |