1 секунда прекъсвания от 8051?

P

Picstudent

Guest
Хай
Кой е най-подходящ и наличните кристал честота и комбинация таймер режим, така че мога да получа точно една секунда прекъсване на 89S51?
Благодаря предварително
благодарение IANP за улика.
Но в този случай ще изгубя точността?
С 12MHZ не мога да Upto брой 1 секунда използвате 16-битов таймер директно.
Но ако аз употреба, че * 1000 метод на времето няма да е точно не?
Picstudent
Последно редактиран от Picstudent на 18-ти януари 2005 14:03; Редактирано общо 1 път

 
Вижте, аз не съм Ще ви дам готово решение.Ако сте студент Най-добрият начин е да се analize този проблем е да се намери решение чрез себе си.
Но, ето няколко съвета:
Вземи си един информационен лист за 51-семейството ядро база.
Там ще намерите информация не Timer0, Timer1 и (52) Timer2.
Някои видове от тези таймери ви позволи да преброите часовник, разделен на 12.
Ако използвате 12MHz кристал ...въвеждане на таймера ще се хранят с тази честота.
Пре-натоварване стойности могат да бъдат избрани, да речем 1000, така че прекъсват, причинено от този таймер ще се извършва всяка 1ms.
Ако го направите 1000 пъти и сте си 1S.
Лесно или трудно?

 
Picstudent написа:

Хай

Кой е най-подходящ и наличните кристал честота и комбинация таймер режим, така че мога да получа точно една секунда прекъсване на 89S51?

 
Ianp е прав.Опитайте с 12MHz кристал, защото таймерът брой 1 на всеки 1 машина цикъл (което се равнява на 12 кристални варива).
Също така посетете www.8052.com.Там можете да намерите по мое мнение най-добрите настойнически
mc51 на семейството микроконтролери за начинаещи.Това беше много полезно за мен!

 
Не бях наясно сте добавили повече въпроси на основния ти пост.

В рамките на 1S интервал не ще загубят anythig.Mocro ще обработва данни в рамките на няколко μs и ще се чака за нови interrup-голямата част от времето си.

 
По мое мнение това се някои трикове, за да получи определен интервал от 1 сек.
Таймерът брои до 65536.OK?Това означава, че на сат на 12MHZ, 65535Us което не е достатъчно.

За да създадете времевия прозорец на 1sec употреба регистър, decremented / увеличение (изберете едно) всеки път, когато бариерата е залято (655535 -> 0).И prefed този регистър със стойност, която, умножена с 65536 равнява приблизително 1 сек.
Ще трябва 15,25 хранят в този register.Decrement / Increment на обл 15 пъти и за последен път prefed в таймера на 65536-0.25 * 65356-X.

Х е време (използване на дебъгер да се измери точно), взети между преливане на
таймер и сравнение на различни практики, използвани за скокове и сравнение. Тя ще бъде десетки нас.

Ако го направите sometrhing друго в кода си (като обръщане един LED), определени като висок приоритет за таймер ви прекъсвам.

Вие няма да имате нужда всеки код за помощ.Ако тази цифра по своему ще имате
не по-нататъшни проблеми с таймери, използвани за измерване на времето.

Аз съм отворен за коментари!

 
Здравейте, не може да има една секунда прекъсване в 8051, което трябва да направите някои повече, за да има точно 1 секунда прекъсне, можете да заредите таймер в 16-битов режим шестнадесетичен формат (-50000) и ще позволи това е прекъснат, след това в всяко прекъсване, трябва да се нарастване брояч и когато брояч получава 20, можете да бъдете сигурни, да има 1 секунда времето, но може да бъде толкова Nat acurate така, защото когато получите прекъсвам, Вие имате някакъв тласък и УОЗ, след , че си проверявате брояч използва някои микросекунди, но нещо, което не може да повлияе на точността толкова много.

 
rellutzu написа:За да създадете времевия прозорец на 1sec употреба регистър, decremented / увеличение (изберете едно) всеки път, когато бариерата е залято (655535 -> 0).
И prefed този регистър със стойност, която, умножена с 65536 равнява приблизително 1 сек.

Ще трябва 15,25 хранят в този register.Decrement / Increment на обл 15 пъти и за последен път prefed в таймера на 65536-0.25 * 65356-X.Х е време (използване на дебъгер да се измери точно), взети между преливане на

таймер и сравнение на различни практики, използвани за скокове и сравнение. Тя ще бъде десетки нас.

 
таймер (0,1,2) брои до 65535, след това е залято, пускащи това е прекъсвам.
с кристална 12MHz това означава, че 65536 микросекунди мина.Разделете 1.000.000 microsec до 65536 и ще получите 15,25.
Така че трябва да стартирате таймера 15,25 пъти, за да получат 1sec.
Вие не може да се зареди тази стойност в регистър.

Имате право приложен образец на работното код.Проблемът: това е асемблер.
Не съм имал време за C.

Използвах Франклин софтуер за откриване на грешки, то е добро.Но само за сглобяване.

Прочетете attachement за разяснения.

Ако това стане да твърди, пусни нещо дупка и да намерят начин easyer в C.
Асемблер не е годен за това.Трябва да се pacient и понякога не си струва усилията.
Съжалявам, но трябва вход, за да видите този прикачен файл

 
Picstudent написа:Също така как да брои времето, изминало време на инструкциите в ке * ти хареса хронометъра в MPLAB?

 
В този случай е един проблем.За презареждане на таймера регистри (Tlx, THX), да го известно време.Този път ще се произвеждат от timming грешка продължителност на 1S интервал.
Също така да има timming грешка в зависимост от изпълнение инструкции.

Кука.

 
Здравейте picstudent,

Предполагам, че от сега, че ще имаме толкова много идеи и се чудех, която е най-добрият.Аз няма да се добави към някоя от тях.Но аз трябва да коментира това --

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

2.Това е малко трудно да се получи точно 1 секунда, има някои толерантност, свързани с кристал.Ако възнамерявате да ползвате за 1 сек и изграждане на РТК, тогава аз внушавам ти нека се кандидатира за нещо, нека каже 6 часа, а вие трябва да видите, че то ще бъде по-бавно или по-бърз от няколко секунди ...Колкото по-дълго да тичам то, толкова по-очевидна е разликата.Махни тези IC РТК ако РТК е вашето намерение.

3.Тъй като за 1 секунда през 8051, 12MHz е начин да отида.Изчислете по време на работа на цикъл, подготвям се за тези малко 16 таймер, както и използване на допълнителни гишета да преброите до 1 сек.

Например, за да улесня, можете да научите как да прилагаме 0,5 секунди се прекъсне или дори 0,1 сек.След успешното изпълнение на тези по-ниски времето, трябва да получат справедлива представа за получаването на 1 сек.За тестване на 0,1 сек, може да допълни с мощност всичко за закрепване на прекъсване се случи.Използване на осцилоскоп за да прочетете за закрепване продукция, производство трябва да бъде квадрат вълна на период от 0,2 секунди.

приемете я стъпка по стъпка.Надявам се това да помогне.

chicken_feet

 
Ако използвате предварително натоварване стойност от 1000 (или 10000) за прекъсване occures всеки 1ms (или 10ms).В микро света това е възрасти.Някои изчисления предизвикат някои deley, но всеки втори, след преброяването на 1000 (или 100) на deley ще бъдат същите, така че няма грешка, наложени на секунди.Това 1ms прекъсват пъти цялата операция: НЯМА ГРЕШКИ тук!

И защо бихте искали да преливник таймер, без предварително зареждане стойност (65536)?

 
Ianp, наказвай ме, ако wongly разбира:

Вие искате да стартирате таймера за 1000 нас (= 1ms) тя preloading.Разбра ли?
Ако направите това, ще трябва да направи това за 1000 пъти.Разбра ли?
Как смяташ да броят 1000, когато имате само регистрите на 8 бита (като се брои до 255)?Използването ВРТК се регистрирам?Не е ли да струва този проект на амплитудата?

 
Здравейте всички;

на esiaest и точен начин е да се използват таймер в режим 2.

означава, че ще коригира timer0 до -250 и тогава тичам то в автоматичен натоварване,
го прекъсва на всеки 250uS (ако използвате 12MH кристал)
тогава трябва да използвате две гишета като К0 и R1.

няма нужда да се използва 16-битов регистър за броя!

този начин е по-точен от таймер работи в режим 1.
защото тя зарежда номер в ТН0 да TL0 автоматично след всяко прекъсване.

виж тази програма:
ORG 040H
Старт:
MOV ТМСШ, # 00000010B; комплекти TIMER0 В Mode2
MOV IE, # 10000010B; позволява timer0 прекъсват
MOV ТН0, # -250
SETB TR0; timer0 започва в свободен режим runing
AJMP $; чакам за спирането или можете да добавите някой ....ORG 00BH
TIMER0 прекъсва:
INC К0
CJNE К0, # 200, Out; 200 * 20 * 250uS = 1 секунда
MOV К0, # 0
INC R1
CJNE R1, # 20, OUT
MOV R1, # 0
ACALL 1S ROUTIN
.
.
OUT:
Retiпо този начин можете да направите вашия опресняване дисплей (ако сте използвали мултиплексирани 7segments) всяка 250uS ....

 
hm_fa_da,

ти дойде с една добра алтернатива.Но ти не се вземе предвид времето, необходимо за изпълнение на обучение в съчетания.Таймерът може да бъде автоматично презареждане, но времето е загубено изпълняващата инстр.

Но предполагам, че сте предоставили на easyer начина на отчитане 1 сек за общите нужди, освен ако не Picstudent наистина искаме да изградим един атомен часовник

<img src="http://www.edaboard.com/images/smiles/icon_smile.gif" alt="Усмивка" border="0" />

))

 
инструкции, когато са изпълнение, няма време за таймер В Mode2 ще бъдат загубени,

защото след прекъсване occures, timer0 презарежда с ТН0 стойност (-250)
и тя се брои себе си паралелно изпълнение на инструкции,

Може би си мислиш, че преброяването ще се рестартира след инструкция Reti?

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

с уважение.

 
250μs или 1ms или 10ms, ...някоя от тези опции е добро, стига да имате достатъчно време, за да performe други функции между две cosecutive прекъсва ..Цитат:

Как смяташ да броят 1000, когато имате само регистрите на 8 бита (като се брои до 255)?
 
hm_fa_da,

Ти беше прав и не бях прав.Всъщност не е нужно да се грижи за изгубено време на executind инструкциите в практики, толкова дълго, колкото на таймера stilll брои след влизането на ISR.Забравих за това completly и начело в много по-сложна процедура.

Вярно е фактът, че повечето от времето, когато най-добрият начин е easyer начин!
С най-добри пожелания!

 
Ако U нужда от 1 сек прекъсват IanP метод е най-добрият това отнема по-малко пространство в паметта.Другият метод може да предложи работа на земята, но защо някой би искате да по-дълъг път, когато там е по-къс?освен ако не сте прави много други неща за 89C51 и регистрите не са свободни.Дори тогава???? Защо???

 

Welcome to EDABoard.com

Sponsor

Back
Top