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);
}
}
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
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;
}
}
}
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
}
hocam işte butonu bırakılınca kesme gelmeden önce ne iş yapıyorsa ona devam etmesini istiyorum . bunu nasıl yapabilirim ?
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.
ç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 :)
Tebrikler
Diger sorunu nasıl çözdünüz ?
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..