PIC Projemle ilgili Problem.Acil!

Başlatan R10!, 05 Aralık 2014, 19:29:20

R10!

arkadaşlar pic projem var.Acil bir şekilde teslim etmem lazım.Onla uğraşıyorum ama bazı döngüleri ayarlayamadım tam.Bana yardımcı olabilecek olan var mı acaba?
Projem 4 butonlu DC motor hız kontrolü sağlamak.(PWM ile)
1. buton motoru başlatıyor(burayı PWM50 ile motoru %50 çalıştırdım)
2. buton motoru hızlandırıyor.(ilk bastığında bu butona PWM75 ile %75e çıksın motor hızı sonra ikinci kere aynı butona bastığında PWM100 olarak çalışssın olarak yazdım kodu fakat burda ikinci kez bastığımda motor %100 olarak çalışmıyor hala %75 olarak çalışıyor.Döngüyü mü sağlayamadım anlayamadım)
3.buton motoru yavaşlatıyor(ilk bastığımda PWM25 ile %25e insin motor hızı dedim aynı butona tekrar basıldığında motor %10 hızda çalışsın istedim fakat yine ikinci kez bastığımda komut işlemedi ve %25 olarak çalışmaya devam etti.
4. buton ise stop butonu.

sıkıntı yaşadığım yerleri yazdım bana yardımcı olabilecek varsa sevinirim.
yazdığım kodu alta yazıyorum.İlginize Teşekkürler şimdiden.
LIST P=16F877A
INCLUDE "P16F877A.INC"
DARBE EQU h'20'
DARBE1 EQU h'21'
DARBE2 EQU h'22'
DARBE3 EQU h'23'
DARBE4 EQU h'24'
BEKLE EQU h'25'
BEKLE1 EQU h'26'
BEKLE2 EQU h'27'
BEKLE3 EQU h'28'
BEKLE4 EQU h'29'
SAYAC EQU h'30'
SAYAC1 EQU h'31'
SAYAC2 EQU h'32'
SAYAC3 EQU h'33'

CLRF PORTB
BSF STATUS,5
CLRF TRISB
MOVLW h'FF'
MOVWF TRISD
BCF STATUS,5

START
BTFSS PORTD,0
GOTO JUMP1
GOTO PWM50
JUMP1
BTFSS PORTD,1
GOTO JUMP2
GOTO PWM75
JUMP2
BTFSS PORTD,2
GOTO JUMP3
GOTO PWM25
JUMP3
BTFSS PORTD,3
GOTO START
CLRF PORTB
GOTO START

PWM50
MOVLW h'80'
MOVWF DARBE1
MOVLW h'80'
MOVWF BEKLE1
BSF PORTB,0
MOVF DARBE1,W
CALL DELAY
BCF PORTB,0
MOVF BEKLE1,W
CALL DELAY
GOTO SPEEDTEST

PWM75
MOVLW h'C0'
MOVWF DARBE2
MOVLW h'40'
MOVWF BEKLE2
BSF PORTB,0
MOVF DARBE2,W
CALL DELAY
BCF PORTB,0
MOVF BEKLE2,W
CALL DELAY
GOTO SPEEDTEST1

PWM25
MOVLW h'40'
MOVWF DARBE
MOVLW h'C0'
MOVWF BEKLE
BSF PORTB,0
MOVF DARBE,W
CALL DELAY
BCF PORTB,0
MOVF BEKLE,W
CALL DELAY
GOTO SPEEDTEST2

PWM10
MOVLW h'1A'
MOVWF DARBE3
MOVLW h'D6'
MOVWF BEKLE3
BSF PORTB,0
MOVF DARBE,W
CALL DELAY
BCF PORTB,0
MOVF BEKLE,W
CALL DELAY
GOTO SPEEDTEST2

PWM100
MOVLW h'FF'
MOVWF DARBE4
MOVLW h'00'
MOVWF BEKLE4
BSF PORTB,0
MOVF DARBE,W
CALL DELAY
BCF PORTB,0
MOVF BEKLE,W
CALL DELAY
GOTO SPEEDTEST1

SPEEDTEST
BTFSS PORTD,1
GOTO YAVASLAMA
GOTO PWM75
YAVASLAMA
BTFSS PORTD,2
GOTO DURMA
GOTO PWM25
DURMA
BTFSS PORTD,3
GOTO PWM50
CLRF PORTB
GOTO START

SPEEDTEST1
BTFSS PORTD,1
GOTO ATLA
GOTO PWM100
ATLA
BTFSS PORTD,0
GOTO YAVASLAMA1
GOTO PWM50
YAVASLAMA1
BTFSS PORTD,2
GOTO DURMA1
GOTO PWM25
DURMA1
BTFSS PORTD,3
GOTO PWM75
CLRF PORTB
GOTO START

SPEEDTEST2
BTFSS PORTD,2
GOTO ATLA1
GOTO PWM10
ATLA1
BTFSS PORTD,0
GOTO HIZLANMA
GOTO PWM50
HIZLANMA
BTFSS PORTD,1
GOTO DURMA2
GOTO PWM75
DURMA2
BTFSS PORTD,3
GOTO PWM25
CLRF PORTB
GOTO START

DELAY
MOVWF SAYAC
DONGU
DECFSZ SAYAC,F
GOTO DONGU
RETURN
END



Kabil ATICI

Bir butona birden fazla işlem yaptırmak istediğin zaman butona doğrudan atama yaptırmak yerine sayıcı kullan. Butona bastığında bir değişkeni artır veya istediğin sayıyı ata ve sonra ne iş yaptırmak istiyorsan değişkeni kontrol ettir ve değişkenin durumuna göre o işi yaptır.

örneğin; sayac diye bir değişkeni kullanırsın,
başlangıç değeri sıfır olsun
1. butona bastığında sayac=1 yaparsın,
2. butona bastığında
sayac 3 değil ise  sayac=2 yaparsın
sayac 2 ise sayac=3 yaparsın

3. butona bastığında
sayac 5 değil ise sayac=4 yaparsın
sayac 4 ise sayac=5 yaparsın.

sonra bu sayac değerlerine göre gerekli kontrolleri yaparsın.
ambar7

R10!

#2
Mantık olarak anladım sizi.İlginiz için teşekkür ederim.Sayac 3 değilse 2 yaparsanız derken ne demek istediğinizi anlayamadım ama?Birde bu sayacı ben yazdığım koda nasıl yerleştireceğim veya neresinde CALL diyip çağırmam gerekicek? Sayac böyle mi oluyor peki? Yanlışsam düzeltin lütfen yeni öğrenmeme verin.Teşekkürler tekrar.
SAYICI
MOVLW h'00'
MOVWF SAYAC,W
MOVF SAYAC,W
INCF SAYAC,F
CALL GECİKME



Kabil ATICI

#3
2. buton
%75 devri--> 2 ile tanımladım
%100 devri 'de -->3 ile.
Şimdi eğer o şekilde yapılmazsa, sen motorun %100 (sayac=3) devirde iken 2. butona basarsan o zaman  ne olur?

dongu
1. buton basıldı
sayac=1 yap.
goto devir

2. buton basıldı
sayac 2 ise
sayac=3 yap.
goto devir
sayac 3 değil ise
sayac=2 yap.
goto devir

3. buton basıldı
sayac 4 ise
sayac=5 yap
goto devir
sayac 5 değil ise
sayac=4 yap
goto devir

4. buton basıldı
sayac=0 yap
goto devir
goto dongu

;---------alt programlar---------------
devir
sayac 1 ise
...
goto dongu
sayac 2 ise
...
goto dongu
...devir ile alt işlemler
goto dongu


ister goto ile yap ister call ile. her devir işleminde işin ana döngüye dönmesini istersen böylece program biraz daha hızlanır.

MOVLW h'00'
MOVWF SAYAC,W  ;bu şekilde kullanırsan sana yeterde artar. sayaca direkt yükleme yapabilirsin.


Eşitlik karşılaştırmasında XOR ile yapıp status registerindeki Z kontrolu ile yapılıyor. Örnekleri vardır.
...
degişkenlerin atanması
...
ORG H'00' ; program başlangıç adresi
GOTO START
ORG H'04' ;kesme için kullanacaksan
GOTO KESME

START   ;
CLRF PORTB
BSF STATUS,5
CLRF TRISB
MOVLW h'FF'
MOVWF TRISD
BCF STATUS,5
MOVLW h'00'
MOVWF SAYAC,W
...
dongu
...
buton işlemleri
goto dongu

;-----alt programlar------


şeklinde programın başlangıç adresleri belirlemelisin.
ambar7

R10!

Anladığımı denedim yazdım bir kontrol edebilir misiniz? Anladığım şu 1. butona 1 kere basmam gerektiği için sayacın içini h'01' yapmam yeterli..  2. butona 2 kere basmam gerektiği için ise sayacı direk h'02' demiyorum h'03' diyorum iki kere basabilmem için sayacı iki arttırmış oluyorum? Doğru mu anlamışım?Sizi de yoruyorum kusra bakmayın pazartesiye sunmam gerekiyor projemi acelem o yüzden.İlginize minnettarım.
bu yazdığım kod artık çalışır hale gelmiş midir?

START
BTFSS PORTD,0
GOTO JUMP1
MOVLW h'01'
MOVWF SAYAC,W
GOTO PWM50

JUMP1
BTFSS PORTD,1
GOTO JUMP2
MOVLW h'03'
MOVWF SAYAC,W
GOTO PWM75

JUMP2
BTFSS PORTD,2
GOTO JUMP3
MOVLW h'05'
MOVWF SAYAC,W
GOTO PWM25

JUMP3
BTFSS PORTD,3
GOTO START
MOVLW h'00'
MOVWF SAYAC,W
CLRF PORTB
GOTO START

Kabil ATICI

#5
Bu şeklide önce başta belirttiğin
ilk basışta %75 ikinci basışta %100 olayını nasıl sağlayacaksın.

BTFSS PORTD,1      ;butona basıldı mı?
GOTO buton2

MOVF SAYAC,0                ;sayac değerini w registerine koy
XORLW 0X02		       ;sayac 2' mi
BTFSS STATUS,Z
GOTO ara1
MOVLW h'03'                ;sayac değerini 3 yap
MOVWF SAYAC,W
GOTO PWM100                      ;pwm100 hızlanma bölümüne

ara1                             ;buraya geldiğine göre SAYAC 2 değil,
MOVF SAYAC,0              ;sayac değerini w registerine koy
XORLW 0X03		    ;sayac 3 değil mi
BTFSC STATUS,Z
GOTO buton2                 ;buton kontrolu terk et
MOVLW h'02'                  ;sayac değerini 2 yap
MOVWF SAYAC,W
GOTO PWM75                 ;pwm75 hızlanma bölümüne
buton2
ambar7

R10!

ben MPLAB programı kullanıyorum hatayla karşılaştım ama neden olabilir?

MOVLW h'03'                ;sayac değerini 3 yap
MOVWF SAYAC,W ; Hocam burada sayac dan sonra virgül konmamasına ilişkin hata veriyor.

Kabil ATICI

ben senin koddan yazmıştım

MOVLW h'03'                ;sayac değerini 3 yap
MOVWF SAYAC

şöylesi yeterli olması gerek.
ambar7

R10!

#8
Hocam dediğiniz şekilde yaptım.Sadece hızlanma butonu için denedim yavaşlamayı denemedim ama yine aynı şekilde çalışıyor program.Proteus da denedim kodu PIC'e yükledim aynı problem devam ediyor.0 buton PWM50yi yürütüyor.
1. buton ilk başta PWM75'i yürütüyor.Ama 1. butona ikinci sefer bastığımda PWM100 olması gerekirken yine ikinci basışım işlemiyor motor PWM75 ile yürümeye devam ediyor.Kodu komple yine gönderiyorum eksiğim nerede tam olarak? (kesme alt programının nasıl yazıldığını bilmediğim için sizin verdiğiniz ORG H'04' GOTO KESME kısmını ilave etmedim koda bundan dolayı da olabilir mi problem?)

LIST P=16F877A
INCLUDE "P16F877A.INC"
DARBE EQU h'20'
DARBE1 EQU h'21'
DARBE2 EQU h'22'
DARBE3 EQU h'23'
DARBE4 EQU h'24'
BEKLE EQU h'25'
BEKLE1 EQU h'26'
BEKLE2 EQU h'27'
BEKLE3 EQU h'28'
BEKLE4 EQU h'29'
SAYAC EQU h'30'
SAYAC1 EQU h'31'
SAYAC2 EQU h'32'
SAYAC3 EQU h'33'
SAYAC45 EQU h'34'
ORG H'00' ; program başlangıç adresi
GOTO BASLA

BASLA  ;
CLRF PORTB
BSF STATUS,5
CLRF TRISB
MOVLW h'FF'
MOVWF TRISD
BCF STATUS,5
MOVLW h'00'
MOVWF SAYAC45

START
BTFSS PORTD,0
GOTO JUMP1
GOTO PWM50

JUMP1
BTFSS PORTD,1      ;butona basıldı mı?
GOTO JUMP2

MOVF SAYAC45,0                ;sayac değerini w registerine koy
XORLW 0X02		       ;sayac 2' mi
BTFSS STATUS,Z
GOTO ara1
MOVLW h'03'                ;sayac değerini 3 yap
MOVWF SAYAC45
GOTO PWM100                      ;pwm100 hızlanma bölümüne

ara1                             ;buraya geldiğine göre SAYAC 2 değil,
MOVF SAYAC45,0              ;sayac değerini w registerine koy
XORLW 0X03		    ;sayac 3 değil mi
BTFSC STATUS,Z
GOTO JUMP2                 ;buton kontrolu terk et
MOVLW h'02'                  ;sayac değerini 2 yap
MOVWF SAYAC45
GOTO PWM75                 ;pwm75 hızlanma bölümüne



JUMP2
BTFSS PORTD,2
GOTO JUMP3
GOTO PWM25

JUMP3
BTFSS PORTD,3
GOTO START
CLRF PORTB
GOTO START

PWM50
MOVLW h'80'
MOVWF DARBE1
MOVLW h'80'
MOVWF BEKLE1
BSF PORTB,0
MOVF DARBE1,W
CALL DELAY
BCF PORTB,0
MOVF BEKLE1,W
CALL DELAY
GOTO SPEEDTEST

PWM75
MOVLW h'C0'
MOVWF DARBE2
MOVLW h'40'
MOVWF BEKLE2
BSF PORTB,0
MOVF DARBE2,W
CALL DELAY
BCF PORTB,0
MOVF BEKLE2,W
CALL DELAY
GOTO SPEEDTEST1

PWM25
MOVLW h'40'
MOVWF DARBE
MOVLW h'C0'
MOVWF BEKLE
BSF PORTB,0
MOVF DARBE,W
CALL DELAY
BCF PORTB,0
MOVF BEKLE,W
CALL DELAY
GOTO SPEEDTEST2

PWM10
MOVLW h'1A'
MOVWF DARBE3
MOVLW h'D6'
MOVWF BEKLE3
BSF PORTB,0
MOVF DARBE,W
CALL DELAY
BCF PORTB,0
MOVF BEKLE,W
CALL DELAY
GOTO SPEEDTEST2


PWM100
MOVLW h'00'
MOVWF DARBE4
MOVLW h'FF'
MOVWF BEKLE4
BSF PORTB,0
MOVF DARBE,W
CALL DELAY
BCF PORTB,0
MOVF BEKLE,W
CALL DELAY
GOTO SPEEDTEST1


SPEEDTEST
BTFSS PORTD,1
GOTO YAVASLAMA
GOTO PWM75
YAVASLAMA
BTFSS PORTD,2
GOTO DURMA
GOTO PWM25
DURMA
BTFSS PORTD,3
GOTO PWM50
CLRF PORTB
GOTO START




SPEEDTEST1
BTFSS PORTD,1
GOTO ATLA
GOTO PWM100
ATLA
BTFSS PORTD,0
GOTO YAVASLAMA1
GOTO PWM50
YAVASLAMA1
BTFSS PORTD,2
GOTO DURMA1
GOTO PWM25
DURMA1
BTFSS PORTD,3
GOTO PWM75
CLRF PORTB
GOTO START

SPEEDTEST2
BTFSS PORTD,2
GOTO ATLA1
GOTO PWM10
ATLA1
BTFSS PORTD,0
GOTO HIZLANMA
GOTO PWM50
HIZLANMA
BTFSS PORTD,1
GOTO DURMA2
GOTO PWM75
DURMA2
BTFSS PORTD,3
GOTO PWM25
CLRF PORTB
GOTO START

DELAY
MOVWF SAYAC
DONGU
DECFSZ SAYAC,F
GOTO DONGU
RETURN

DELAY1
MOVLW h'FF'
MOVWF SAYAC1
LOOP1
MOVLW h'FF'
MOVWF SAYAC2
LOOP2
MOVLW SAYAC3
MOVWF h'04'
LOOP3
DECFSZ SAYAC3,F
GOTO LOOP3
DECFSZ SAYAC2,F
GOTO LOOP2
DECFSZ SAYAC1,F
GOTO LOOP1
RETURN
END


mesaj birleştirme:: 06 Aralık 2014, 15:08:08

isterseniz proteus devresinin dosyasını da atıyim hex dosyasıyla birlikte birde siz deneyin?

R10!

KESME nasıl olacak bilgi verebilir misiniz?