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

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


Gabi!
Bocs a smile nem tudom honnan pottyant,
mikor még visszaolvastam nem volt ott,
de helyette eredetileg egy záró kapocs állt!

Ja már látom, a ponytosvessző után kellene egy spaces!

Imádom az ilyen túlokos levelezőket.. :-)

Üdv István

2019-01-21 11:11 keltezéssel, elight írta:
> 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]
>>
>
> -----------------------------------------
>          elektro[-flame|-etc]
>



More information about the Elektro mailing list