1 sekunda Interrupt z 8051?

P

Picstudent

Guest
Hai
Který je vhodný a dostupný krystalu frekvence a časovač kombinaci tak, že bych mohl dostat přesnou jedna sekunda přerušení na 89S51?
Díky předem
Díky IANP na klíč.
Ale v tom případě budu volná přesnost?
S 12MHz nemohu počítat aľ 1 sekunda za použití 16 bit časovače přímo.
Ale kdybych ji využít * 1000 metoda načasování nebude přesná ne?
Picstudent
Naposledy upravil Picstudent o 18 leden 2005 14:03, editovaný 1 krát v celkové

 
Podívejte se, nebudu vám připraveno řešení.Pokud jste student, pak nejlepší způsob, jak je analize tento problém je najít řešení sami.
Ale, tady je pár tipů:
Získat si list na 51-rodinné bázi jádra.
Najdete zde info č. Timer0, Timer1 a (52) Timer2.
Určité druhy těchto časovačů vám umožní spočítat hodiny děleno 12.
Používáte-li 12MHz krystal ...vstup do časovače bude krmit s touto frekvencí.
Pre-zatížení hodnoty mohou být vybrány, řekněme 1000, takže přerušení vyvolané touto časovače dojde každý 1ms.
Pokud jste to 1000 krát a budete mít své 1s.
Snadné nebo obtížné?

 
Picstudent napsal:

Hai

Který je vhodný a dostupný krystalu frekvence a časovač kombinaci tak, že bych mohl dostat přesnou jedna sekunda přerušení na 89S51?

 
Ianp má pravdu.Zkuste 12MHz krystal, protože časovač počet 1 za 1 strojový cyklus (což se rovná 12 křišťálu pulsy).
Navštivte také www.8052.com.Naleznete zde podle mého názoru nejlepší tutorial
na mc51 rodina mikrokontrolérů pro začátečníky.Bylo to velmi užitečné pro mě!

 
Nebyl jsem si vědom, které jste přidali další dotazy na vaši primární post.

Do 1s interval nebudete volné anythig.Mocro bude zpracovávat data v několika LS a bude čekat na nové přeru pro většinu z jeho času.

 
Podle mého názoru to trvá několik triků k získání pevné intervalu 1 sec.
Vaše časovač počítá až 65536.OK?To znamená, že na kmitočtu 12MHz, 65535Us což nestačí.

Chcete-li vytvořit časové okno na 1sec použití registru, zmenší / přírůstek (vyberte jednu) pokaždé, když čítač přeteče (655535 -> 0).A prefed Tento registr s hodnotou, která násobí 65536 činí přibližně 1 sec.
Budete potřebovat 15,25 krmení v této register.Decrement / Přírůstek reg 15 krát a naposledy prefed v časovač 65536-,25 * 65356-X.

X je čas (použijte debugger pro měření přesně), přijatého v období od přetečení
časovač a srovnání různých rutin pro skoky a srovnání. Bude to několik desítek z nás.

Pokud se vám sometrhing jinde v kódu (jako listovala LED) nastavit tak vysoké priority pro přerušení časovače.

Nebudete potřebovat žádný kód pro pomoc.Pokud máte obrázek sami, budete muset
žádné další problémy s časovače používá k měření času.

Jsem otevřen pro komentáře!

 
ahoj, nemůžete měly sekundu přerušit v 8051, měli byste udělat víc, aby přesnou 1 sekundy přeruší, můžete nahrát svůj časovač v 16 bitovém režimu hex formátu (-50.000) a umožní to přerušit, pak v každé přerušení, měli byste přírůstek pult a když váš pult získává 20, můžete si být jisti, že 1 sekunda načasování, ale to může být tak nat tak přesný, protože když obdržíte přerušení, máte nějaké push a POP, po to, že kontrola vašeho odporu používá několik mikrosekund, ale já to nemůže mít vliv na přesnost tolik.

 
rellutzu napsal:Chcete-li vytvořit časové okno na 1sec použití registru, zmenší / přírůstek (vyberte jednu) pokaždé, když čítač přeteče (655535 -> 0).
A prefed Tento registr s hodnotou, která násobí 65536 činí přibližně 1 sec.

Budete potřebovat 15,25 krmení v této register.Decrement / Přírůstek reg 15 krát a naposledy prefed v časovač 65536-,25 * 65356-X.X je čas (použijte debugger pro měření přesně), přijatého v období od přetečení

časovač a srovnání různých rutin pro skoky a srovnání. Bude to několik desítek z nás.

 
časovač (0,1,2) se počítá s až 65535, pak přetéká, vyvolalo to přerušit.
s 12MHz krystal, který znamená, že 65536 mikrosekund prošel.Dělit 1.000.000 mikrosekund až 65536 a dostanete 15,25.
Takže budete muset spustit časovač 15,25 krát k získání 1sec.
Nemůžete nahrát tuto hodnotu v registru.

Máte připojen vzorek pracovní kódu.Problém: je to assembler.
Neměl jsem čas na C.

Použil jsem Franklin software pro ladění, je to dobré.Ale pro assembler pouze.

Přečtěte si uchycení za objasnění.

Pokud se dostane do těžké, drop díra věc a najít způsob, easyer C.
Assembler není určen pro to.Musíte být pacient a někdy to nestojí za námahu.
Omlouváme se, ale musíte přihlásit a prohlížet tuto přílohu

 
Picstudent napsal:Také jak počítat čas, který uplynul během pokyny v ke * il, jako stopky v MPLAB?

 
V tomto případě je jeden problém.Pro reload časovače registrů (TLX, THX), k tomu nějaký čas.Tentokrát se bude vyrábět z timming chyby délce 1s interval.
Také mají timming chybu v závislosti na provedení pokynu.

KUKA.

 
Ahoj picstudent,

Myslím, že už by jste tolik nápadů a přemýšlel, které je nejlepší.Nebudu se přidat k některé z těchto.Ale musím se k tomu vyjádřili -

1.Chcete-li získat přesné časování, použití shromáždění.můžete i nadále používat C, ale pro časovač inicializační a časovač přerušení rutinní, použijte montáž.

2.Je to trochu obtížné získat přesné 1 sec, tam jsou některé tolerance spojená s krystal.Pokud máte v úmyslu použít 1 sec a vybudovat RTC, pak navrhuji, necháte to běžet řekněme 6 hodin a měli byste vidět, že to bude pomalejší nebo rychlejší o několik sekund ...Čím déle necháte ji běžet, tím více zřejmé, že rozdíl je.Získat tyto ic RTC-li RTC je váš záměr.

3.Pokud jde o 1 sec v 8051, 12MHz je způsob, jak jít.Vypočítat na provozní doby cyklu, přečtěte si až na těch 16 bit časovač, a používat další přepážky počítat až 1 sec.

Například, aby se to jednoduché, můžete naučit, jak implementovat 0,5 sekundy přeruší, nebo dokonce 0,1 sekundy.Po úspěšném provedení těchto nižší časování, ty by měly získat reálnou představu, jak se dostat 1 sec.Chcete-li test 0,1 sec, můžete doplnit výstupní pin vše přerušení nastane.Použijte osciloskop číst výstup pin, výstup by měl být čtverec vlnu dobu 0,2 sekundy.

si to krok za krokem.Doufám, že to pomůže.

chicken_feet

 
Používáte-li pre-zatížení hodnotu 1000 (nebo 10000) přerušení vyskytuje každých 1 ms (nebo 10ms).V micro světě je to věk.Některé výpočty způsobit deley, ale každý druhý, po počítání do 1000 (nebo 100) deley bude stejný, takže není chyba uložena sekund.Tento 1ms přerušení krát celá operace: bez chyb ZDE!

A proč byste rád / a přetečení časovače se žádný pre-hodnota zatížení (65536)?

 
Ianp, tak mě opravte kdybych wongly pochopil:

Chcete spustit časovač na 1000 nás (= 1ms) spoje to_Ok?
Přitom budete muset udělat za 1000 krát.Ok?
Jak se vám bude počítat 1000, když máte jen rejstříků 8 bitů (počítání do 255)?Použití DPTR zaregistrovat?Není to moc pro projekt této amplitudy?

 
Zdravím všechny;

esiaest a přesný způsob je použít časovač v režimu 2.

znamená, že byste upravit timer0 na -250 a spusťte jej v automatickém zatížení,
to přerušení každý 250uS (pokud používáte 12MH křišťálu)
měli byste používat dva pulty jako R0 a R1.

není nutné používat 16 bit registru počítat!

Tímto způsobem je přesnější než běh časovače v režimu 1.
protože to načte číslo v TH0 na TL0 automaticky po každém přerušení.

viz tento program:
ORG 040H
start:
MOV TMOD, # 00000010B; SOUPRAVY TIMER0 V MODE2
MOV IE, # 10000010B; umožňuje timer0 přerušení
MOV TH0, # -250
SETB TR0; timer0 začíná ve volném runing režimu
AJMP $; čekat na přerušení nebo můžete přidat nějaké ....ORG 00BH
TIMER0 přerušit:
INC R0
CJNE R0, # 200, OUT, 200 * 20 * 250uS = 1 sekunda
MOV R0, # 0
INC R1
CJNE R1, # 20, OUT
MOV R1, # 0
ACALL 1s ROUTIN
.
.
OUT:
RETITímto způsobem můžete dělat svou obnovování displeje (pokud jste použili multiplexní 7segments) každý 250uS ....

 
hm_fa_da,

jste přišli s dobrou alternativou.Ale nemusíte brát v úvahu čas potřebný k provedení instrukce v rutiny.Časovač může být automatické přeložil, ale čas je ztracen vykonávajícím instr.

Ale myslím, že jste nám poskytli easyer způsob počítání 1 sec pro běžné potřeby, pokud Picstudent skutečně nechce stavět atomové hodiny

<img src="http://www.edaboard.com/images/smiles/icon_smile.gif" alt="Úsměv" border="0" />

))

 
když pokyny realizovat, není čas na měřič v MODE2 budou ztraceny,

proto, že po přerušení vyskytuje, timer0 znovu načte s TH0 hodnotou (-250)
a to se počítá sám souběžně s vykonávajícího instrukce,

Možná si myslíte, že počítání bude restartován po instrukce RETI?

po každém přerušení, počítání bude restart a bez závislosti na provedení instrukce.
Můžete zastavit funkce časovače, s vykonávajícím CLR TR0,

jde.

 
250ľs nebo 1 ms nebo 10 ms, ...některou z těchto možností je dobré, jak dlouho budete mít dost času na performe dalších funkcí mezi dvěma cosecutive přerušení ..Citace:

Jak se vám bude počítat 1000, když máte jen rejstříků 8 bitů (počítání do 255)?
 
hm_fa_da,

Měl jsi pravdu a já jsem se mýlil.Opravdu nemusíte se starat o čas ztracený na executind pokynů v rutiny, pokud časovače stilll počítá po vstupu do ISR.Zapomněl jsem o tom, že kompletně a zamířil do mnohem složitější postup.

Pravda je skutečnost, že většinu času nejlepší způsob, jak je easyer cesta!
S pozdravem!

 
Je-li u potřeba sec přerušit IanP metoda 1 je nejlepší, že bere méně paměti.Jiné metody navržené by mohlo fungovat, ale proč proboha by někdo chtěl vzít na delší cestu, když je kratší?pokud děláte mnoho jiných věcí na 89C51 a registry nejsou zdarma.Dokonce i poté?? Proč??

 

Welcome to EDABoard.com

Sponsor

Back
Top