microc motor kontrol yardım

Başlatan ozen26, 25 Mart 2008, 14:41:00

ozen26

Öncelikle herkese selamlar...
Asm ile yazılmıs programları micro c ile yazmaya calısıyorum ama bazı(yeni basladım) yerlerde takılıyorum programda step motor sag butonuna basıldıgında saga doğru dönecek dur butonuna basıldıgında duracak ama benim yazdıgım kodda direk çalışmaya baslıyor dur butonuna basınca duruyor ama tekrar sag butonuna bastıgımda calışmıyor.
yardımlarınızı bekliyorum teşekkür ederim:)


gercek asm programı

LIST P=16F84      
             #include "P16F84.INC"
             __CONFIG _WDT_OFF &_XT_OSC &_PWRTE_ON &_CP_OFF
LSB    EQU    H'20'
MSB    EQU    H'21'
;**************
   ORG    0X00
   GOTO    BASLA
;*******************
BEKLE
   MOVLW .45
   MOVWF LSB
DON1
   MOVLW .95
   MOVWF MSB
DON2   
   DECFSZ  MSB,F
   GOTO DON2
   DECFSZ  LSB,F
   GOTO DON1
   RETURN
;****************

BASLA
   CLRF    MSB
   CLRF    LSB
   BSF    STATUS,5
   MOVLW     B'11111111'
   MOVWF    TRISA   
   CLRF    TRISB
   BCF    STATUS,5   
   CLRF    PORTB
;********************************************   
TEST
   BTFSS PORTA,0
   GOTO    SAG
   BTFSS PORTA,1
   GOTO   SOL
   GOTO   TEST

SOL   
   BTFSS PORTA,2
   GOTO    TEST
   
   MOVLW B'11000110'
   MOVWF PORTB
   CALL BEKLE

   MOVLW B'01000011'
   MOVWF PORTB
   CALL BEKLE

   MOVLW B'01001001'
   MOVWF PORTB
   CALL BEKLE

   MOVLW B'11001100'
   MOVWF PORTB
   CALL BEKLE
   CLRF    PORTB
   BTFSS PORTA,0
   GOTO      SAG
   GOTO      SOL
;*******************************
SAG
   BTFSS PORTA,2
   GOTO    TEST
   
   MOVLW B'00110011'
   MOVWF PORTB
   CALL BEKLE
   
   MOVLW B'00100110'
   MOVWF PORTB
   CALL BEKLE

   MOVLW B'00101100'
   MOVWF PORTB
   CALL BEKLE

   MOVLW B'00111001'
   MOVWF PORTB
   CALL BEKLE
   CLRF    PORTB
   BTFSS PORTA,1
   GOTO    SOL
   GOTO    SAG

   END

benim yazmaya calıstıgım kod

void main (){
TRISA=0xff;
TRISB=0;
PORTB=0;
if(PORTA.F0==0){
while(PORTA.F2=1){   //sağa dön
PORTB=0x33;
Delay_ms(50);
PORTB= 0x26;
Delay_ms(50);
PORTB=0x2c;
Delay_ms(50);
PORTB=0x39;
Delay_ms(50);
PORTB=0;
}
PORTB=0;
}}


devreyi nerden aldıgımı hatırlayamadıgım için kaynagı yazamıyorum kusura bakmayın

AKadirY

öncelikle programındaki eksik şu programın sonsuz döngülü değil. while(PORTA.F2=1) yazdığın için ve bu şart başlangıçta sağladığından hemen while döngüsüne  girer.dur butonuna basdığın zaman while döngüsünden çıkar.ve program biter.senin verdiğin şemaya göre bi program yazdım istersen bunu bi dene.fotoğraf nasıl eklenecek bilmiyorum :oops:
kusura bakma kolay gelsin.

void main (){
TRISA=0xff;
TRISB=0;
PORTB=0;
PORTA=0;
DUR:
if(PORTA.F1==0)
goto DONSAG;
if(PORTA.F2==0)
goto DONSOL;
goto DUR;

DONSAG:
PORTB= 0x03;
Delay_ms(50);
PORTB=0x02;
Delay_ms(50);
PORTB=0x06;
Delay_ms(50);
PORTB=0x04;
Delay_ms(50);
PORTB=0x0C;
Delay_ms(50);
PORTB=0x08;
Delay_ms(50);
PORTB=0x09;
Delay_ms(50);
PORTB=0x01;
Delay_ms(50);
if(PORTA.F0==0)
goto DUR;
if(PORTA.F2==0)
goto DONSOL;
goto DONSAG;

DONSOL:
PORTB= 0x01;
Delay_ms(50);
PORTB=0x09;
Delay_ms(50);
PORTB=0x08;
Delay_ms(50);
PORTB=0x0C;
Delay_ms(50);
PORTB=0x04;
Delay_ms(50);
PORTB=0x06;
Delay_ms(50);
PORTB=0x02;
Delay_ms(50);
PORTB=0x03;
Delay_ms(50);
if(PORTA.F0==0)
goto DUR;
if(PORTA.F1==0)
goto DONSAG;
goto DONSOL;
}

16F84A  8MHz.
yön değiştirmek yada durdurmak için tam bi tur atmasını beklemen lazım. bu durumu düzeltmek için kesme kullanmalısın yada her adımdan sonra buton kontrolü yaptırmalısın.
Bi çaresi bulunur elbet...

ozen26

sağolasın AkadirY.
denedim programını calısıyor
durdurma butonu yer değiştirdi sadece

AKadirY

bu devreyi biyerden hatırlıyorum diyordum buldum. @profahmet hocamın devresi.eğer programı derlerken bi yanlış yapmadıysan çalışıyor.
Bi çaresi bulunur elbet...

ozen26

kadir sen micro c mi kullanıyorsun bana örnek programlar yollasana elinde varsa
ayrıca ilgin için teşekkür ederim
mail adresim

ozen26@gmail.com