|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 12:36 am
| Автор |
Съобщение |
|
daniel_stefanov
Ранг: Ориентиран
Регистриран на: Нед Мар 27, 2005 12:40 am Мнения: 206 Местоположение: София
|
Здравейте,
Позволявам си да продължа тази тема за честотомера на jei (надявам се той да няма нищо против), за да не се налага да отварям нова тема за едно и също нещо. Въпреки това мисля, че темата е за Академия. Не искам готови схеми или каквото и да е. Искам аз да го направя и да разбера нещата.
От два дни се опитвам да пиша на MikroC for PIC (не знам дали е добър избор) и реших първата по-сериозна задачка да е честотомер. Хубавото на задачката, е че лесно се тества с Proteus и така мога да проверя работи ли програмката или не.
Ще работя с PIC16F877 и 2x16 LCD Display
Нека да започна с първият въпрос, който винаги ми е бил голям проблем - На базата на какво избирам честотата на кварца? Обикновено слагам 20MHz за да се презапася. За какво и аз незнам. Звучи ми най-бързо. Вероятно се избира от конкретната задача, но как? Примерно честотомера искам да мери от 1Hz до 10MHz. Какъв кварц да избера? Какъв е оптималният вариант? Има ли разлика в подхода на мерене ако искам честотомера ми да мери от 1Hz до 1MHz или 100KHz?
Знам, че честотата е обратно пропорционална на периода на импулса на който ще меря честотата, но не знам на този период как му премеря времето? Знам че това време се свързва с честотата на кварца по някакъв начин, но не знам как. Бихте ли ми разяснили малко теоретичната част на въпроса. Ами засега е това, но ще имам още въпроси  . Поздрави.
|
| Чет Апр 20, 2006 9:38 pm |
|
 |
|
plameniv
Ранг: Форумен бог
Регистриран на: Нед Окт 10, 2004 9:55 am Мнения: 1718
|
 Mda
 |  |  |  | daniel_stefanov написа: Здравейте, Позволявам си да продължа тази тема за честотомера на jei (надявам се той да няма нищо против), за да не се налага да отварям нова тема за едно и също нещо. Въпреки това мисля, че темата е за Академия. Не искам готови схеми или каквото и да е. Искам аз да го направя и да разбера нещата. От два дни се опитвам да пиша на MikroC for PIC (не знам дали е добър избор) и реших първата по-сериозна задачка да е честотомер. Хубавото на задачката, е че лесно се тества с Proteus и така мога да проверя работи ли програмката или не. Ще работя с PIC16F877 и 2x16 LCD Display Нека да започна с първият въпрос, който винаги ми е бил голям проблем - На базата на какво избирам честотата на кварца? Обикновено слагам 20MHz за да се презапася. За какво и аз незнам. Звучи ми най-бързо. Вероятно се избира от конкретната задача, но как? Примерно честотомера искам да мери от 1Hz до 10MHz. Какъв кварц да избера? Какъв е оптималният вариант? Има ли разлика в подхода на мерене ако искам честотомера ми да мери от 1Hz до 1MHz или 100KHz? Знам, че честотата е обратно пропорционална на периода на импулса на който ще меря честотата, но не знам на този период как му премеря времето? Знам че това време се свързва с честотата на кварца по някакъв начин, но не знам как. Бихте ли ми разяснили малко теоретичната част на въпроса. Ами засега е това, но ще имам още въпроси  . Поздрави. |  |  |  |  |
Зависи каква точност искаш да постигнеш , но е безсмислено да слагаш такава голяма гъсеница за един прост честотомер, вземи си нещо по евтино и по малко , като например 16Ф88 или по малък дори 16ф630 .
потърси в руските сайтове има доста готови решения и кодове с тях
http://www.rlocman.ru/shem/shem.html?rz=14&fs=60
|
| Чет Апр 20, 2006 10:20 pm |
|
 |
|
daniel_stefanov
Ранг: Ориентиран
Регистриран на: Нед Мар 27, 2005 12:40 am Мнения: 206 Местоположение: София
|
За гъсеницата 16F877  - това имам и предпочитам него да тренирам. Ще продължа задачките с него докато ми се изясни Cто за Пикове  . А готови схемни решения и готови кодове за сега не ме интересуват, защото ще пропусна да науча много неща ако сам не се пробвам. Надявам се, че ще помагате. 
|
| Чет Апр 20, 2006 10:29 pm |
|
 |
|
milenjs
Ранг: Форумен бог
Регистриран на: Сря Мар 08, 2006 2:12 pm Мнения: 2017 Местоположение: Котел
|
Ами в момента правя един такъв.... Значи приемам идеи с цел максимална функционалност.
До тука имам -
1. Честотомер с възможност за ръчен/автоматичен режим на смяна на обхватите (Hz,KHz,Mhz,Ghz), ръчно или автоматично избиране на времевата база 1 или 0.1с., произволно добавяне-изваждане на честота от текущото показание(Shift), 2 входа А и В - пак автоматично / ръчно избираеми по критерии наличие на импулси, възможност за избор на коефицент на делител вкlючен към вход В, режим nА+В, А-В, А/В.
2. Периодомер (или както там се казва) - до 2^16 мкс.
3. Брояч до xxxxxxxx импулса.
4. Замисъл - като имам свободно време - RS232 връзка...
Какво да добавя още? Хардуера е Пик16 с такт 4Мхз, 2 варианта - с LCD 2х16 и такова от Nokia 3310. Разделителна способност до 30-35 МHz - 1 Хз, от там нагоре - по коефицента на делителя. Написано на Proton Basic + asm за "тънките места"...
Иначе схеми бол по нета - аз използвах алгоритъма с анализ на прескалера - наистина просто и елегантно, евала на този (май руснак) на които му е дошло на акъла.
Ако някой го интересуват подробности и съвети по реализацията да пише тук или на ЛС.
|
| Чет Апр 20, 2006 10:36 pm |
|
 |
|
daniel_stefanov
Ранг: Ориентиран
Регистриран на: Нед Мар 27, 2005 12:40 am Мнения: 206 Местоположение: София
|
Ами сложи му и един червен бутон за топлата вода  . Ами повече от това, което си направил....не виждам какво. Да можех само едно от нещата които си изброил да направя, щеше да е добре  . Моля те дай малко разяснения по теоретичната част на измерването. На кой пин на контролера подаваш сигнала? Защо на него? Какво правиш със сигнала след това, обработка и т.н. Как избираш да е 4MHz, а не например 20MHz? Какъв е този метод, който описваш - алгоритъма с анализ на прескалера? Благодаря ти.
|
| Чет Апр 20, 2006 11:09 pm |
|
 |
|
evc
Ранг: Напреднал
Регистриран на: Пет Окт 21, 2005 8:45 am Мнения: 499
|
@milenjs, на времето като разработвах нашия оборотомер, се получиха много запитвания от клиенти за запомняне на няколко стойности и възможност за определяне на максимална стойност на оборотите за определен период от време.
_________________ Простотията е Божи дар, но човек не бива да парадира с подаръците си!
|
| Пет Апр 21, 2006 8:25 am |
|
 |
|
milenjs
Ранг: Форумен бог
Регистриран на: Сря Мар 08, 2006 2:12 pm Мнения: 2017 Местоположение: Котел
|
Идеята е следната - измерваш честота постъпваща на ТМР0, конфигуриран с прескалера. Това е така защото прескалера е бърз и позволява входни импулси до около 50Мхз. Кофтито е че не може да се чете. За това се анализира съдържанието му след края на всяко измерване - подаваш му импулси от някой пин на процесора,следиш за препълване - това което е в него е 255-броя на подадените импулси. Разгледай долния код ще видиш как става. R1, R2 i R3 са коефиценти за времевата база - нагласят се според кварца който имаш.
Кода е за работа с LCD дисплей, за LED е малко по изчанчен поради естеството на този тип индикация
Fasm_01s:
ASM
;=====================================================================================
; It is time to prepare new measuring cycle - 0.1 sec
;=====================================================================================
;Measure_100msec
movlw T1 ; set initial counter values
movwf R1
movlw T2
movwf R2
movlw T3
movwf R3
GoTo CT
;=====================================================================================
; It is time to prepare new measuring cycle - 1 sec
;=====================================================================================
Fasm_1s:
movlw Q1 ; set initial counter values
movwf R1
movlw Q2
movwf R2
movlw Q3
movwf R3
CT clrf TimerH
clrf TMR0
clrf INTCON ; global INT disable, TMR0 INT disable
; clear TMR0 overflow bite
;=====================================================================================
; Start measurement: RA3 + RA4 set input
;=====================================================================================
bcf PORTA, 3
bsf STATUS,RP0
bsf TRISA,3 ; make RA3 input
bcf STATUS,RP0
; It is opened now...
Cycle btfss INTCON,2 ; 1 Test for TMR0 overflow
GoTo Nothing ; 3
incf TimerH,F ; 3
bcf INTCON,2 ; 4
GoTo Nxt ; 6
Nothing
nop ; 4
nop ; 5
nop ; 6
Nxt
decfsz R1,F ; 7
GoTo Cycle ; 9
movlw T1 ; 9*T1
movwf R1 ; 9*T1+1
decfsz R2,F ; 9*T1+2
GoTo Cycle ; 9*T1+4
movlw T2 ;(9*T1+4)*T2
movwf R2 ;(9*T1+4)*T2+1
decfsz R3,F ;(9*T1+4)*T2+2
GoTo Cycle ;(9*T1+4)*T2+4
;((9*T1+4)*T2+4)*T3-1
;=====================================================================================
; Short fine tuning delay - enable it if needed.....
;=====================================================================================
; movlw .1
; movwf Help
;CCC
; decfsz Help,F
; goto CCC
nop ;((9*T1+4)*T2+4)*T3
;=====================================================================================
; Final test for TMR0 overflow
;=====================================================================================
movlw T4 ;((9*T1+4)*T2+4)*T3
movwf Help ;((9*T1+4)*T2+4)*T3+1
Cycle2
btfss INTCON,2 ; 1
GoTo Not2Do ; 3
incf TimerH,F ; 3
bcf INTCON,2 ; 4
GoTo Nx ; 6
Not2Do
nop ; 4
nop ; 5
nop ; 6
Nx
; nop ; fine tuning nops
; nop
; nop
decfsz Help,F ; 7+X
GoTo Cycle2 ; 9+X
;=====================================================================================
; Stop the measurement
;=====================================================================================
clrw ; (9+X)*T4
bsf PORTA,4 ; 3 W -> PORTA
bcf PORTA,3
bsf STATUS,RP0 ; 4
nop
bcf TRISA,3 ; RA3 output
bcf STATUS,RP0 ;
;=====================================================================================
; Analyse precounter and store counted value in registers
;=====================================================================================
movf TMR0,W
movwf TimerM ; TMR0 -> MidB
clrf TimerL
CountIt
incf TimerL,F
bsf PORTA,3 ; _| false impulz
bcf PORTA,3 ; |_
bcf INTCON,2
movf TMR0,W ; actual TMR0 -> W
bcf STATUS,Z
subwf TimerM,W
btfsc STATUS,Z
GoTo CountIt
incf TimerL,F
comf TimerL,F
incf TimerL,F
incf TimerL,F
ENDASM 
|
| Пет Апр 21, 2006 8:25 am |
|
 |
|
milenjs
Ранг: Форумен бог
Регистриран на: Сря Мар 08, 2006 2:12 pm Мнения: 2017 Местоположение: Котел
|
@еvc - наистина е добре да има и Memory Hold режим - за максимални и минимални стойности, като се замисля ще стане с няколко реда, само ще видя как ще се отрази на големината на кода че трябва до 2к..., в краен случай друг процесор. Благодаря за ценната идея - не че почти всеки ден не я ползвам на мултицета си ма кой да се сети 
|
| Пет Апр 21, 2006 8:32 am |
|
 |
|
daniel_stefanov
Ранг: Ориентиран
Регистриран на: Нед Мар 27, 2005 12:40 am Мнения: 206 Местоположение: София
|
milenjs, ще разгледам сорса, който си ми дал и ще опитам да направя нещо. Благодаря за идеята  .
|
| Пет Апр 21, 2006 6:45 pm |
|
 |
|
daniel_stefanov
Ранг: Ориентиран
Регистриран на: Нед Мар 27, 2005 12:40 am Мнения: 206 Местоположение: София
|
Нещо не мога да се оправя с този честотомер. Дайте, моля малко повече инфо за теоретичната част на задачката. С Генератор (1KHz) съм подал на краче RA4 на ПИКа, но нещо не ми стартира таймера. Пoлзвам ТМR0. Как да конфигурирам таймера, така че когато имам импулс с преход от нисък към висок фронт да започне да брои? Как мога да определя при честота 4МХз, колко е времето за пълнене на таймера? Нещо не мога да го сметна. Егати, откачих с тоя честотомер  . Благодаря.
|
| Сря Апр 26, 2006 2:42 pm |
|
 |
|
Dimiter
Ранг: Популярен
Регистриран на: Пет Фев 04, 2005 3:18 pm Мнения: 309 Местоположение: Sofia
|
@daniel_stefanov
Timer 1 е 16 битов и може да бъде ползван като брояч с външен такт
и делител по желание , мисля ,че работеше до 50мгхц
на практика можеш с бавен кварц да направиш каквото и с бърз
не виждам голям проблем да си конфигурираш таймера както ти е кеф
да го нулираш
да изчакваш някакъв еталонен времеотрязък
и да прочетеш съдържанието на таймера
не съм го правил досега щото повече ме спъва входната част
но за цифрови сигнали мисля ще е лесно 
|
| Сря Апр 26, 2006 3:33 pm |
|
 |
|
setoy
Ранг: Почетен член
Регистриран на: Пет Фев 17, 2006 9:17 am Мнения: 765 Местоположение: Стара Загора
|
Разгледай option регистъра, там се намира всичко,което те интересува  При 4 Мхз - времето ти за 1 инструкция е 1 микросекунда. Прескалера за ТМР0 може да е от 2 до 256 (2 е най-малкото). Значи.... ако ТМР0 е конфигуриран да нараства с вътрешния клок, той се препълва за 512 микросекунди с прескалер 2, 1024 с прескалер 4 и така нататък.
|
| Сря Апр 26, 2006 3:34 pm |
|
 |
|
milenjs
Ранг: Форумен бог
Регистриран на: Сря Мар 08, 2006 2:12 pm Мнения: 2017 Местоположение: Котел
|
Ако използваш таймер с вътрешен такт за генериране на измервателен период, то периода трябва да е кратен на 1с сек. за да не ти се налага да правиш сметки и.т.н, затова в този случай трябва да използваш кварц на честота кратна на 2 за осцилатора на PIC-a. Това се налага защото за 1мкс такт ще имаш прекъсване на 1024 мкс а не на 1000, а бе по лесно става с такъв. Например такъв от ел.часовник....
|
| Сря Апр 26, 2006 9:05 pm |
|
 |
|
daniel_stefanov
Ранг: Ориентиран
Регистриран на: Нед Мар 27, 2005 12:40 am Мнения: 206 Местоположение: София
|
Благодаря, момчета. Веднага започвам да експериментирам. Setoy, ако съм разбрал правилно тогава при 20MHz една инструкцията ще се изпълнява за 0,2us и ако прескалера на TMR0 е конфигуриран на 1:256, тогава таймера ще препълва за 13,1072ms. И още нещо което не ми стана ясно. Като конфигурирам TMR0 в режим на таймер (а не брояч) - бит T0CS го правя 0, това означава че той започва да инкрементира на всеки instruction cycle (цикъл на инструкцията???). А аз искам да започне да инкрементира когато направя един бутон и при неговото натискане да започне да инкрементира. С този бутон ще симулирам като начало постъпването на импулс с определена честота. Как да направя това?
Сетих се и още нещо. Когато излизам от прекъсване трбва ли да сетна в 1 T0IE вътре в самото прекъсване? Също така налага ли се да установя в 0 T0IF пак вътре в прекъсването. И в каква последователност трябва да го направя? Благодаря
|
| Сря Апр 26, 2006 10:01 pm |
|
 |
|
daniel_stefanov
Ранг: Ориентиран
Регистриран на: Нед Мар 27, 2005 12:40 am Мнения: 206 Местоположение: София
|
milenjs, това беше следващият ми въпрос  . Аз си мисля също, че ако използвам такъв осцилатор, сметките ще са по-лесни. Този от часовник (32768Hz) предполагам имаш в предвид, не е ли с много ниска честота? Дали ще свърши работа? Мога ли да ползвам друг с по-висока честота и какъв би ми препоръчал. Благодаря ти.
|
| Чет Апр 27, 2006 1:39 am |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 4 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|