proton kodum çalışmıyor

Başlatan hamzahaluk, 27 Mart 2014, 23:05:01

hamzahaluk

Hocalarım çizgi izleyen (8 sensörlü) için bir kod yazdım ama çalıştıramadım robotta, acaba problem nerede? Yardımcı olur musunuz?
Device  16F877
XTAL 20

CCP1_PIN=PORTC.2 'CCP1 PİNİN HANGİ UCTA OLDUGUNU TANIMLADIK sag pwm
CCP2_PIN=PORTC.1 'CCP2 PİNİN HANGİ UCTA OLDUGUNU TANIMLADIK sol pwm

PORTB=0  'portlar sıfırlandı
PORTC=0
TRISB=1 ' b portu giris
TRISC=0 'c portu cikis

Dim solpwm As  PORTC.1  'sol motor pwm
Dim sagpwm As PORTC.2  'sag motor pwm
Dim sagduz As PORTC.3  'sag motor
Dim sagters As PORTC.4  'sag motor
Dim solduz As  PORTC.5  'sol motor
Dim solters As PORTC.6  'sol motor

Dim sag4 As PORTB.0
Dim sag3 As PORTB.1
Dim sag2 As PORTB.2
Dim sag1 As PORTB.3
Dim sol1 As PORTB.4
Dim sol2 As PORTB.5
Dim sol3 As PORTB.6
Dim sol4 As PORTB.7

Dim a As Byte
Dim b As Byte
Dim c As Byte
Dim d As Byte
Dim e As Byte
Dim f As Byte
Dim h As Byte
Dim t As Byte

a=127   'ileri
b=115   'en hafif
c=105   'en hafif2
d=50    'hafif
e=40    'hafif2
f=20    'kuvvetli
h=0     'kuvvetli2
t=60    'ters

basla:

If PORTB=%00011000 Then GoTo ileri
If PORTB=%00001100 Then GoTo hafifsag
If PORTB=%00000110 Then GoTo sag
If PORTB=%00000011 Then GoTo tamsag
If PORTB=%00110000 Then GoTo hafifsol
If PORTB=%01100000 Then GoTo sol
If PORTB=%11000000 Then GoTo tamsol
If PORTB=%00000001 Then GoTo kesksag
If PORTB=%10000000 Then GoTo kesksol
If PORTB=%00000010 Then GoTo sag22
If PORTB=%01000000 Then GoTo sol22
If PORTB=%00000100 Then GoTo hafsag2
If PORTB=%00100000 Then GoTo hafsol2
If PORTB=%00001000 Then GoTo azciksag
If PORTB=%00010000 Then GoTo azciksol
If PORTB=%11111111 Then GoTo dur
If PORTB=%00001111 Or PORTB=%00000111 Then GoTo doksan

GoTo basla

ileri:
HPWM 1,a,3000
HPWM 2,a,3000
PORTC=%00101000
GoTo basla

hafifsag:
HPWM 1,a,3000
HPWM 2,b,3000
PORTC=%00101000
GoTo basla

sag:
HPWM 1,a,3000
HPWM 2,c,3000
PORTC=%00101000
GoTo basla

tamsag:
HPWM 1,a,3000
HPWM 2,h,3000
PORTC=%00101000
GoTo basla

hafsag2:
HPWM 1,a,3000
HPWM 2,d,3000
PORTC=%00101000
GoTo basla

hafifsol:
HPWM 1,b,3000
HPWM 2,a,3000
PORTC=%00101000
GoTo basla

sol:
HPWM 1,c,3000
HPWM 2,a,3000
PORTC=%00101000
GoTo basla

tamsol:
HPWM 1,h,3000
HPWM 2,a,3000
PORTC=%00101000
GoTo basla

hafsol2:
HPWM 1,d,3000
HPWM 2,a,3000
PORTC=%00101000
GoTo basla

kesksag:
HPWM 1,a,3000
HPWM 2,t,3000
PORTC=%00110000
GoTo basla

kesksol:
HPWM 1,t,3000
HPWM 2,a,3000
PORTC=%01001000
GoTo basla

sag22:
HPWM 1,a,3000
HPWM 2,h,3000
PORTC=%00101000
GoTo basla

sol22:
HPWM 1,h,3000
HPWM 2,a,3000
PORTC=%00101000
GoTo basla

hafifsag2:
HPWM 1,a,3000
HPWM 2,d,3000
PORTC=%00101000
GoTo basla

hafifsol2:
HPWM 1,d,3000
HPWM 2,a,3000
PORTC=%00101000
GoTo basla

azciksag:
HPWM 1,a,3000
HPWM 2,b,3000
PORTC=%00101000
GoTo basla

azciksol:
HPWM 1,b,3000
HPWM 2,a,3000
PORTC=%00101000
GoTo basla

dur:
HPWM 1,h,3000
HPWM 2,h,3000
PORTC=%00000000
GoTo basla

doksan:
HPWM 1,a,3000
HPWM 2,t,3000
PORTC=%00001000
GoTo basla

Maxim

16F877 mi 16F877A mı?
16f877 için config satırı eksik, onu tamamlayın
config satırından sonra declare PortB_Pullups 1 ve CMCON =7 yazın
xtal satırını Declare Xtal=20 olarak değiştirin

hamzahaluk

Dediğiniz gibi kodu şu şekilde düzelttim ama program yine çalışmadı. 16F877A olarak düzelttim kullandığım PIC'i

Device  16F877A
Declare XTAL=20
Declare PORTB_PULLAPS 1
CMCON=7

CCP1_PIN=PORTC.2 'CCP1 PİNİN HANGİ UCTA OLDUGUNU TANIMLADIK sag pwm
CCP2_PIN=PORTC.1 'CCP2 PİNİN HANGİ UCTA OLDUGUNU TANIMLADIK sol pwm

Device 16F877A, WDT_OFF             
Device 16F877A, PWRT_OFF           
Device 16F877A, PROTECT_OFF       
Device 16F877A, XT_OSC

PORTB=0  'portlar sıfırlandı
PORTC=0
TRISB=1 ' b portu giris
TRISC=0 'c portu cikis

Dim solpwm As  PORTC.1  'sol motor pwm
Dim sagpwm As PORTC.2  'sag motor pwm
Dim sagduz As PORTC.3  'sag motor
Dim sagters As PORTC.4  'sag motor
Dim solduz As  PORTC.5  'sol motor
Dim solters As PORTC.6  'sol motor

Dim sag4 As PORTB.0
Dim sag3 As PORTB.1
Dim sag2 As PORTB.2
Dim sag1 As PORTB.3
Dim sol1 As PORTB.4
Dim sol2 As PORTB.5
Dim sol3 As PORTB.6
Dim sol4 As PORTB.7

Dim a As Word
Dim b As Word
Dim c As Word
Dim d As Word
Dim e As Word
Dim f As Word
Dim h As Word
Dim t As Word

a=127   'ileri
b=115   'en hafif
c=105   'en hafif2
d=50    'hafif
e=40    'hafif2
f=20    'kuvvetli
h=0     'kuvvetli2
t=60    'ters

basla:

If PORTB=%00011000 Then GoTo ileri
If PORTB=%00001100 Then GoTo hafifsag
If PORTB=%00000110 Then GoTo sag
If PORTB=%00000011 Then GoTo tamsag
If PORTB=%00110000 Then hafifsol
If PORTB=%01100000 Then GoTo sol
If PORTB=%11000000 Then GoTo tamsol
If PORTB=%00000001 Then GoTo kesksag
If PORTB=%10000000 Then GoTo kesksol
If PORTB=%00000010 Then GoTo sag22
If PORTB=%01000000 Then GoTo sol22
If PORTB=%00000100 Then GoTo hafsag2
If PORTB=%00100000 Then GoTo hafsol2
If PORTB=%00001000 Then GoTo azciksag
If PORTB=%00010000 Then GoTo azciksol
If PORTB=%11111111 Then GoTo dur
If PORTB=%00001111 Or PORTB=%00000111 Then GoTo doksan

GoTo basla

ileri:
HPWM 1,a,3000
HPWM 2,a,3000
PORTC=%00101000
GoTo basla

hafifsag:
HPWM 1,a,3000
HPWM 2,b,3000
PORTC=%00101000
GoTo basla

sag:
HPWM 1,a,3000
HPWM 2,c,3000
PORTC=%00101000
GoTo basla

tamsag:
HPWM 1,a,3000
HPWM 2,h,3000
PORTC=%00101000
GoTo basla

hafsag2:
HPWM 1,a,3000
HPWM 2,d,3000
PORTC=%00101000
GoTo basla

hafifsol:
HPWM 1,b,3000
HPWM 2,a,3000
PORTC=%00101000
GoTo basla

sol:
HPWM 1,c,3000
HPWM 2,a,3000
PORTC=%00101000
GoTo basla

tamsol:
HPWM 1,h,3000
HPWM 2,a,3000
PORTC=%00101000
GoTo basla

hafsol2:
HPWM 1,d,3000
HPWM 2,a,3000
PORTC=%00101000
GoTo basla

kesksag:
HPWM 1,a,3000
HPWM 2,t,3000
PORTC=%00110000
GoTo basla

kesksol:
HPWM 1,t,3000
HPWM 2,a,3000
PORTC=%01001000
GoTo basla

sag22:
HPWM 1,a,3000
HPWM 2,h,3000
PORTC=%00101000
GoTo basla

sol22:
HPWM 1,h,3000
HPWM 2,a,3000
PORTC=%00101000
GoTo basla

hafifsag2:
HPWM 1,a,3000
HPWM 2,d,3000
PORTC=%00101000
GoTo basla

hafifsol2:
HPWM 1,d,3000
HPWM 2,a,3000
PORTC=%00101000
GoTo basla

azciksag:
HPWM 1,a,3000
HPWM 2,b,3000
PORTC=%00101000
GoTo basla

azciksol:
HPWM 1,b,3000
HPWM 2,a,3000
PORTC=%00101000
GoTo basla

dur:
HPWM 1,h,3000
HPWM 2,h,3000
PORTC=%00000000
GoTo basla

doksan:
HPWM 1,a,3000
HPWM 2,t,3000
PORTC=%00001000
GoTo basla


ete

Kristal 20 (Mhz) olunca,

Device 16F877A, XT_OSC satırı,
Device 16F877A, HC_OSC  şeklinde olmalıdır.

XT parametresi 6 Mhz'e kadar olan kristaller için kullanılır. Üzeri için HS_OSC kullanılmalıdır.

İşlemcinin 1 nolu bacağı ile +5V arasına 10K direnç bağlamanız gerekir bunu unutmayın. Buda bir çalışmama sebebidir.
Ayrıca kristal bacaklarının her biri 22pF kondansatör ile GND ye bağlanmalıdır.

Ete

gergy

ETE hocamızın dediklerinin yanı sıra  Config satırını ayrıca şöyle de bir deneyin;

Config FOSC_HS, WDTE_OFF, PWRTE_OFF, BOREN_OFF, LVP_OFF, CPD_OFF, WRT_OFF, DEBUG_OFF, CP_OFF

hamzahaluk

Hocam devrede problem yok. Aynı devre başka bir arkadaşın PIC C ile yazılmış programı çalıştırıyor. Ama bana Proton mantığı daha sade geldiği için aynı şeyleri burda yapmaya çalıştım ama yazdığım bu kodlarla bir türlü çalıştıramadım.
Ayrıca derleme yapınca şöyle bir yazı geliyor alt tarafa
HINT [LINE 3]: Unrecognised DECLARE. Creating an assembler #DEFİNE directive

Maxim

#6


Device = 16F877A
Declare Xtal=20
Config FOSC_HS, WDTE_OFF, PWRTE_ON, BOREN_OFF, LVP_OFF, CPD_OFF, WRT_OFF, DEBUG_OFF, CP_OFF
               
Declare All_Digital= true
Declare PortB_Pullups 1
CMCON=7

Declare CCP1_Pin=PORTC.2 'CCP1 PİNİN HANGİ UCTA OLDUGUNU TANIMLADIK sag pwm
Declare CCP2_Pin=PORTC.1 'CCP2 PİNİN HANGİ UCTA OLDUGUNU TANIMLADIK sol pwm

PORTB=0  'portlar sıfırlandı
PORTC=0
TRISB=1 ' b portu giris
TRISC=0 'c portu cikis

Dim solpwm As  PORTC.1  'sol motor pwm
Dim sagpwm As PORTC.2  'sag motor pwm
Dim sagduz As PORTC.3  'sag motor
Dim sagters As PORTC.4  'sag motor
Dim solduz As  PORTC.5  'sol motor
Dim solters As PORTC.6  'sol motor

Dim sag4 As PORTB.0
Dim sag3 As PORTB.1
Dim sag2 As PORTB.2
Dim sag1 As PORTB.3
Dim sol1 As PORTB.4
Dim sol2 As PORTB.5
Dim sol3 As PORTB.6
Dim sol4 As PORTB.7

Dim a As Word
Dim b As Word
Dim c As Word
Dim d As Word
Dim e As Word
Dim f As Word
Dim h As Word
Dim t As Word

a=127   'ileri
b=115   'en hafif
c=105   'en hafif2
d=50    'hafif
e=40    'hafif2
f=20    'kuvvetli
h=0     'kuvvetli2
t=60    'ters

basla:

If PORTB=%00011000 Then GoSub ileri
If PORTB=%00001100 Then GoSub hafifsag
If PORTB=%00000110 Then GoSub sag
If PORTB=%00000011 Then GoSub tamsag
If PORTB=%00110000 Then GoSub hafifsol
If PORTB=%01100000 Then GoSub sol
If PORTB=%11000000 Then GoSub tamsol
If PORTB=%00000001 Then GoSub kesksag
If PORTB=%10000000 Then GoSub kesksol
If PORTB=%00000010 Then GoSub sag22
If PORTB=%01000000 Then GoSub sol22
If PORTB=%00000100 Then GoSub hafsag2
If PORTB=%00100000 Then GoSub hafsol2
If PORTB=%00001000 Then GoSub azciksag
If PORTB=%00010000 Then GoSub azciksol
If PORTB=%11111111 Then GoSub dur
If PORTB=%00001111 Or PORTB=%00000111 Then GoSub doksan

GoTo basla

ileri:
HPWM 1,a,3000
HPWM 2,a,3000
PORTC=%00101000
Return

hafifsag:
HPWM 1,a,3000
HPWM 2,b,3000
PORTC=%00101000
Return

sag:
HPWM 1,a,3000
HPWM 2,c,3000
PORTC=%00101000
Return

tamsag:
HPWM 1,a,3000
HPWM 2,h,3000
PORTC=%00101000
Return

hafsag2:
HPWM 1,a,3000
HPWM 2,d,3000
PORTC=%00101000
Return

hafifsol:
HPWM 1,b,3000
HPWM 2,a,3000
PORTC=%00101000
Return

sol:
HPWM 1,c,3000
HPWM 2,a,3000
PORTC=%00101000
Return

tamsol:
HPWM 1,h,3000
HPWM 2,a,3000
PORTC=%00101000
Return

hafsol2:
HPWM 1,d,3000
HPWM 2,a,3000
PORTC=%00101000
Return

kesksag:
HPWM 1,a,3000
HPWM 2,t,3000
PORTC=%00110000
Return

kesksol:
HPWM 1,t,3000
HPWM 2,a,3000
PORTC=%01001000
Return

sag22:
HPWM 1,a,3000
HPWM 2,h,3000
PORTC=%00101000
Return

sol22:
HPWM 1,h,3000
HPWM 2,a,3000
PORTC=%00101000
Return

hafifsag2:
HPWM 1,a,3000
HPWM 2,d,3000
PORTC=%00101000
Return

hafifsol2:
HPWM 1,d,3000
HPWM 2,a,3000
PORTC=%00101000
Return

azciksag:
HPWM 1,a,3000
HPWM 2,b,3000
PORTC=%00101000
Return

azciksol:
HPWM 1,b,3000
HPWM 2,a,3000
PORTC=%00101000
Return

dur:
HPWM 1,h,3000
HPWM 2,h,3000
PORTC=%00000000
Return

doksan:
HPWM 1,a,3000
HPWM 2,t,3000
PORTC=%00001000
Return



EDIT:
başka hatalar vardı düzeltildi

gergy

Maxim hocam sizin için halletmiş sorunları  :P

hamzahaluk

Alıntı yapılan: Maxim - 28 Mart 2014, 15:39:44


Device = 16F877A
Declare Xtal=20
Config FOSC_HS, WDTE_OFF, PWRTE_ON, BOREN_OFF, LVP_OFF, CPD_OFF, WRT_OFF, DEBUG_OFF, CP_OFF
               
Declare All_Digital= true
Declare PortB_Pullups 1
CMCON=7

Declare CCP1_Pin=PORTC.2 'CCP1 PİNİN HANGİ UCTA OLDUGUNU TANIMLADIK sag pwm
Declare CCP2_Pin=PORTC.1 'CCP2 PİNİN HANGİ UCTA OLDUGUNU TANIMLADIK sol pwm

PORTB=0  'portlar sıfırlandı
PORTC=0
TRISB=1 ' b portu giris
TRISC=0 'c portu cikis

Dim solpwm As  PORTC.1  'sol motor pwm
Dim sagpwm As PORTC.2  'sag motor pwm
Dim sagduz As PORTC.3  'sag motor
Dim sagters As PORTC.4  'sag motor
Dim solduz As  PORTC.5  'sol motor
Dim solters As PORTC.6  'sol motor

Dim sag4 As PORTB.0
Dim sag3 As PORTB.1
Dim sag2 As PORTB.2
Dim sag1 As PORTB.3
Dim sol1 As PORTB.4
Dim sol2 As PORTB.5
Dim sol3 As PORTB.6
Dim sol4 As PORTB.7

Dim a As Word
Dim b As Word
Dim c As Word
Dim d As Word
Dim e As Word
Dim f As Word
Dim h As Word
Dim t As Word

a=127   'ileri
b=115   'en hafif
c=105   'en hafif2
d=50    'hafif
e=40    'hafif2
f=20    'kuvvetli
h=0     'kuvvetli2
t=60    'ters

basla:

If PORTB=%00011000 Then GoSub ileri
If PORTB=%00001100 Then GoSub hafifsag
If PORTB=%00000110 Then GoSub sag
If PORTB=%00000011 Then GoSub tamsag
If PORTB=%00110000 Then GoSub hafifsol
If PORTB=%01100000 Then GoSub sol
If PORTB=%11000000 Then GoSub tamsol
If PORTB=%00000001 Then GoSub kesksag
If PORTB=%10000000 Then GoSub kesksol
If PORTB=%00000010 Then GoSub sag22
If PORTB=%01000000 Then GoSub sol22
If PORTB=%00000100 Then GoSub hafsag2
If PORTB=%00100000 Then GoSub hafsol2
If PORTB=%00001000 Then GoSub azciksag
If PORTB=%00010000 Then GoSub azciksol
If PORTB=%11111111 Then GoSub dur
If PORTB=%00001111 Or PORTB=%00000111 Then GoSub doksan

GoTo basla

ileri:
HPWM 1,a,3000
HPWM 2,a,3000
PORTC=%00101000
Return

hafifsag:
HPWM 1,a,3000
HPWM 2,b,3000
PORTC=%00101000
Return

sag:
HPWM 1,a,3000
HPWM 2,c,3000
PORTC=%00101000
Return

tamsag:
HPWM 1,a,3000
HPWM 2,h,3000
PORTC=%00101000
Return

hafsag2:
HPWM 1,a,3000
HPWM 2,d,3000
PORTC=%00101000
Return

hafifsol:
HPWM 1,b,3000
HPWM 2,a,3000
PORTC=%00101000
Return

sol:
HPWM 1,c,3000
HPWM 2,a,3000
PORTC=%00101000
Return

tamsol:
HPWM 1,h,3000
HPWM 2,a,3000
PORTC=%00101000
Return

hafsol2:
HPWM 1,d,3000
HPWM 2,a,3000
PORTC=%00101000
Return

kesksag:
HPWM 1,a,3000
HPWM 2,t,3000
PORTC=%00110000
Return

kesksol:
HPWM 1,t,3000
HPWM 2,a,3000
PORTC=%01001000
Return

sag22:
HPWM 1,a,3000
HPWM 2,h,3000
PORTC=%00101000
Return

sol22:
HPWM 1,h,3000
HPWM 2,a,3000
PORTC=%00101000
Return

hafifsag2:
HPWM 1,a,3000
HPWM 2,d,3000
PORTC=%00101000
Return

hafifsol2:
HPWM 1,d,3000
HPWM 2,a,3000
PORTC=%00101000
Return

azciksag:
HPWM 1,a,3000
HPWM 2,b,3000
PORTC=%00101000
Return

azciksol:
HPWM 1,b,3000
HPWM 2,a,3000
PORTC=%00101000
Return

dur:
HPWM 1,h,3000
HPWM 2,h,3000
PORTC=%00000000
Return

doksan:
HPWM 1,a,3000
HPWM 2,t,3000
PORTC=%00001000
Return



EDIT:
başka hatalar vardı düzeltildi

Devre şuan bende değil ama 2-3 gün içinde deneyip sonuçları yazacağım yine... Yardımlarınız ve ilginiz için çok teşekkür ederim.

hamzahaluk

goto ve gosub arasındaki kullanım farkı nedir acaba?

ete

GOTO programı bir başka etikete yönlendirmek amacı ile kullanılır. Gittiği yerde başka bir yere gidiş yok ise program orada kalır.
GOSUB programı geçici olarak bir yere yönlendirmek için kullanılır. Geçici diyorum çünki gittiği yerde işi bitince RETURN komutu ile ayrıldığı yere geri dönmelidir program. Dönmez ise stack taşması meyadana gelir. Çünki program gosub komutunu görünce ayrıldığı adresi Stack denilen ara hafızaya koyar. Gittiği yerde return komutunu görünce stack dan koyduğu adresi geri alıp o adrese geri döner. Geri dönmeden bir başka Gosub görürse ikinci adreside stack'a atar. Bu olay tekrarlanırsa toplamda 5-6 tane olan stack hafızası dolar ve program nereye gideceğini bilemeyeceği için kilitlenir.
Bu nedenle Gosub kullanırken dikkat etmeniz gerekiyor. Gosub ile gidilen yerden tekrar Goto ile dönmeyin. Mutlaka Return ile dönün.
Üst üste Gosub ların adedi 3-4 taneyi geçmesin. Bu return görmeden tekrarlanacak gosubların adedidir. Arada Gosub ile gittin return ile döndün tekrar bir gosub verilmesinde sakınca yoktur. Ama Gosub BIR , sonra GOSUB IKI sonra GOSUB UC sonra GOSUB DORT dedinmi stack taşma noktasına gelir.

Ete

hamzahaluk

Hocam, o zaman yukarıdaki programda gusub kilitlenir??? Çünkü yaklaşık 20 etiket için gosub kullanılmış.

ete

Anlattıklarım boşa gitmiş bir şey anlamamışsın.
İç içe geçmiş Gosub lardan bahsediyorum.
İstersen programda 150 tane Gosub kullan. Ama iç içe geçmiş gosubların sayısı 5'i geçmesin demek istemiştim.
Mesela

BASLA
IF PORTB=%00001000 THEN GOSUB BIR
IF PORTB=%00010000 THEN GOSUB IKI
....
GOTO BASLA
BIR:
PORT A.1=0
GOSUB BIR_BIR  'işte bu iç içe geçmiş ikinci gosub oluyor
RETURN

IKI:
PORTA.0=1
GOSUB IKI_IKI 'Buda iç içe geçmiş ikinci gosub oluyor.
RETURN

BIR_BIR:
     PORTA.3=1
     GOSUB BIR_BIR_BIR  'buda iç içe geçmi üçüncü gosub oluyor
     RETURN
......


Umarım bu sefer anlamışsındır.

Ete

Powered by EzPortal