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

elight elight at gmail.hu
Mon Jan 21 11:11:57 CET 2019


Szia

Próbáld meg így:
//-------------------------------------------
void interrupt()
{
    //--- encoder IT ----
    if( INTCON.INT0IF) & (INTCON.INT0IE)
   {
      if( INTCON2.ITEDG0 == 0 ) { INTCON2.INTEDG0 = 1 ;) else { 
INTCON.ITEDG0 = 0};

       delay_ms(2);
       encoder_isr();     // Encoder értékének olvasása
    }
}
//--------------------------------------------

void encoder_isr()
{

   unsined char encoder_value;

   encoder_value = PORTB  //   Encoder 2 bit olvasása

   Enc_New_X =  (ecoder_value & 0b00000011);  //  RB0 és RB1 maszkolása.

   if( Enc_New_X.F0 != Enc_New_X.F1 )
   {
        .........   //   Itt amiket szeretnél ki IF-ezed és pointerekel 
mozgathatod..
                    // pl egyszerű esetben
                    //  (*ps_ENC_Buff_Point)++;   növel egyet egy rekeszen.
                    // Persze kellenek a korlátozó ágak is
                    //   if( (*ps_ENC_Buff_Point)  < s_ENC_Maximun ) { 
/*növelni kell*/} else {/* nem nőhet tovább */}  stb..


    }

}



ez nekem mindig jól futott.
Persze ez lehet nem pont 100% az a proc,
de átértelmezhető.

Üdv István



2019-01-21 10:46 keltezéssel, Gabor Jordan írta:
> Ü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]
>



More information about the Elektro mailing list