[elektro] 18f6722 szeret megszakadni, még megszakadás közben is, C18

elight elight at gmail.hu
Tue Jan 22 09:53:10 CET 2019


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]



More information about the Elektro mailing list