step motor kontrolü derleyememe problemi

Başlatan ihu, 08 Nisan 2012, 05:31:33

ihu

arkadaşlar ayrı ayrı çalışan iki programı birleştirmek istedim. 1. program lcd ile step motor kontrol idi. 2. programım ise butonlarla dönen step  motorun ileri geri ve hız kontolü yapılmasıydı. ayrı ayrı çalışabilen bu iki program birleşince anlayamadım bir sebepten hata verip derlenemiyor. yardımcı olursanız sevinirim.. teşekkürler şimdiden ...

'STEP MOTOR KONTROL DEVRESI PROGRAMI
DEFINE OSC 4 ;4MHZ OSILATÖR KULLANILACAK

TRISB=240    ;B PORTUNUN TÜM PINLERI ÇIKIS YAPILDI
TRISC=255    ;C PORTUNUN TÜM PINLERI GIRIS YAPILDI
TRISD=8      ;D PORTUNUN TÜM PINLERI ÇIKIS YAPILDI

@ DEVICE pic16F877A
@ DEVICE pic16F877A, PWRT_ON
@ DEVICE pic16F877A, WDT_OFF
@ DEVICE pic16F877A, PROTECT_OFF  ;kod korumasi yok
@ DEVICE pic16F877A, XT_OSC       ;KRISTAL OSILATÖR KULLANILACAK



DEFINE LCD_DREG PORTD 'LCD data port
DEFINE LCD_DBIT 4 'LCD data starting bit 0 or 4
DEFINE LCD_RSREG PORTD 'LCD register select port
DEFINE LCD_RSBIT 1 'LCD register select bit
DEFINE LCD_EREG PORTD 'LCD enable port
DEFINE LCD_EBIT 0 'LCD enable bit
DEFINE LCD_RWREG PORTD 'LCD read/write port
DEFINE LCD_RWBIT 2 'LCD read/write bit
DEFINE LCD_BITS 4 'LCD bus size 4 or 8
DEFINE LCD_LINES 2 'Number lines on LCD
DEFINE LCD_COMMANDUS 2000 'Command delay time in us
DEFINE LCD_DATAUS 50 'Data delay time in us 

LCDOUT $FE,$40,4,14,21,4,4,4,4,0 ;YUKARI OK ISARETI SIFIRINCI ADRES
LCDOUT $FE,$48,4,4,4,4,21,14,4,0 ;ASAGI OK ISARETI BIRINCI ADRES
LCDOUT $FE,$50,0,4,8,31,8,4,0,0  ;SOL OK ISARETI  IKINCI ADRES
LCDOUT $FE,$58,0,4,2,31,2,4,0,0  ;SAG OK ISARETI ÜÇÜNCÜ ADRES

YUKARI VAR PORTC.0
ASAGI  VAR PORTC.1
OK     VAR PORTC.2
SAG    VAR PORTC.3
SOL    VAR PORTC.4

DEV VAR BYTE
A VAR BYTE
B VAR BYTE
ADIM   VAR BYTE
HIZ    VAR BYTE
SAYI   VAR BYTE
X      VAR BYTE
Y      VAR BYTE
SURE   VAR WORD
M      VAR BYTE [2]
K      VAR BYTE [4]
A=0 
B=0
DEV=35

LCDOUT $FE,1  ;LCD TEMIZLENIYOR
PAUSE 200

M[0]=0
M[1]=0
K[0]="A"
K[1]="G"
K[2]="O"
K[3]="L"
ADIM=1
HIZ=1
Y=0
SAYI=1

PORTB=0 ;MOTOR DATA PINLERINE SIFIR GÖNDERILIYOR

ACILIS:

LCDOUT $FE,$83,"STEP MOTOR"
LCDOUT $FE,$C4,"KONTROL"
PAUSE 2000
LCDOUT $FE,1
LCDOUT $FE,$80,".....SiSTEM....."
LCDOUT $FE,$C0,"...YUKLENiYOR..."
PAUSE 1000

;MOTOR BU IKI FOR DÖNGÜSÜ ILE RASTGELE SAGA VE SOLA
;HAREKET ETTIRILEREK SIFIR AYARI YAPILIR 

FOR X=0 TO 16

PORTB=SAYI
PAUSE 5
SAYI=SAYI*2
IF SAYI>8 THEN SAYI=1

NEXT X

FOR X=0 TO 16

IF SAYI=1 THEN
SAYI=8
ELSE
SAYI=SAYI/2
ENDIF

PORTB=SAYI
PAUSE 5

NEXT X

WRITE 0,SAYI ;MOTORUN SON KALDIGI KONUMUN ADRESI HAFIZAYA KAYDEDILIYOR

LCDOUT $FE,1 ;LCD TEMIZLENIYOR

GOTO MENU1

MENU1:

LCDOUT $FE,$80,2
LCDOUT $FE,$82,"ADIM  SAYISI"
LCDOUT $FE,$8F,3
LCDOUT $FE,$C0,0
LCDOUT $FE,$C7,DEC3 ADIM
LCDOUT $FE,$CF,1
PAUSE 10

IF YUKARI=0 THEN  ;ADIM SAYISI ARTTIRILIR

ADIM=ADIM+1

IF ADIM>200 THEN

GOSUB UYARI1
ADIM=1

ENDIF

PAUSE 300 ;BUTONDAN ELINI ÇEKME SÜRESI KADAR BEKLENILIR

ENDIF

IF ASAGI=0 THEN ;ADIM SAYISI AZALTILIR

ADIM=ADIM-1

IF ADIM=0 THEN

GOSUB UYARI2
ADIM=200

ENDIF

PAUSE 300  ;BUTONDAN ELINI ÇEKME SÜRESI KADAR BEKLENILIR

ENDIF

IF SAG=0 THEN ;HIZ MENÜSÜNE GEÇIS YAPILIR

PAUSE 300  ;BUTONDAN ELINI ÇEKME SÜRESI KADAR BEKLENILIR
LCDOUT $FE,1
GOTO MENU2

ENDIF

IF SOL=0 THEN  ;YÖN MENÜSÜNE GEÇIS YAPILIR

PAUSE 300 ;BUTONDAN ELINI ÇEKME SÜRESI KADAR BEKLENILIR
LCDOUT $FE,1
GOTO MENU3

ENDIF

IF OK=0 THEN GOSUB ISLE ;GIRILEN ISLEMIN MOTORA UYGULANACAK MENUYE GIDILIR

GOTO MENU1

MENU2:

LCDOUT $FE,$80,2
LCDOUT $FE,$83,"HIZ  AYARI"
LCDOUT $FE,$8F,3
LCDOUT $FE,$C0,0
LCDOUT $FE,$C6,DEC3 HIZ
LCDOUT $FE,$CF,1
PAUSE 10

IF YUKARI=0 THEN

HIZ=HIZ+1

IF HIZ>200 THEN

GOSUB UYARI3
HIZ=1

ENDIF

PAUSE 300 ;BUTONDAN ELINI ÇEKME SÜRESI KADAR BEKLENILIR

ENDIF

IF ASAGI=0 THEN

HIZ=HIZ-1

IF HIZ=0 THEN

GOSUB UYARI4
HIZ=200

ENDIF

PAUSE 300 ;BUTONDAN ELINI ÇEKME SÜRESI KADAR BEKLENILIR

ENDIF

IF SOL=0 THEN

PAUSE 300  ;BUTONDAN ELINI ÇEKME SÜRESI KADAR BEKLENILIR
LCDOUT $FE,1
GOTO MENU1

ENDIF

IF SAG=0 THEN

PAUSE 300  ;BUTONDAN ELINI ÇEKME SÜRESI KADAR BEKLENILIR
LCDOUT $FE,1
GOTO MENU3

ENDIF

IF OK=0 THEN GOSUB ISLE ;GIRILEN ISLEMIN MOTORA UYGULANACAK MENUYE GIDILIR

GOTO MENU2

MENU3:

LCDOUT $FE,$80,2
LCDOUT $FE,$83,"YON  AYARI"
LCDOUT $FE,$8F,3
LCDOUT $FE,$C0,0
LCDOUT $FE,$C6,"S",K[Y],K[Y+1]
LCDOUT $FE,$CF,1
PAUSE 10

IF YUKARI=0 THEN

Y=2 ;YÖN SEÇIMININ SOL OLARAK AYARLANMASI
PAUSE 300 ;BUTONDAN ELINI ÇEKME SÜRESI KADAR BEKLENILIR

ENDIF

IF ASAGI=0 THEN

Y=0 ;YÖN SEÇIMININ SAG OLARAK AYARLANMASI
PAUSE 300  ;BUTONDAN ELINI ÇEKME SÜRESI KADAR BEKLENILIR

ENDIF

IF SOL=0 THEN

PAUSE 300  ;BUTONDAN ELINI ÇEKME SÜRESI KADAR BEKLENILIR
LCDOUT $FE,1
GOTO MENU2

ENDIF

IF SAG=0 THEN

PAUSE 300  ;BUTONDAN ELINI ÇEKME SÜRESI KADAR BEKLENILIR
LCDOUT $FE,1
GOTO MENU1

ENDIF

IF OK=0 THEN GOSUB ISLE ;GIRILEN ISLEMIN MOTORA UYGULANACAK MENUYE GIDILIR

GOTO MENU3


CALIS:

SURE=1000/HIZ
READ 0,SAYI
M[1]=M[0]
M[0]=Y

IF M[0]=M[1] THEN
ADIM=ADIM-1
ELSE
ENDIF

IF Y=2 THEN
FOR X=0 TO ADIM
PORTB=SAYI
PAUSE SURE
SAYI=SAYI*2
IF SAYI>8 THEN SAYI=1
NEXT X
ENDIF

IF Y=0 THEN
FOR X=0 TO ADIM
IF SAYI=1 THEN
SAYI=8
ELSE
SAYI=SAYI/2
ENDIF
PORTB=SAYI
PAUSE SURE
NEXT X
ENDIF

WRITE 0,SAYI

IF M[0]=M[1] THEN ADIM=ADIM+1

PORTB=0

RETURN
-+
ISLE:

LCDOUT $FE,1
LCDOUT $FE,$80,".....SiSTEM....."
LCDOUT $FE,$C0,"...YUKLENiYOR..."
PAUSE 1000
GOSUB CALIS
LCDOUT $FE,1

RETURN

UYARI1:

LCDOUT $FE,1
LCDOUT $FE,$82,"MAKSiMUM 200"
LCDOUT $FE,$C6,"ADIM"
PAUSE 2000
LCDOUT $FE,1

RETURN

UYARI2:

LCDOUT $FE,1
LCDOUT $FE,$83,"MiNiMUM 1"
LCDOUT $FE,$C6,"ADIM"
PAUSE 2000
LCDOUT $FE,1

RETURN

UYARI3:

LCDOUT $FE,1
LCDOUT $FE,$82,"MAKSiMUM HIZ"
LCDOUT $FE,$C1,"200 ADIM/SANiYE"
PAUSE 2000
LCDOUT $FE,1

RETURN

UYARI4:

LCDOUT $FE,1
LCDOUT $FE,$82,"MiNiMUM HIZ"
LCDOUT $FE,$C2,"1 ADIM/SANiYE"
PAUSE 2000
LCDOUT $FE,1

RETURN

 BASLA
 IF PORTD.3=1 THEN PORTB=%01000000 :A=0 : B=0  'STOP
 IF PORTB.7=1 THEN : DEV=DEV+1 : PAUSE 200
 IF DEV>200 THEN DEV=200
 IF PORTB.6=1 THEN : DEV=DEV-1 : PAUSE 200
 IF DEV<10 THEN DEV=10 
 IF PORTB.5= 1 THEN  : B=0 :A=1  
 IF PORTB.4= 1 THEN A=0 : B=1  
 IF A=1 THEN GOSUB ILERI 
 IF B=1 THEN GOSUB GERI  
 
GOTO BASLA
 
 ILERI:
  PORTB=1 
   PAUSE DEV 
 PORTB=2
  PAUSE DEV 
 PORTB=4
   PAUSE DEV 
 PORTB=8
   PAUSE DEV  
 RETURN
 
 GERI:
   PORTB=8 
   PAUSE DEV 
   PORTB=4
   PAUSE DEV 
   PORTB=2
   PAUSE DEV 
   PORTB=1
   PAUSE DEV 
 RETURN
END

ipek

RETURN
'-+
ISLE:



bu -+ işaretine kıl kapıyor hata mesajını satırı falan belirtmemişsin bu işaretlri kaldırınca derliyor...

ihu

benim pc imde win7 64 bit var bu yüzden arkadaşımın pc de derliyoruz 4 satırda hata veriyordu.. hataları şuan hatırlayamıyorum . pic basic ten çok anlayamadığımda bir gerçek aslında :) +- kısmını kaldırınca derlediğinizi gönderebilirmisiniz ? çok teşekkür ederim ..

ete

Program yalnızca bir satırda hata veriyor. Oda 327 nolu satırda yer alan, -+ karekterlerinin olduğu satır.
Bu satır ISLE: isimli etiketine hemen üzerinde yer almaktadır. Normalde bu satırın başına (') işareti koyar veya satırı silerseniz ki hiç bir işe yaramamaktadır, program sorunsuz derlenmektedir.

Bu program aynı şekilde 64 bit makinada da derlenebilir. Yapmanız gereken şey;
@ DEVICE pic16F877A
@ DEVICE pic16F877A, PWRT_ON
@ DEVICE pic16F877A, WDT_OFF
@ DEVICE pic16F877A, PROTECT_OFF  ;kod korumasi yok
@ DEVICE pic16F877A, XT_OSC       ;KRISTAL OSILATÖR KULLANILACAK

satırlarını silip yerine;
@  __config _XT_OSC & _WDT_OFF & _LVP_OFF & _CP_OFF & _PWRTE_ON & _CPD_OFF
yazmanız olacaktır.
Daha sonra programı MPASM seçeneği ile (View menüsü Compile & Program Options ==> Assembler Seçeneğinde) derlemeniz gerekiyor.

Ete

Bilgi hazinedir paylaştıkça büyür.            http://etepic.com