[elektro] 18f6722 szeret megszakadni, még megszakadás közben is, C18
hg12345
hg12345 at freemail.hu
Tue Jan 22 19:07:25 CET 2019
Hi
a 18F sorozat két szintű megszakítást használ, az alacsonyabba a magasabb beleszakíthat!
Használj magasabb szintű IT-t
-------- Eredeti levél --------
Feladó: elight < elight at gmail.hu (Link -> mailto:elight at gmail.hu) >
Dátum: 2019 január 22 09:53:33
Tárgy: Re: [elektro] 18f6722 szeret megszakadni, még megszakadás közben is, C18
Címzett: elektro at tesla.hu (Link -> mailto:elektro at tesla.hu)
Azért kicsit fura.
Felrúgja az alapszabályt:
INT-ben nem jó sokat trükközni és várakozni.
Még bejöhet egy két módosítás,
amit az élet rendre összehozhat,
bővülnek a dolgok és bedőlhet az egész.
Szóval mindent meg lehet magyarázni,
de én inkább jobban átgondolnám,
és koncepciót váltanék.
Na jó, tudom, végtére, folyamatábrát rajzolni,
az ez roppan unalmas dolog! :-)
Üdv István
2019-01-22 08:21 keltezéssel, Gabor Jordan írta:
> Hello,
>
> Köszönöm a segítséget!
>
> A Nop()-ok kellenek, korábbi tapasztalat, nem vettem figyelembe a
> léptető motor meghajtó minimum impulzus idejét, meg azt az időt,
> aminek el kell telni az enable, irány beállítás és lépés impulzus
> felfutó között. Ha kiveszem a Nop()-okat (többnyire akkor is működik
> egyébként), bizonytalanná válik és nem teljesíti a minimum időket az
> adatlapról. Persze, lehetne szebben, egy késleltető ciklussal stb., de
> pár órajelért nem szoktam. Inkább legyen csúnya, de egyszerű.
>
> A while (....) {Nop();}, na igen. Az optikai enkóder 400 lépéses. Ezt
> ha pörgetem, nem tudja követni a motor, túl gyors (viszont kell a
> finomhangoláskor). Több módon védtem már ezt ki, de legjobban az vált
> be, hogy amikor lépek, beállítok egy időzítőt és addig nem lépek
> másikat ameddig az le nem telik. Nincs megszakítás, nincs engedélyezve
> a TMR0IE, csak a flaget nézem. Csináltam már úgy is, hogy eldobom a
> lépést, ha nem telt le az idő, viszont az nem jó. Izgágán, nem állandó
> sebességgel tekeri a vákuumforgót a motor. Értem, hogy ez meg így
> pazarlás, de így nagyon jó sima állandó max sebességet ad és a
> számlálás is pontos. Oda vissza tekergetve visszatér ugyan oda lépésre
> egyezve. Az a veszély meg, hogy befagy ott, mert a flag nem állítódik
> be, az nem áll fenn, mert az órajelről megy állandóan a számláló, max.
> 1ms telhet el. Én jobbat erre nem találtam még.
>
> INTCONbits.TMR0IF = 0 , Mindig így töröltem a flaget, itt most nem
> számít (sőt nem is szabad), ha nem dolgozom fel ami bejött időközben,
> de van olyan amikor igen, utánanézek ennek is, más esetben azt fogom
> használni.
>
> Köszönöm!
>
> ÜDV JG
>
>
>
> 1/21/2019 6:49 PM keltezéssel, Andras Huszti írta:
>>
>>
>> Hello,
>>
>> Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop()
>> Minek ide nop? Ha nem irodik ki a portra akkor szokott lenni sync
>> parancs. Ha meg idozites kell akkor meg talan ennyi nop elmegy. De
>> nem jo dolog interruptban ilyet csinalni. Akkor mar ha lehet
>> aszinkron modon a main bol ha engedi a jitter.
>>
>>
>> while (INTCONbits.TMR0IF==0) {Nop();}
>> Ez nem jo strategia. Interruptban egy masik interruptra varni. Itt
>> valami koncepcios hiba van.
>>
>>
>> Am 21.01.2019 10:46 schrieb Gabor Jordan :
>>
>> Üdvözletem,
>>
>> Kérdésem lenne, biztosan nem látok valami nagyon alap dolgot, de
>> tegnap
>> este már (ill. az már bőven ma volt amikor feladtam) az alig létező
>> hajam akartam kitépni, mert hiába a megszakítás kezelés első sora,
>> hogy
>> GIE=0 (én nincsenek szintek, RCONbits.IPEN = 0;), akkor is,
>> tekerem az
>> optikai enkódert, bejön az újabb megszakítás és felugrik a
>> megszakítás
>> kezelés elejére vissza.
>>
>> Azt is átnéztem, hátha valami közben engedélyezi a GIE-t, de nem.
>> Egyetlen helyen engedélyezem, de ahhoz le kell fusson a
>> megszakítás és
>> vissza kell térjen a fő ciklusba.
>>
>> Van ötletetek, ha egyszer a GIE 0, hogy a túróba tud mégis
>> újraindulni a
>> megszakítás?
>>
>> Köszönöm,
>>
>> ÜDV JG
>>
>>
>>
>> void InterruptHandlerHigh ()
>> {<!-- -->
>> INTCONbits.GIE = 0 ;
>>
>> D6=0;
>>
>> if (INTCONbits.INT0IF) // interrupt from rotary encored
>> {<!-- -->
>> INTCONbits.INT0IF = 0 ;
>>
>> if (OENC2)
>> {<!-- -->
>> if (cap_position < maxposition)
>> {<!-- -->
>> while (INTCONbits.TMR0IF==0) {Nop();}
>> DRV_nENABLE=0;
>> Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();
>> DRV_nRESET=1;
>> Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();
>> DRV_DIR = 1;
>> Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();
>> DRV_STEP =1;
>> Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();
>> Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();
>> cap_position = cap_position + 1;
>> Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();
>> Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();
>> DRV_STEP =0;
>> TMR0_Enable();
>> }
>> }
>> else
>> {<!-- -->
>> if (cap_position > -18300)
>> {<!-- -->
>> while (INTCONbits.TMR0IF==0) {Nop();}
>> DRV_nENABLE=0;
>> Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();
>> DRV_nRESET=1;
>> Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();
>> DRV_DIR = 0;
>> Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();
>> DRV_STEP =1;
>> Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();
>> Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();
>> cap_position = cap_position - 1;
>> Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();
>> Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();
>> DRV_STEP =0;
>> TMR0_Enable();
>> }
>> }
>> update = 0x01;
>>
>> }
>>
>>
>> if (INTCON3bits.INT2IF) // interrupt from front panel button
>> {<!-- -->
>> INTCON3bits.INT2IF=0;
>> WriteCmdXLCD(0x01);
>> putrsXLCD("reset cap");
>> reset_position = 19000;
>> while (reset_position)
>> {<!-- -->
>> DRV_nENABLE=0;
>> Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();
>> DRV_nRESET=1;
>> Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();
>> DRV_DIR = 0;
>> Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();
>> DRV_STEP =1;
>> reset_position = reset_position - 1;
>> Delay1KTCYx(1);
>> DRV_STEP =0;
>> Delay1KTCYx(4);
>> }
>> cap_position = 0;
>> cap_position2LCD();
>> }
>>
>> delayM=3000;
>> D6=1;
>> }
>>
>>
>> void TMR0_Enable(void)
>> {<!-- -->
>> T0CONbits.TMR0ON = 0;
>> INTCONbits.TMR0IE = 0;
>> INTCONbits.TMR0IF = 0;
>> T0CONbits.T08BIT = 1; // 8 bit
>> T0CONbits.T0CS = 0; // internal clock, timer
>> T0CONbits.PSA = 0; // insert prescaler
>> T0CONbits.T0PS2 = 1; // prescaler 000 = 1:2
>> T0CONbits.T0PS1 = 0; // prescaler 100 = 1:32
>> T0CONbits.T0PS0 = 0; // prescaler 111 = 1:256
>> TMR0L = 0x70;
>>
>> T0CONbits.TMR0ON = 1;
>> INTCONbits.TMR0IF = 0;
>> }
>>
>> void INT_enable ( void )
>> {<!-- -->
>> RCONbits.IPEN = 0; // disable priority levels
>> INTCONbits.PEIE = 0 ;
>>
>> INTCONbits.INT0IF = 0; // enable INT0 for the optical encoder
>> INTCON2bits.INTEDG0 = 1;
>> INTCONbits.INT0IE = 1;
>>
>> INTCON3bits.INT2IF = 0; // enable INT2 for the button
>> INTCON2bits.INTEDG2 = 0;
>> INTCON3bits.INT2IP = 1;
>> INTCON3bits.INT2IE = 1;
>>
>> /*
>> INTCON3bits.INT3IF = 0; // enable INT3 for rotary switch
>> INTCON2bits.INTEDG3 = 0;
>> INTCON2bits.INT3IP = 1;
>> INTCON3bits.INT3IE = 1;
>> */
>>
>> INTCON2bits.TMR0IP = 1;
>>
>>
>> INTCONbits.GIE = 1;
>> }
>>
>>
>> -----------------------------------------
>> elektro[-flame|-etc]
>>
>>
> -----------------------------------------
> elektro[-flame|-etc]
-----------------------------------------
elektro[-flame|-etc]
More information about the Elektro
mailing list