Използване на таймер функция в PIC16F877A

S

sycluap

Guest
Бих искал да попитам, как да използвате функцията таймер в микроконтролера да получите разликата между начален час и да се спре, а след това да го покажете на LCD.Например, включете натискане веднъж за да стартирате таймера, натиснете отново, за да спрете таймера, тогава разликата между начален час и време спирам се изчислява и показва на LCD.Аз правя на програмния използване PicBasic Pro.

Мога ли да попитам може това да се направи?Аз съм новак в използването на общата микроконтролера, Надявам се да помогне.Благодаря предварително на всички експерти.

 
Разбира се, че може да се направи.
В зависимост от това колко код, който трябва да тече, можете да изберете един прекъсва подход или подход изборите.

За изборите, просто наблюдавате вход за закрепване и когато тя промени държавата, можете да стартирате таймера.Тогава следи ПИН отново и да спрете таймера, когато състоянието на ПИН промени обратно.Таймерът съдържание, са времето, което се нуждаете.
Разбира се, с този подход ви Wil изгубите няколко цикъла инструкция, но работи в 20MHz вашето обучение цикъл е 200ns.Така че, ако загубят 5 цикъла, губите само 1us.

Ако това е проблем, то тогава можете да опитате да използвате на ККП в PIC16F877A.
Задайте го да запечатате всеки нарастващия фронт.Така съдържанието на таймера ще се суче, когато нарастващия фронт се случи.В същото време, получавате и четете прекъсване на гърдата съдържанието таймер и да ги запишете.На другия край на ново съдържание таймерът ще се суче и получавате прекъсвам.Изваждане на двете гърдата ценности и получавате точния час, между събитията, защото всички вече се извършва в ТВ, не загубят всички цикли.
Всичко зависи от реалните ви изисквания.

 
График точност е много критични за моя проект, като по този начин, мисля, че най-добрият метод е метод, който не ще загубят всички цикли.

Въпреки това, аз първо ще започнем с избирателните метод, за да свикне с кодове, както аз съм напълно нови.Как да декларира функция таймер за да се използва и контрол на ПИН промени?Как да се съхранява времето разликата в променлива и да го покажете на LCD?Може ли да ме упъти по-нататък в този въпрос?Аз съм за кодиране използва PicBasic Pro.

Много много благодаря!

 
Най-точно е наистина един на използване на ККП, но дори, че има някои ограничения по отношение на резолюцията.Мисля, че най-добра резолюция можете да получите е 0.2us, когато осцилатор се пускат в 20MHz.

 
Привет,

Ако www.picbasic.uk.co Гото ще намерите много теми относно използването на таймери.Почти всичко, което може да поиска за включване на много пример код.Също така опитайте www.melabs.com.

HTH,

BobK

 
Благодаря за отговора ВВВ и BobK.Аз не съм намерил един пример проект (олимпийски таймер), който е много подобен на това, което ми трябва за мен проект във форума появяват.

Въпреки това, аз съм изправена пред проблем, който трябва да разчита на таймера в интервал от 1ms.Това, което може да получи и да научите е 10ms интервал.

Експертът в този форум ми предложи да се промени предварително Timer1 стойност се регистрирайте за да отговарят на 1ms интервал.Но аз не знам как да го получи, без значение каква стойност да променя, таймерът стане дори и бавно се сравни с 10ms интервал.Може ли някой да ме научи как да се изчисли предварително действителната стойност за Timer1 регистър, така че мога да получа 1ms таймер вместо 10ms?Аз съм с 16F877A и 4MHZ часовник, и аз съм кодиране в PicBasic Pro.

Моля, вижте тук. Http://www.picbasic.co.uk/forum/showthread.php?t=7729

Или има ли по-добро решение да се 1ms интервал на времето?

1ms интервал е много важно за моя проект.Моля, помогнете.

 
Аз съжалявам, аз не разбирам изискванията вече: Имате ли нужда от резолюция на 1ms или ви е нужен за измерване на времеви интервали в интервала 1ms с възможно най-добрата резолюция?

За 1ms разделителната способност, която можете просто да използвате на общественото мнение, дори и най-4MHz.
Ако имате нужда от по-добра резолюция, а след това отново ви предлагам да използвате ККП, който ще ви позволи да се измери с разделителна способност от 1us най-4MHz.

Не мога да помогна с PICBasic, аз съм човек на асемблер.

 
Аз съжалявам за вземане на изискването неясно.Всъщност, аз трябва да таймер за брой в 1ms резолюция.Това означава, че, таймерът ще преброи в 1ms стойност и нарастване на LCD дисплея.Аз например, ако натиснете бутона "Старт", таймерът ще започнем да броим в 1ms увеличение, докато не спрете натиснете бутона, броят стойност ще бъдат показани на LCD.

В TIMER1 функция Знам как да използвате, проблемът е, че да не знаят как да настроите TIMER1 стойност регистър, така че той може да бъде в 1ms резолюция, както и да го покажете на LCD.

Може би за кодиране на асемблер ще помогне?

 
Добре, сега разбирам.

Можете да използвате TMR1 да генерира прекъсва на всеки 1ms.
За да направите това, презареждат на таймера с qantity, че ще направи преливане в 1ms.
За пример: Да приемем, осцилатора е 4MHz.Тогава TMR1 часовник е 1MHz.Това означава, че трябва 1000 броя за 1ms.Така презареждат на таймер с 65536-1000 = 64536.

След това тя ще генерира iterrupt всеки 1ms.В ISR, нарастване чифт на регистрите (или повече), който ще ви бъде MS брояч.Тези регистри се изчиства, когато първият нарастващия фронт е открита и втората чета на нарастващия фронт.Това е времето, в MS между краищата, което е това, което ви трябва.

Имайте предвид, че трябва да се направи debouncing в хардуера.Така че кода може да изглежда така:
Код:# определят БУТОНА PORTB, 0ORG 0x00; нулиране векторОтидох в главното;
ORG 0x04; Прекъсване векторmovwf W_temp; освен W

swapf СТАТУС, W; освен обл статут

movwf STATUS_temp;

clrf статут; да сме сигурни, че са в банкови 0, въпреки че ние не се сменят банки тукФБК PIR1, T1IF; ясно прекъсват флагФБК INTCON, T1ON; спрете таймера

movlw високо (.65536 -. 1000); презареди таймер; стойност може да се наложи да се коригират леко, за да получите точно 1ms

movwf TMR1H;

movlw ниско (.65536 -. 1000);

movwf TMR1L;incfsz брояч, F; увеличение на 16-битов MS брояч

incf Counter 1, F;swapf STATUS_temp, W; възстановяване на регистрите

movwf статут;

swapf W_temp, F;

swapf W_temp, W;

retfie; връщане
начало:; основните код; вложа цялата си initializations тукclrf Counter; ясно на 16-битов брояч

clrf Counter 1;movlw B'10000000 '; позволи прекъсва като цяло

movwf INTCON;Wait_h: btfss бутон; чакам тук, докато бутона натиснат

Отидох в Wait_h;movlw високо (.65536 -. 1000); презареждат таймер; стойност може да бъде променена, така че първото прекъсване настъпи точно след 1ms

movwf TMR1H;

movlw ниско (.65536 -. 1000);

movwf TMR1L;BSF T1CON, TMR1ON; включите TMR1

ФБК PIR1, T1IF; ясно TMR1 прекъсват флаг, само в случай,

BSF INTCON, PIEI; позволи периферия прекъсва (TMR1 е периферен)Wait_l: btfsc бутон; чака бутон, за да бъде освободен

Отидох в Wait_l;Wait_r: btfss бутон; чакам за нарастващия фронт тук

Отидох в Wait_r;ФБК T1CON; спре TMR1

ФБК INTCON, PIEI; забраните периферни прекъсватповикване Display; покана на рутинни, който показва времето на LCDclrf Counter; ясно на 16-битов брояч

clrf Counter 1;Wait_f: btfsc бутон; сега чакам тук за попадащи край

Отидох в Wait_f;Отидох в Wait_h; повторно започване на цикъл

 
Позовавам се на събрание се кодовете, представени от Mr.VVV, АЗ управлявам към добивам определителен член часовник, за да са в непосредствена близост до 1ms интервал.Но, аз таймера изглежда малко от реалните срокове, когато се сравняват таймера на часовника.

например, гледане на секунди отбелязва 1.5x ~ 2x по-бързо от таймера, програмиран в uController.

Опитах се да промените стойността на товара в TIMER1 регистри, дори и да Highbyte = $ FF, LowByte = $ FF, но изглежда, че все още не можете да получите толкова точни, колкото в будно състояние, въпреки че е много близо до него.

И моето устройство не може да работи при смяната на 20MHz кристал.Но то работилница прав глоба в 4MHZ, да разбера какво не е наред?Опитвате се да смените конфигурацията на бита от XT към ХС в MPLAB 8.00, но когато го компилирате, бита за промяна гръб към XT.

Отдавам кодовете написах използване PicBasic Pro, всички експерти, може да коригира грешките си да получите желания интервал?

Помощ може да се ценят много.
Съжалявам, но трябва вход, за да видите този прикачен файл

 
Съвети:
* Използвайте един кристал, който разделя напълно с двоичен в секунда
* Не тичам таймерите асинхронно (не е бистър или поставете ги тях нека се движат свободно)
* Използвайте ККП модул (Сравни режим)

За 1ms времето 1/100-на на командирова 6.5536MHz кристал ще бъде добра.

 
PICbasic вероятно е много по-трудно да се постигне от монтаж език.

 
IamnotJunk написа:

PICbasic вероятно е много по-трудно да се постигне от монтаж език.
 
Благодаря за съвети, ще се опитам сега.Все пак трябва да учат как да се използва ККП първо.

<img src="http://www.edaboard.com/images/smiles/icon_biggrin.gif" alt="Very Happy" border="0" />

Added след 4 часа 14 минути:Добре.Аз ремонтирам програмата да направи Timer1 свободен таймер план.Преди таймера на проекта, той е зареден с с 0000h в timer1 регистър.На таймера започва, когато натиснете старт.

Когато натиснете спре, да получа стойността от TMR1H и TMR1L в 2 отделни променливи, които определят като аз байт.След това, аз се действителния резултат от:

РЕЗУЛТАТ TMR1H = * 256 TMR1L

Значи, това означава, че, общият РЕЗУЛТАТ * 1us = общият времето в секунди аз, получени от събитието?Не е много сигурен за изчисляване на таймера, но доколкото разбирам, като се използва 4MHZ часовник, то ще бъде:

4MHZ / 4 = 1MHz (Fosc / 4 от T1CON.1 = 0, вътрешния часовник)
Т = 1/1M = 1us (цикъл на обучение)
по този начин, Резултат * 1us = общо време в секунда.

Моля, наказвай ме, ако греша, наистина не е много сигурен за Timer1 изчисление.

Благодаря предварително!

 
Да, това е правилно.С Prescaler 1:1 таймера за всеки 1us стъпки, така че резултатът е в микросекунди.

 

Welcome to EDABoard.com

Sponsor

Back
Top