interrupt kaldığı yerden devam etme

Başlatan smail, 26 Mart 2013, 14:17:05

smail

selamlar dostlar,  ben interrupt butonuna basıldığında motorlarımın durmasını butondan elimi çektiğimde motorların önceki dönme yönünde kaldığı yerden dönmesini istiyorum. aşağıda yazdığım programda motorlar duruyor fakat butondan elimi çektiğimde yeni bir emir gelene kadar hep duruyor. acaba sorunu nasıl çözebilirim ..


#include <p18f242.h>
#include <pwm.h>
#include <stdlib.h>
#include <usart.h>
#include <timers.h>
#include <delays.h>
#include <stdio.h>
#include <adc.h>
#include <portb.h>

#pragma config OSC = XT, PWRT = ON, WDT = OFF, LVP = OFF, DEBUG = OFF
#pragma config CP0 = OFF, CP1 = OFF, CP2 = OFF, CP3 = OFF, CPB = OFF, CPD = OFF
#pragma config WRT0 = OFF, WRT1 = OFF, WRT2 = OFF, WRT3 = OFF, WRTB = OFF,WRTC = OFF, WRTD = OFF
#pragma config EBTR0 = OFF, EBTR1 = OFF, EBTR2 = OFF, EBTR3 = OFF, EBTRB = OFF

void motor (int);
void int_handler(void);

#pragma code high_vector=0x08
void high_interrupts (void) {
    _asm GOTO int_handler _endasm
}

#pragma code low_vector=0x18
void low_interrupts (void) {
    _asm GOTO int_handler _endasm
}

#pragma code
#pragma interrupt int_handler
void int_handler(void) {
           
           
       
if(INTCONbits.INT0IF == 1) {
     
       INTCONbits.GIE = 0;
             PORTDbits.RD0 = 1;
             PORTDbits.RD1 = 1;
             PORTDbits.RD2 = 1;
             PORTDbits.RD3 = 1;
         }               
       
         
         INTCONbits.INT0IF = 0;
            INTCONbits.GIE = 1;
                     
           
}

int x,r,k;
void main(void){
    TRISB = 0;
    PORTB = 0;
    TRISC=0xff;
    TRISD=0;
    PORTD=0;
    CloseTimer1();
    CloseTimer2();

    ADCON1 = 0x0F; //B portunun tüm girisleri dijital

   

    OpenRB0INT(PORTB_CHANGE_INT_ON & FALLING_EDGE_INT);
    INTCONbits.GIE = 1;
   
    OpenUSART(USART_TX_INT_OFF &  // usart konfigürasyon ayarları
              USART_TX_INT_OFF &
              USART_ASYNCH_MODE &
              USART_EIGHT_BIT &
              USART_CONT_RX &
              USART_BRGH_HIGH,25 );
   
    OpenPWM1(10000); // Period
    OpenPWM2(10000); 
    k=10000;
    if((BusyUSART()));
   
    while(1)
    {

            x=ReadUSART();
            while (!DataRdyUSART());
            motor(x);
     
     }

}



void motor (int x)
{
            if(x=='1')
            {
           
             PORTDbits.RD0 = 1;
             PORTDbits.RD1 = 1;
             PORTDbits.RD2 = 1;
             PORTDbits.RD3 = 1;
           
            }
       
            if(x=='2' )
            {
           
             PORTDbits.RD0 = 1;
             PORTDbits.RD1 = 0;
             PORTDbits.RD2 = 1;
             PORTDbits.RD3 = 0;                     
             SetDCPWM1(k);
             SetDCPWM2(k);               
             }
         
            if(x=='3' )
            {
           
             PORTDbits.RD0 = 1;
             PORTDbits.RD1 = 0;
             PORTDbits.RD2 = 1;
             PORTDbits.RD3 = 0;
              k=k+200;
              if(k>=10000)
                k=10000;
                SetDCPWM1(k);
                SetDCPWM2(k);                           
             
            }

            if(x=='4' )
            {
           
               PORTDbits.RD0 = 1;
             PORTDbits.RD1 = 0;
             PORTDbits.RD2 = 1;
             PORTDbits.RD3 = 0;
               k=k-200;
               if(k<=0)
                k=0;
               SetDCPWM1(k);
                SetDCPWM2(k);           
           
            }
         
            if(x=='5' )
            {
           
             PORTDbits.RD0 = 0;
             PORTDbits.RD1 = 1;
             PORTDbits.RD2 = 0;
             PORTDbits.RD3 = 1;
                SetDCPWM1(k);
                SetDCPWM2(k);               
             }
         
             if(x=='6' )
            {
           
             PORTDbits.RD0 = 0;
             PORTDbits.RD1 = 1;
             PORTDbits.RD2 = 0;
             PORTDbits.RD3 = 1;
              k=k+200;
              if(k>=10000)
                k=10000;
                SetDCPWM1(k);
                SetDCPWM2(k);             
           
            }

            if(x=='7')
            {
             
               PORTDbits.RD0 = 0;
             PORTDbits.RD1 = 1;
             PORTDbits.RD2 = 0;
             PORTDbits.RD3 = 1;
               k=k-200;
               if(k<=0)
                k=0;
               SetDCPWM1(k);
                SetDCPWM2(k);           
           
            }
}

sadogan

Butonla basıp Interrupt üretip istediğiniz işlemleri yapıyorsun ama butonu basmayı bırakınca
Interrupt üretmiyorsunuz.
PORTB Interrupt-on-Change  bu interrupt b4..b7 pinlerinde herhangi bir değişme
olduğunda interrupt üretir butonu bu pinler den birene  bağlayıp , butona basınca ve
butonu bırakınca size interrupt üretir interrupta butonun durumuna bakıp basılmışsa
motoru durdurur bırakılmışsa motoru çalıştırırsınız

smail

hocam çok sağolasın ama 2 saattir deniyorum dediğiniz şeyi hala beceremedim . şu şekilde deniyorum fakat hala olmadı. motorları durdurabiliyorum fakat yine kesme bittikten sora motorlar önceki dönme yönünde kaldığı yerden devam etmiyor. hala tekrar sağa veya sola döndürme butonlarının basılmasını bekliyor.. 

void int_handler(void);

#pragma code high_vector=0x08
void high_interrupts (void) {
    _asm GOTO int_handler _endasm
}

#pragma code low_vector=0x18
void low_interrupts (void) {
    _asm GOTO int_handler _endasm
}

#pragma code
#pragma interrupt int_handler
void int_handler(void) {
  if( INTCONbits.RBIF==1)    // PORTB Change Interrupt
  {
   
   if( PORTBbits.RB4==1)    // PORTB Change Interrupt
   {
   
    PORTDbits.RD0 = 1;
    PORTDbits.RD1 = 1;
    PORTDbits.RD2 = 1;
    PORTDbits.RD3 = 1;
    INTCONbits.RBIF = 0; 
   }
   }
}

sadogan

   if( PORTBbits.RB4==1)    // PORTB Change Interrupt
   {
    
    PORTDbits.RD0 = 1;
    PORTDbits.RD1 = 1;
    PORTDbits.RD2 = 1;
    PORTDbits.RD3 = 1;
    INTCONbits.RBIF = 0;  
   } 
else
{
    //Buton bırakılınca yapılması gereken işler
}

smail

hocam işte butonu bırakılınca kesme gelmeden önce ne iş yapıyorsa ona devam etmesini istiyorum . bunu nasıl yapabilirim ?

sadogan

Kesme geldiginde button basılı ise çalısan motor vs leri
durumlarını saklayacaksın değişkene.
kesmeye geldiginde buton a basılmamıssa kaydettiginiz pozisyonları
yükleyeceksiniz.

smail

#6
çalıştı :)) çok teşekkürler çok sağolun problem dediğiniz gibi değişkeni genel olarak tanımlayarak çözüldü :) yalnız rb4 butonuna ilk basıldında değilde sonraki basıldığında çalışıyor o neyden kaynaklı olabilir aceba hocam ?

mesaj birleştirme:: 26 Mart 2013, 23:56:23

hocam size ne kadar teşekkür etsem az o sorunuda çözdüm kendim  :)

sadogan

Tebrikler
Diger sorunu nasıl çözdünüz ?

smail

diğer sorunu proteusta buton toprağa bağlıydı onu 5 v yaptım. normalde yazılımdada ==1 se diyorum ama nasılsa oldu :) şimdi ise başka engellerle boğuşuyorum :) herşey için çok teşekkürler..