Přerušení u 16F877A po jedne sekundě

Mohl by mi někdo jsem dát program který po 1s skočil do přerušení?

#pragma CLOCK_FREQ 2000000
int timer1_16 @ 0x0E;

timer1_16 = 3036; // počáteční nastavení hodnoty do TMR1 //
t1con = 0x31; // nastavení TMR1 a předděličky //
pie1.TMR1IE = 1; // povolení přerušení od TMR1 //
intcon.PEIE = 1; // povolení přerušení od periferií //
intcon.GIE = 1; // povolení přerušení //

void interrupt ( void )
{
if ( pie1 & 1 && pir1 & 1 ) { timer1_16 = 3036; pir1.TMR1IF = 0; }
}

Mohl bych poprosit o nějaké vysvětlivky?? Vůbec se v tom neorientuju.

Trochu jsem to doplnil o info, co potřebuješ víc.

Tohle znamena co??? to mi nepripada jako přikazi z assembleru??

Cau, jelikoz si v prvnim prispevku neuvedl v jakym jazyce to chces tak se nediv ze ti nekdo poradi v Cecku kdyz to zrovna chces v ASMku,
zrejme s toho asi moc chytrej nejses , tak si projdi forum a njadi si tema s nazvem "Prerusenie “nebo " prerušenie u PIC16Fxxx” jestli treba tam nenajdes nakou radu ci inspiraci a pak se skus este jedno zeptat a popsat trochu tvuj problem, v jakym jazyce by to melo bejt, naka podminka pri vyuziti periferii (Tmr1/2, obycejna smycka) a co se ma v preruseni udelat atd, pak by mohly nase odpovedi bejt presnejsi a k necemu :wink:
jinak v Knize Moderní učebnice programování mikrokontrolérů PIC 2 je popsano preruseni str.80

nell: To taky netvrdím že to jsou příkazy assembleru.

Tvá otázka zněla takto:

O tom, v čem to má být napsáno není ani zmínka. Příště definuj svou otázku přesněji, nejsem jasnovědec.

To jak jsi říkal už jsem procházel, ale stejně pořád mi to nejde. V jinym než assembleru jsem v životě neprogramoval takže jsem na Cecko uplne zapomel. Byl by někdo tak Hodnej a hodil by jsem nějaky program ktery mi udela preruseni na 1s v assembleru?? :smiley:

Přerušení od TMR0 po 1 sekundě treba tady, da se s toho neco pouzit
a nebo tady zbytek elektroworld.info/modules.php?name=Forums&file=viewtopic&t=29971&highlight=preddelicku

Při použití časovače TMR0 který je jen 8bit budeš muset s frekvencí hodně dolu, naproti užití TMR1 který je 16bit.

Nikde sem se nedocet na jaky frekvenci mu to bezi nebo ma bezet, nic mu nebrani pouziti Tmr1, a pokud bude lepe informovat o problemu budu/budem presneji odpovidat ,

MiloPS3: Mohu jen souhlasit. :slight_smile:

nell: napiš prosím alespoň k čemu to bude sloužit, nějaké blížší info ke konstrukci, ať si můžeme udělat malou představu o tom co bys vlastně potřeboval.

Takže dělám DMP (Dlouhodobou maturitní práci) domácí zabezpečovací zařízení. Kde chci aby jsi človek mohl vybrat za jak dlouho se má spustit alarm, ta doba by měla být mezi 10-30sec. Proto by jse mi hodilo to přerušení. Aby během té doby co to ten čítač odpočítává, mohl někdo zadávat třeba pin a tak. Práci dělám v MPlabu a píšu to čistě v Assembleru. Pic je 16F877A.

No vidíš že to jde napsat i jinak. V tomto konkrétním případě nepotřebuješ přerušení s 1sec. Stačí nastavit přerušení na 10ms a v něm inkrementovat (přičítat) nějaký registr nazvaný třeba ms10, tento registr budeš kontrolovat na hodnotu 100 a až jí dosáhne vynuluješ ho a budeš mít 1sec.
Tady můžeš zase přičítat do jiného registru nazvaného třeba s1 a zase až dosáhne určité potřebné hodnoty vynuluješ ho a provedeš příslušnou reakci.

Jakou frekvenci MCU chceš použít, 20MHz, 10MHz, atd.

A tady je právě ten problém. Já vym že mam nastavit čítač a až přeteče tak že skočí do přerušení a tam můžu dělat to s tima 10ms a tak… ale já nevim co tam mam uložit za hodnotu do toho čítače. Mam krystal 20MHz

Při 20MHz a použití tmr0 nastav:

registr option_reg nastav na hodnotu 0xDF
do registru tmr0 zadej hodnotu 0x06 (počáteční hodnota) tuto hodnotu zadej vždy znovu v přerušení.

Pro dobu 10ms je potřeba 200 přerušení, je tedy nutné pričítat v přerušení do registru us a až nabude hodnoty 200, pak teprve přičíst do registru ms10 a us vynulovat, až bude v ms10 číslo 100 tak to je 1sec.

Pokud by se použil TMR1 (16bit), bylo by to jednoduší.
Nezapomeň povolit příslušná přerušení.

Snad jsem to popsal tak nějak správně, raději to zkontrolujte.