Led Projesinde Takıldım.Yardım edebilir misiniz?

Başlatan ovaliiismail, 07 Mayıs 2017, 17:38:42

ovaliiismail

Arkadaşlar bir proje ile uğraşıyorum.Basit bir proje ama yapamadım.Proje şöyle:Butona bir kere basıldığında bir led yanacak,ardından butona bir kere daha basılırsa iki led yanacak.Kodlarını yazdım ama proteus da simüle ettiğimde iki lamba da sürekli yanıp sönüyor.Acaba hata nerede?Yardımcı olursanız sevinirim.
@ __config _CONFIG1, _INTRC_CLKOUT & _WDT_OFF & _LVP_OFF & _CP_OFF & _MCLR_OFF
TRISA=0 'PORTA ÇIKIŞ YAPILDI.'
TRISB=1 'PORTB GİRİŞ YAPILDI.'
PORTA=0 'PORTA SIFIRLANDI.'
PORTB=0 'PORTB SIFIRLANDI.'
SYMBOL LED1=PORTA.0 'PORTA.0 LED1 YAPILDI.'
SYMBOL LED2=PORTA.1 'PORTA.1 LED2 YAPILDI.'
SYMBOL BUTON=PORTB.0 'PORTB.0 BUTON YAPILDI.'
BUTONSAYAC VAR BYTE 'BUTONSAYAC DEĞİŞKENİ TANIMLANDI.'
BUTONSAYAC=0 'BUTONSAYACA 0 DEĞERİ ATANDI.'
PROGRAM: 'PROGRAM BAŞLATILDI.'
    IF BUTON=1 THEN 'EĞER BUTON 1 İSE.'
        BUTONSAYAC=BUTONSAYAC+1 'BUTONSAYACIN DEĞERİNİ 1 ARTTIR.'
    ENDIF
    IF BUTONSAYAC=1 THEN GOSUB ALTPROGRAM1 'EĞER BUTONSAYAC 1 İSE ALTPROGRAM1 YE GİT.'
GOTO PROGRAM 'PROGRAMA GİT.'
ALTPROGRAM1: 'ALTPROGRAM1 BAŞLATILDI.'
    LED1=1 'LED1 İ YAK.'
    IF BUTON=1 THEN 'EĞER BUTON 1 İSE.'
        BUTONSAYAC=BUTONSAYAC+1 'BUTONSAYACIN DEĞERİNİ 1 ARTTIR.'
    ENDIF
    IF BUTONSAYAC=2 THEN GOSUB ALTPROGRAM2 'EĞER BUTONSAYAC 1 İSE ALTPROGRAM2 YE GİT.'
GOTO ALTPROGRAM1 'ALTPROGRAM1 E GİT.'
ALTPROGRAM2: 'ALTPROGRAM2 BAŞLATILDI.'
    LED1=1 'LED1 İ YAK.'
    LED2=1 'LED2 İ YAK.'
GOTO ALTPROGRAM2 'ALTPROGRAM2 YE GİT.'

ete

Biraz sağ el ile dol kulağı tutmak gibi
Olmuş. Ama asıl sorun butonsayac için hiç bir sınırlama yapmamışsın.
Butonsaya=Butonsayac+1 dedikten sonra
If butonsayac=3 then butonsayac=0 vermelisin
Üstelik alıp başını gitmesin diye altına
While tus=1:wend
Pause 80
Satırlarını eklemen gerek.
Peki diyelimki ledleri yaktın kim söndürecek onları?
Ete

ovaliiismail

Hocam butonsayacı kaldırdım ve sadece if ve gosub ile yapmaya çalıştım.Ayrıca butona bir kez daha basıldığında ledlerin yanıp sönmesini ve butona bir daha basılırsa ledlerin ikisininde sönmesini ekledim.Ama devreyi çalıştırdığımda ve butona bastıgımda sadece led2 yanıp sönüyor.

@ __config _CONFIG1, _INTRC_CLKOUT & _WDT_OFF & _LVP_OFF & _CP_OFF & _MCLR_OFF
TRISA=0 'PORTA ÇIKIŞ YAPILDI.'
TRISB=1 'PORTB GİRİŞ YAPILDI.'
PORTA=0 'PORTA SIFIRLANDI.'
PORTB=0 'PORTB SIFIRLANDI.'
SYMBOL LED1=PORTA.0 'PORTA.0 LED1 YAPILDI.'
SYMBOL LED2=PORTA.1 'PORTA.1 LED2 YAPILDI.'
SYMBOL BUTON=PORTB.0 'PORTB.0 BUTON YAPILDI.'
PROGRAM: 'PROGRAM BAŞLATILDI.'
    IF BUTON=1 THEN GOSUB ALTPROGRAM1 'BUTON 1 İSE ALTPROGRAM1 E GİT.'
GOTO PROGRAM 'PROGRAMA GİT.'
ALTPROGRAM1: 'ALTPROGRAM1 BAŞLATILDI.'
    LED1=1 'LED1 İ YAK.'
    IF BUTON=1 THEN GOSUB ALTPROGRAM2 'BUTON 1 İSE ALTPROGRAM2 E GİT.'
GOTO ALTPROGRAM1 'ALTPROGRAM1 E GİT.'
ALTPROGRAM2: 'ALTPROGRAM2 BAŞLATILDI.'
    LED1=1 'LED1 İ YAK.'
    LED2=1 'LED2 İ YAK.'
    IF BUTON=1 THEN GOSUB ALTPROGRAM3 'BUTON 1 İSE ALTPROGRAM3 E GİT.'
GOTO ALTPROGRAM2 'ALTPROGRAM2 E GİT.'
ALTPROGRAM3: 'ALTPROGRAM3 BAŞLATILDI.'
    LED1=1'LED1 İ YAK.'
    LED2=1'LED2 İ YAK.'
    PAUSE 100 '100 MS BEKLE.'
    LED1=0'LED1 İ SÖNDÜR.'
    LED2=0 'LED2 İ SÖNDÜR.'
    PAUSE 100 '100 MS BEKLE.'
    IF BUTON=1 THEN GOSUB ALTPROGRAM4 'BUTON 1 İSE ALTPROGRAM4 E GİT.'
GOTO ALTPROGRAM3 'ALTPROGRAM3 E GİT.'
ALTPROGRAM4: 'ALTPROGRAM4 BAŞLATILDI.'
    LED1=0 'LED1 SÖNDÜR.'
    LED2=0 'LED2 SÖNDÜR.'
GOTO PROGRAM 'PROGRAMA GİT.'
END 'PROGRAM BİTTİ.'

ovaliiismail

Hocam while wend ile yapmaya çalıştım yine istediğimi elde edemedim hata nerede acaba?

TRISA=0 'PORTA ÇIKIŞ YAPILDI.'
TRISB=1 'PORTB GİRİŞ YAPILDI.'
PORTA=0 'PORTA SIFIRLANDI.'
PORTB=0 'PORTB SIFIRLANDI.'
SYMBOL LED1=PORTA.0 'PORTA.0 LED1 YAPILDI.'
SYMBOL LED2=PORTA.1 'PORTA.1 LED2 YAPILDI.'
SYMBOL BUTON=PORTB.0 'PORTB.0 BUTON YAPILDI.'
BUTONSAYAC VAR BYTE 'BUTONSAYAC DEĞİŞKENİ TANIMLANDI.'
BUTONSAYAC=0 'BUTONSAYACA 0 DEĞERİNİ ATA.'
PROGRAM: 'PROGRAM BAŞLATILDI.'
    IF BUTON=1 THEN 'EĞER BUTON 1 İSE.'
        BUTONSAYAC=BUTONSAYAC+1 'BUTON SAYACIN DEĞERİNİ 1 ARTTIR.'
    ENDIF 'IF BİTİRİLDİ.'
    WHILE BUTONSAYAC=1 'BUTONSAYAC 1 OLDUĞU SÜRECE.'
        LED1=1 'LED1 İ YAK.'
        PAUSE 500 '500MS BEKLE.'
        IF BUTON=1 THEN 'EĞER BUTON 1 İSE.'
            BUTONSAYAC=BUTONSAYAC+1 'BUTON SAYACIN DEĞERİNİ 1 ARTTIR.'
            LED1=0 'LED1 İ SÖNDÜR.'
        ENDIF 'IF BİTİRİLDİ.'
    WEND 'DÖNGÜ BİTİRİLDİ.'
    WHILE BUTONSAYAC=2 'BUTONSAYAC 2 OLDUĞU SÜRECE.'
        LED1=1 'LED1 İ YAK.'
        LED2=1 'LED2 İ YAK.'
        PAUSE 500 '500MS BEKLE.'
        IF BUTON=1 THEN 'EĞER BUTON 1 İSE.'
            BUTONSAYAC=BUTONSAYAC+1 'BUTON SAYACIN DEĞERİNİ 1 ARTTIR.'
            LED1=0 'LED1 İ SÖNDÜR.'
            LED2=0 'LED2 İ SÖNDÜR.'
        ENDIF 'IF BİTİRİLDİ.'
    WEND 'DÖNGÜ BİTİRİLDİ.'
    WHILE BUTONSAYAC=3 'BUTONSAYAC 3 OLDUĞU SÜRECE.'
        LED1=1 'LED1 İ YAK.'
        LED2=1 'LED2 İ YAK.'
        PAUSE 100 '100MS BEKLE.'
        LED1=0 'LED1 İ SÖNDÜR.'
        LED2=0 'LED2 İ SÖNDÜR.'
        PAUSE 100 '100MS BEKLE.'
        IF BUTON=1 THEN 'EĞER BUTON 1 İSE.'
            BUTONSAYAC=0 'BUTONSAYAC A 0 DEĞERİNİ ATA.'
            LED1=0 'LED1 İ SÖNDÜR.'
            LED2=0 'LED2 İ SÖNDÜR.'
        ENDIF 'IF BİTİRİLDİ.'
    WEND 'DÖNGÜ BİTİRİLDİ.'           
GOTO PROGRAM 'PROGRAMA GİT.'
END 'PROGRAM BİTİRİLDİ.'

ete

Basit bir iş için bu kadar uzun program yazmaya gerek yok.
aşağıdaki kodu dene bakalım.
TRISA=0 'PORTA ÇIKIŞ YAPILDI.'
TRISB=1 'PORTB GİRİŞ YAPILDI.'
PORTA=0 'PORTA SIFIRLANDI.'
PORTB=0 'PORTB SIFIRLANDI.'
SYMBOL LED1=PORTA.0 'PORTA.0 LED1 YAPILDI.'
SYMBOL LED2=PORTA.1 'PORTA.1 LED2 YAPILDI.'
SYMBOL BUTON=PORTB.0 'PORTB.0 BUTON YAPILDI.'
BUTONSAYAC VAR BYTE 'BUTONSAYAC DEĞİŞKENİ TANIMLANDI.'
BUTONSAYAC=0 'BUTONSAYACA 0 DEĞERİNİ ATA.'
PROGRAM: 'PROGRAM BAŞLATILDI.'
    IF BUTON=1 THEN 'EĞER BUTON 1 İSE.'
        BUTONSAYAC=BUTONSAYAC+1 'BUTON SAYACIN DEĞERİNİ 1 ARTTIR.'
        IF BUTONSAYAC=3 THEN BUTONSAYAC=0
        WHILE BUTON=1:WEND
         PAUSE 100
     ENDIF   'IF BİTİRİLDİ.'

     SELECT CASE BUTONSAYAC
   
     CASE 0
       LED1=0:LED2=0
     CASE 1
        LED1=1 'LED1 İ YAK.'
     CASE 2
         LED2=1
     END SELECT
     PAUSE 100
     GOTO PROGRAM
       
END 'PROGRAM BİTİRİLDİ.'

Bu programda butonsayac sıfır ise ledler sönük olacak , 1 ise led1 yanacak , 2 ise iki led birden yanacaktır.
Butona he basıp bırakmada butonsayac bir artırılacak sonunda 2 den 3 e geçtiğinde ledlerde sönecektir.
ete

ovaliiismail

@ __CONFIG  _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_IO
@ __CONFIG  _CONFIG2, _IESO_OFF & _FCMEN_OFF
define OSC 4
OSCCON=%01101100
CMCON=7
OPTION_REG.7=1
ANSEL=0
PORTA=0:TRISA=%00000000  'PORTA ÇIKIŞ YAPILDI.'
PORTB=0:TRISB=%00000001
                         'PORTB.0 GİRİŞ YAPILDI.'

SYMBOL LED1=PORTA.0 'PORTA.0 LED1 YAPILDI.'
SYMBOL LED2=PORTA.1 'PORTA.1 LED2 YAPILDI.'
SYMBOL BUTON=PORTB.0 'PORTB.0 BUTON YAPILDI.'
BUTONSAYAC VAR BYTE 'BUTONSAYAC DEĞİŞKENİ TANIMLANDI.'
BUTONSAYAC=0 'BUTONSAYACA 0 DEĞERİNİ ATA.'

PAUSE 200
PROGRAM: 'PROGRAM BAŞLATILDI.'
    IF BUTON=1 THEN 'EĞER BUTON 1 İSE.'
        BUTONSAYAC=BUTONSAYAC+1 'BUTON SAYACIN DEĞERİNİ 1 ARTTIR.'
        IF BUTONSAYAC=4 THEN BUTONSAYAC=0
'        WHILE BUTON=1:WEND
         PAUSE 100
     ENDIF   'IF BİTİRİLDİ.'

     SELECT CASE BUTONSAYAC
   
     CASE 0
       LED1=0:LED2=0
     CASE 1
        LED1=1 'LED1 İ YAK.'
     CASE 2
        LED1=1 'LED1 İ YAK.'
        LED2=1 'LED2 İ YAK.'
     CASE 3
        LED1=1 'LED1 İ YAK.'
        LED2=1 'LED2 İ YAK.'
        PAUSE 200 '200MS BEKLE.'
        LED1=0 'LED1 İ SÖNDÜR.'
        LED2=0 'LED2 İ SÖNDÜR.'
        PAUSE 200
     END SELECT
     PAUSE 100
     GOTO PROGRAM
       
END 'PROGRAM BİTİRİLDİ'


Hocam nasıl daha kısa yapılacağını anladım.Ama while niçin orada kullandık anlamadım.Bir de bu kodu deneyince case 2 ve case 3 de led1 yanmıyor sadece led2 yanıyor.

ete

Hangi işlemci bu?
Led1 mutlaka yanması gerek. Başka bir orun vardır.
Simulasyon devresini de koysaydın bakabilirdik.
While:Wend komutu orada tuşa bastıktan sonra tuşu bloke etmeye yarar. Tuşa basılı tuttuğun müddetçe program orada çakılı kalır. Böylece istenmeyen Butonsayac artımları engellenmiş olur. Yalnızca bir kere artış yapar her basışta.

A portunda mutlaka Komparatör vardır ve o engelliyordur Led in yanmasını.

Ete

ovaliiismail

Pic16F88 Hocam.Şimdi hemen başka bir modelle deneyip sonucu size ileteceğim.

ovaliiismail

#8
Pic16F628A ile denedim ve yandığı sonucunu aldım.Demekki sorun ilk baştan beri Pic16f88 deymiş.Peki hocam 16f88 de niye yanmadı?Ve komparatör ne hocam?

ete

PORTA hem Komparatör (Karşılaştırıcı) hemde analog pinlere sahip ki bu iki özellik default olarak açılır. Kullanmayacağın bu özellikleri iptal etmen gerekir.
Yukarıda en son verdiğin programı düzelterek yeniden kayıt ettim. Orada gerekli değişiklikleri yapıp eksikleride tamamladım.
Denersen çalıştığını göreceksin.

CMCON=7 komutu komparatörleri iptal eder.
ANSEL=0 komutu ise analog pinleri iptal eder ve böylece A Portu digital çalışmaya başlamış olur.
Bu işlemcide dahili osc de seçenekli olduğu için OSCCON registerine değer veren gerekirdi onuda verdim. Ayrıca Define OSC 4 komutu ile programın 4 Mhz lik dahili osc ile çalıştığını teyid etmiş oluyorsun.
Başlama dan önce açılış gecikmeside vermek gerekir. Yoksa işlemci içindeki register adresleri karışır. Onuda verdim.

Ete

ovaliiismail

Çok teşekkür ederim hocam.Allah razı olsun sizden.

Powered by EzPortal