Picproje Elektronik Sitesi

DERLEYİCİLER => PICBasic => Konuyu başlatan: yolcu27 - 25 Mart 2016, 19:39:57

Başlık: buton hakkında
Gönderen: yolcu27 - 25 Mart 2016, 19:39:57
saygıdeğer forum üyeleri aşağıdaki verdiğim kodlarda her etikette 2 adet portb logic değerleri var. birisi çakar olması için bu şekilde. sorum şu olacak buradaki kodlarda butona basılması için beklenen süre 1 sn. yani bu 1.sn süre boyunca butona bassamda etki etmiyor.

şimdi size iki sorum olacak.

1- bu bekleme yerine etiketin herhangi bir satırı gerçekleşirken butona bassam etiketi değiştirmesi için nasıl bir ekleme yapmalıyım.

2- portb6 ye bağlı bir ledi hiçbir komuttan etkilenmeden sürekli bağımsız olarak çakar şeklinde yakabilir miyim
yani etiketlerin içerisindeki yanip sönmeler butona basmalar saniyeler falanlar filanlar hiçbir şey etkilemeyecek sadece yazmış olduğum 500ms bekle yan 500ms bekle sön şeklinde devam edecek enerji verip taki kesene kadar?



         
A:
  portb=%01100000     
   pause 500
   portb=%01000000
   pause 500
  A1:
portb=%01100001
pause 500

portb=%01000001
pause 500

if porta.0=1 Then bcd
if porta.2=1 then bce
goto a1


Başlık: Ynt: buton hakkında
Gönderen: dursuncemal - 25 Mart 2016, 19:50:13
interrupt kullanmalisin ayrica kurdugun interrupta a fonksiyonunun icinde yaptigin iside yaparsin.
Başlık: Ynt: buton hakkında
Gönderen: yolcu27 - 25 Mart 2016, 20:43:43
hocam tam istediğim şey aslında port6 ya bağlı led çaksın dursun etiketlerin içinde bunun için ekstra kod yazmayayım.bu şekilde buton süresini kısabiiliyorum. en azından 500ms bekleme koyuyorum yeterli oluyor.

amacım portb6 ya bağlı ledin bağımsız şekilde akım gelince cakmaya başlasın taki enerji kesilene kadar.

aynı zamanda ben portb ye bağlı diğer pinler ile farklı kombinasyonlarla diğer ledleri yakıyorum.

şuan kodları yazarken örnekteki gibi mesela portb1 portb2 portb3 yanıyor ve portb6 çakar şeklinde tekrarlıyor etiket içinde.

ben bu çakarı etiket ile değilde sürekli olarak başka şekilde yapmak istiyorum. kendimi anlatabilmişimdir umarım.
Başlık: Ynt: buton hakkında
Gönderen: dursuncemal - 25 Mart 2016, 20:58:30
ben seni analdim ama sen beni anladin mi onemli olan anladigim kadari ile su anda yeni yeni ogrenmaya basliyorsun. ama bu tip zamanlamalarda cok nadiren boyle uzun delaylar kullanilir.onun icin interrupt kullanmayi ogren bence.evt bbaktim uzun delaylar kullanarak yazmana ragmen cok ta iyi yazmisin.basic bilmedigim icin tarif olsun diye yazicam > if porta.0=1 Then portb=%01000001 dersen butona basili tutugun surece cakmasi lazim.
Başlık: Ynt: buton hakkında
Gönderen: yolcu27 - 25 Mart 2016, 21:20:17
if then komutlarını az çok öğrendim kullanmakta sıkıntı çekmiyorum.

dediğiniz gibi yeniyim daha bu bahsettiğiniz interputa bakayım bir.
Başlık: Ynt: buton hakkında
Gönderen: dursuncemal - 25 Mart 2016, 21:56:02
benim basic bilgim yok ama ustad cok guzel anlatmis sabirla takip edersen ogrenirsin.http://etepic.com/index.php?board=7.0 (http://etepic.com/index.php?board=7.0)
Başlık: Ynt: buton hakkında
Gönderen: yolcu27 - 25 Mart 2016, 23:14:45
çok amelece oldu ama yaptım 500ms lik aralara butonu koydum ve çakarın yanıp sönmesini etkilemedi.

yani ilk 500ms likten sonra koydugum if komutunda bir etikete git
ikinci 500ms likten sonra koyduğum if komutunda başka bir etikete git şeklinde kombinasyonlar yaptım.

aynı tuşa hangi aralıkta basılırsa ona göre etikete yöneliyor oradada aynı mantık ile kendimce bir döngü oluşturdum. ama güzel oldu.

şimdilik hallettik
Başlık: Ynt: buton hakkında
Gönderen: mehmet - 26 Mart 2016, 21:25:46
Neden "Stage State Machine" mantığını incelemiyorsunuz?

Düzeltme:
Yazım hatası...
Başlık: Ynt: buton hakkında
Gönderen: yolcu27 - 27 Mart 2016, 09:25:45
Alıntı yapılan: mehmet - 26 Mart 2016, 21:25:46
Neden "Stage Machine" mantığını incelemiyorsunuz?

Hocam biraz açar mısınız bir kac cümle ile bu mantığı.
Daha önce de yazdığım gibi çok acemiyim bu konuda. Kendi çapımsda gerçek olması gereken givi olmasa da geçici çözümler buluyorum böyle ama tam olarak istediğim gibi dd değil yani sadece şuan işlevini yapmakta. Hala o 500ms lik araya denk gelince buton tutukluk yapıyor.
Başlık: Ynt: buton hakkında
Gönderen: dursuncemal - 27 Mart 2016, 17:24:53
     "state machine" olsa gerek.
Başlık: Ynt: buton hakkında
Gönderen: yolcu27 - 27 Mart 2016, 22:10:04
birisi az bir örnek verse daha güzel olacak :)
Başlık: Ynt: buton hakkında
Gönderen: mehmet - 27 Mart 2016, 23:00:11
Alıntı yapılan: dursuncemal - 27 Mart 2016, 17:24:53
     "state machine" olsa gerek.

Haklısınız yanlış yazmışım. "State Machine" olacak...

Kısaca şöyle anlatılabilir;
bir timer belli bir sürede kesmeye ayarlanır. Kesme içerisinde
bir genel değişken artırılır. Ana döngüde bu değişken kontrol
edilir. İlgili değerlerde belli işler yaptırılır. Bir döngüde yapılan
işler bitince bu genel değişken sıfırlanır...
Başlık: Ynt: buton hakkında
Gönderen: dursuncemal - 28 Mart 2016, 01:48:59
timerin icindeki bir degiskeni ana dongu icinde kontrol etmek cok mantikli geimedi. zira ana dongumuzun kesmeden cok cok  uzun oldugu bir durumda  veri kacirma sansimiz yokmudur? yada ben mi yanlis anladim?
Başlık: Ynt: buton hakkında
Gönderen: bigbey - 28 Mart 2016, 10:28:38
Bir önerim var..
Timer0 kesmesi kullan tmr0 oluştuğunda diyelimki 50mSn geçmiş olsun interrupt rutininde bir değişkeni her timer interrupt'ında 1artırırsın değer 10 olunca 500mSn dolmuş olur. flaş yapan ledini konum değiştirirsin. diğer zamanlarda buton sor ne istersen yap. flaş ledi devamlı interrut'a bağlı olarak çalışır. sende diğer işlerini yaparsın.
Başlık: Ynt: buton hakkında
Gönderen: yolcu27 - 30 Mart 2016, 11:10:52
Kod olarak bir örnek varmı acaba. Cakar sürekli yansin sonsun . ben ise buton ile etiketler arası geçiş yapayım. Port önemli değil ornek kod gorsem kendi projeme uyarlamaya çalışırim.  Acemi olduğum için ornek kod olmadan açıkçası fazla birşey anlamiyorum . şimdiden anlayışınız için teşekkürler
Başlık: Ynt: buton hakkında
Gönderen: ete - 30 Mart 2016, 11:53:45
Çakarın sürekli kesme ile çaktırılması için örnek kod aşağıdadır. Sen ana döngü dediğimiz BASLA - GOTO basla aralığında kendi buton kontrolünü yapacaksın artık.


SYMBOL CAKAR=PORTX.x   '(X yerine POrt ismi mesela C,  x yerinede cakar ledi hangi pine bağlı ise onun bit numarası mesela 0)
SAYAC   VAR   BYTE
ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.
OPTION_REG=%10000101    'Pull up dirençleri İPTAL- Bölme oranı 1/64.
INTCON=%10100000  'Kesmeler aktif ve TMR0 kesmesi aktif
TMR0=21   'her 15 ms de bir kesme olacak
PAUSE 200

BASLA:
...
...
GOTO BASLA

DISABLE
KESME:
      SAYAC=SAYAC+1
      IF SAYAC=20  Then     '15*20=300 ms de bir çakar konum değiştirecek
         TOGGLE CAKAR
         SAYAC=0
      ENDIF
      TMR0=21
      INTCON.2=0        'TMR0 Kesme bayrağı sıfırlanıyor
      RESUME
      ENABLE
 
Ledlerin konum değiştirme süresi 300 ms olarak ayarlandı. Kesme her 15 ms de bir oluşuyor. Ona göre gerekirse artırır yada azaltırsın.

Ete

Başlık: Ynt: buton hakkında
Gönderen: yolcu27 - 30 Mart 2016, 12:45:55
Hocam çok teşekkür ederim akşam hemen güncelleme yapacağım. Bir sorum daha olacak . ben mesela etiketimde su şekilde bir komut kullanabilir miyim bu çakari etkiler mi .

Cakar ledim portb.7 ye bagli
Portb=%00000001


Burada port b0 A bağlı led yanacak
Bunun gibi 3 tane etiketim olacak portb ye bağlı ledlerinizin yanması için. Ama burada portb7 ye bağlı Cakar ledin pinine 0 yazıyorum bu çakari sondurmez mi.

Ben hem port b deki diğer portlara bağlı ledlerimi kontrol edeceğim ve portb7 deki cakarim da devam edecek. Kullandığım kod ile bu mantıklı gelmiyor bana yanlışım varsa düzeltin


mesaj birleştirme:: 30 Mart 2016, 14:32:04

Ben 500ms olarak ayarlamak için sayacı 33 ayarliyacagim 495ms yapıyor isimi görür.
Bu tmr0=21 yazınca 15ms de kesme oluşması neye gore hesaplanıyor sanırım kristal ile ilgili de olabilir bu.. Ben dahili osilator kullanacağım bunun için bir değişiklik yapmam gerekir mi bir ekleme filan yapmam
Başlık: Ynt: buton hakkında
Gönderen: yolcu27 - 30 Mart 2016, 22:06:23
@ DEVICE pic16F628A                      'işlemci 16F628                               
@ DEVICE pic16F628A, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_off            'MCLR pini kullanılMIYOR.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
cmcon=7
trisa=%00000111   ' a0. a1 a2 pinleri giriş butonlara bağlanacak
trisb=%00000000   '  b portu rölelere gidecek full çıkış
 
symbol cakar=portb.6
sayac var byte
on interrupt goto kesme
option_reg=%10000101
intcon=%10100000
tmr0=21
pause 200

'----------------------------------------------
basla:
portb=%10100000
if porta.1=1 then a
if porta.0=1 then bcd
if porta.2=1 then bce
goto basla

'-----------------------------------------------
a:
pause 1000
    a1:
    portb=%00100001
    if porta.0=1 then bcd
    if porta.2=1 then bce
    goto a1
   
'-------------------------------------------------

bcd:
pause 1000
    bcd1:
    portb=%00101110
    if porta.1=1 then a
    if porta.2=1 then bce
    goto bcd1
   
'--------------------------------------------------

bce:
pause 1000
    bce1:
    portb=%00110110
    if porta.1=1 then a
    if porta.0=1 then bcd
    goto bce1
   
'----------------------------------------------------

disable
kesme:
sayac=sayac+1
if sayac=33 then
toggle cakar
sayac=0
endif
tmr0=21
intcon.2=0
resume
enable

kodlarım bunlar portb.6 ya bağlı ledim çok sönük şelilde yanıp sönmekte ve butona bastığımda 1 saniye sönmektedir.

nerede hata acaba neyi yanlış anladım?
Başlık: Ynt: buton hakkında
Gönderen: dursuncemal - 31 Mart 2016, 01:27:12
burada zanedersem  pic16F628A, WDT_ON  ve dongulerinin icinde WDT sifirlamiyorsun senin programin surekli resete gidiyor kanimca. pic16F628A, WDT_OFF yapip denersen belki olur.
not:basic bilmedigim icin yanilabilirim.
Başlık: Ynt: buton hakkında
Gönderen: ete - 31 Mart 2016, 10:19:37
Bu programda hiç doğru yer yok. Bir port pinine "1" verisen o pinden HIGH çıkar. Aynı pine "0" verirsen LOW çıkar. Aynı pine bağlı ledi yakmak için pine "1" vermen gerekiyor. Veriyorsunda ama hemen arkasından "0" da veriyorsun led yanmakla yanmamak arasında gidip geliyor. Üstelik yanmasını görecek kadar süre tanımadığın için led üzerinde sadece biraz sönük yanma gibi bir efekt görüyorsun.

Bir porta değer verirken o port pinlerinden bazılarına önceden verdiğin değerlerin etkilenmemesini sağlaman gerekiyor.
Şimdi sesli düşünelim. PORTB.6 pinine kesme içinde değer veriyorsun. Diyelimki HIGH verdi Toggle komutu. Kesmeden çıkar çıkmaz program portb=%10100000 şeklindeki komutla karşılaşıyor ve PORTB.6 ya LOW veriyor. Led de tabii olarak sönüyor.
Peki ne yapmak lazım. Önce hangi pinde değişiklik yapacak isem sadece onu bırakıp diğer pinlerin kaydını almam gerek. Diyelimki portb=%10100000 komutu ile aslında PORTB.7 ye HIGH vermek istiyoruz. O halde önce portun 7 nolu pin haric kaydını almamız gerekiyor.
KAYIT=PORTB & %01111111  Burada PORTB pinlerini %01111111 ifadesi ile AND işlemine sokuyoruz. Böylece Pinlerden "1" olanlar 1 kalıyor, "0" olanlar ise sıfır olarak Kayıt isimli değişkene yerleşiyor.  Şimdi Kayıt ile %10000000 değerini OR işlemine sokarsak Kayıt değerinin 7 ci bitini 1 yapmış oluruz. O halde komutun tamamı, PORTB=(PORTB & %01111111) | (%10000000) aynı işi PORTB=PORTB & (%01111111)+128 şeklinde de yapabiliriz. Zira 128 binary olarak %10000000 dir.
O halde Hangi bite değer verecek isen o hariç diğerlerininkaydını alacak ve sonra o bite karşılık gelen decimal sayıyı aldığın kayda ekleyeceksin.

İkinci hata, Kesme kullanılan programlarda PAUSE kullanmaman gerekiyor. Zİra Basic kesme oluştuğunda işlediği komutu bitirmeden kesme etiketine gitmez. Pause 1000 dediğin zaman 1000 ms bekleyip sonra kesme etiketine gidecek ve böylece senin programında aksayacaktır.
Orada 1000 ms lik bir gecikme yaratmak istersen onu bir döngü ile halletmen ve döngüde kısa zaman dilimleri kullanman gerekiyor.
Örnek vereyim, 1000 ms için
FOR I=0 to 49999
  Pauseus 5
  pauseus 5
  pauseus 5
  pauseus 5
Next
şeklinde bir döngü kurarsan bu yaklaşık 1000 ms lik bir gecikme yaratır. Ama dikkat edersen en büyük gecikme 5us olduğu için program en fazla 5us içinde kesme etiketine gider. Böylece programın aksamaz. Aslında bu döngüde komut gecikmeside önemliölçüde etkili olur bu nedenle son satırda yer alan Pauseus 5 ifadesini çıkartabilirsin. Çıkartmış olduğun satır komut gecikmelerini karşılamış olacaktır.

O halde bir I (Word) değişkeni tanımlayacaksın. Sonra bir alt program oluşturacaksın. Adına BEKLE dersin. Oraya yukarıdaki döngüyü yazıp altına bir RETURN koyacaksın.
SOnra ana program içinde Pause 1000 gördüğün yere GOSUB BEKLE yazacaksın işin tamam olacak.

Bu iki önemli hatayı düzelt programda düzgün çalışmaya başlayacaktır
Şimdi fazla upraşmaman için yazdığın programa baktım;
- BASLA etiketininaltında PORTB.7 pinini aktif ediyorsun. Bunu yapmak için aşağıdaki kodu kullan.
  PORTB=(PORTB & %01111111)+128

- A1 etiketi altında ise PORTB.0 pini aktif ediliyor. AMa PORTB.7 de söndürülmüş oluyor. O halde aşağıdaki kodu kullanabiliriz.
  PORTB=(PORTB & &01111110)+1

- bcd1: etiketi altında ise B.1-B.2-B.3 pinleri 1 oluyor diğerleri sönmüş oluyor. O halde aşağıdaki kodu kullanabiliriz.
Portb=(PORTB & %01100000)+%00001110     
Böylece istediğimiz pinlerin değerlerini bozmadan (özellikle PORTB.6 ve PORTB.5 pinlerinin değerleri hep sabit kalıyor) istediğimiz pinleri yakıp söndürmüş olacağız.

Ete
Başlık: Ynt: buton hakkında
Gönderen: yolcu27 - 31 Mart 2016, 11:05:52


Hocam 3 defa okudum ince ince  bu şekilde bir sıkıntı oluşacağını fark etmiştim. Dediğiniz gibi yapacağım .

Portb5 ve portb6 lar sabit olması gerekiyor değer olarak evet çünkü biri sürekli yanacak biriside Cakar olacak kesme ile. Diğer port değerlerini hangisinin yanması gerekse ona göre duzeltirim.
uzun uzun anlatmışsınız hocam sanırım sizde öğretmensiniz bukadar açıklayıcı akıcı yazmak kolay değildir. İlgili düzeltmeleri yapıp sizi bilgilendiririm buradan. Yeniden teşekkürler
Başlık: Ynt: buton hakkında
Gönderen: ete - 31 Mart 2016, 11:18:53
Öğretmen değilim ama amatör öğreticiyim. Bilen insan bildiğini anlatırken çok defa karşısındaki de bazı şeyleri biliyor gibi düşünür. Bilerek yapılan bir şey değil bu içgüdüsel olarak yapılır ve dolayısıyla ayrıntıları atlar. Ben ise karşımdaki hiç bir şey bilmiyormuş gibi anlatırım. Uzun zaman içine bu alışkanlığı kazandım.

Ete

Başlık: Ynt: buton hakkında
Gönderen: yolcu27 - 31 Mart 2016, 21:30:18
hocam kodları şu şekilde güncelledim  portb.5 sabit olacak şekilde yanıyor portb.6 çakar olarak yanıyor.

butonlara bastıkça güzel bir şekilde 1sn yeye yakın bir zamanlamada ilişkili etikete yöneliyor.



a etiketinden  bcd etiketine geçerken o bekleme süresinde portb.0 a bağlı ledim yanmış şekilde bekliyor . süre geçince portb1 b2 b3 ledlerim yandığı anda sönüyordu.

benim istediğim o 1 saniye bekleme süresinde ledler yanmasın ve çakar devam etsin. bunuda bekle etiketine ilk 5 portu tek tek sıfıra çekerek yaptım.

birde kaç saniye kayıtta kalıyor acaba bu portb bilgileri enerji kesip verdiğimde  2 3 sn sonra yeniden. aynı kalan ledler devam ediyor

bir defa tüm ledlerin yandığını gördüm bu neden olmuş olabilir acaba?

birde ben burada 4mhz kristal kullanmak istersem kesmede ve bekle etiketinde değiştirmem yerler var mıdır?


kodlarda yanlış gördüğünüz bir yer var mı acaba ileride sıkıntı yaratabilecek?

@ DEVICE pic16F628A                      'işlemci 16F628                               
@ DEVICE pic16F628A, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_off            'MCLR pini kullanılMIYOR.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
cmcon=7
trisa=%00000111   ' a0. a1 a2 pinleri giriş butonlara bağlanacak
trisb=%00000000   '  b portu rölelere gidecek full çıkış
i var word 
symbol cakar=portb.6
sayac var byte
on interrupt goto kesme
option_reg=%10000101
intcon=%10100000
tmr0=21
pause 200

'----------------------------------------------
basla:
PORTB=(PORTB & %01011111)+%10100000
if porta.1=1 then a
if porta.0=1 then bcd
if porta.2=1 then bce
goto basla

'-----------------------------------------------
a:
gosub bekle
    a1:
      PORTB=(PORTB & %01100000)+%00000001
    if porta.0=1 then bcd
    if porta.2=1 then bce
    goto a1
   
'-------------------------------------------------

bcd:
gosub bekle
    bcd1:
   Portb=(PORTB & %01100000)+%00001110     
    if porta.1=1 then a
    if porta.2=1 then bce
    goto bcd1
   
'--------------------------------------------------

bce:
gosub bekle
    bce1:
    Portb=(PORTB & %01100000)+%00010110     
    if porta.1=1 then a
    if porta.0=1 then bcd
    goto bce1
   
'----------------------------------------------------


bekle:
portb.0=0
portb.1=0
portb.2=0
portb.3=0
portb.4=0

FOR i=0 to 4999
  Pauseus 5
  pauseus 5
  pauseus 5
  pauseus 5
 
Next
return
disable
kesme:
sayac=sayac+1
if sayac=33 then
toggle cakar
sayac=0
endif
tmr0=21
intcon.2=0
resume
enable

Başlık: Ynt: buton hakkında
Gönderen: yolcu27 - 01 Nisan 2016, 10:44:46
Devreyi aç kapa yaptığında portb0 1 2 3 4 e bağlı olan ledlerim belli bir kurala bağlı olmadan yanmış olarak açılıyor. Kapatıp 10sn filan bekleyince sorun yok .

Birde ilk açılışta portb7 ve portb5 açık 200ms sonra portb6 çalmaya başlamakta

Bunlar benim için çok büyük sorunlar değil ama aşmak isterim yinede
Başlık: Ynt: buton hakkında
Gönderen: ete - 01 Nisan 2016, 11:57:41
Basla satırından evvel yer alan PAUSE 200 gecikmesinden öncesine;
PORTB=0:PORTA=0 
şeklinde portları sıfırlayan bir satır ilave etmen gerekir. Çünki ilk açılışta portlar rastgele değer alır.
Bunu önlemek için portları sıfırlamak gerekir.

Yukarıdaki mesajında anlamadığım noktalar var.
"benim istediğim o 1 saniye bekleme süresinde ledler yanmasın " bu ne demek. Hangi ledler yanmasın hangisi sönmesin anlamadım.
Çakar ledi sürekli aktif zaten. PORTB.5 deki ledi de başlar başlamaz yakıyorsun. Bu durumda söylediğin anlamsız gibi oluyor bana göre.
A etiketinden bcd etiketine giderken, gecikme süresince  ilk 5 ledin her hangi birinin yanmasını istemiyor isen,
BCD etiketinin altına şu komutları ilave etmen gerekecek. Bundan önce TEMP isimli bir BYTE değişkeni daha tanımlaman uygun olacaktır.

BCD:
TEMP=PORTB                         'portB nin kopyasını aldık
PORTB=PORTB & %11100000  'ilk 5 biti sıfırladık
GOSUB BEKLE                        'beklemeye gittik
PORTB=TEMP                         'PORTB ye kopyalanan durumu yeniden geri verdik
BCD1:
..
..


Tüm ledlerin bir kereliğine neden yandığını bilemiyorum.
Sistem dahili OSC kullanarak zaten 4Mhz de çalışmaktadır. Dahili OSC yerine harici kristal takayım diyorsan yalnızca aşağıdaki değişiklik gerekir.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  yerine,
@ DEVICE pic16F628A, XT_OSC
Ayrıca her iki durumda da sigorta ayarlarından sonra,
DEFINE OSC 4
komut satırını ilave etmen doğru olur. İşlemcinin gecikme rutinlerini doğru ayarlayabilmesi için sistemin hangi frekansta çalıştığını bilmesi gerekir. Bu komut da o işi yapar.

Ete
Başlık: Ynt: buton hakkında
Gönderen: yolcu27 - 01 Nisan 2016, 12:54:30
Evet hocam o 1 sn bekleme suresi etiketler arasındaki geçişte ki sure. Ben bunu dediğim gibi yaptım o ilk 5 led o bekleme süresi içinde sönmesi için. Bekle etiketine o 5 ledin sönmesi için portlarini sıfıra çektim.
Açıkçası tek sorunum  arada enerji kesip verince  ledlerin rastgele yanmasiydi. Bunuda pause dan önce porta=0 portb=0 ile hallederiz artık.

Define osc 4 te kristal değerinin hangi hızla çalışacağını belirliyor sanırım
Şimdi aklıma şöyle bir şey daha geldi bu kesme ile doğru hesaplamalar sonucunda dijital bir saat yapılabilir sanırım lcd ye yazilacak sekilde. dışarıdan başka bir entegre filan gerektirmeden.
Başlık: Ynt: buton hakkında
Gönderen: dursuncemal - 01 Nisan 2016, 18:33:14
Alıntı yapılan: yolcu27 - 01 Nisan 2016, 12:54:30


Şimdi aklıma şöyle bir şey daha geldi bu kesme ile doğru hesaplamalar sonucunda dijital bir saat yapılabilir sanırım lcd ye yazilacak sekilde. dışarıdan başka bir entegre filan gerektirmeden.


evet yapabilirsin ama sadece yazdigin bir programa ozel zamanlamalar icin kullanabilirsin.gercek zamani gosterecek bir saat yapman cok zor.gercek zamani bir saat yapabilmen icin rtclerde kullanilan kristali kullanman gerekir.onlarda bile zaman kaymalari meydana gelir.
Başlık: Ynt: buton hakkında
Gönderen: yolcu27 - 05 Mayıs 2016, 00:23:45
Yeni konu açmak istemedim buradan devam edeyim sorularıma.

şimdi @ete hocamızın bahsettiği gibi port kaydı alarak çakar ledimi etkilemeden buton kontrolü ile gerekli olan etiketlere yönlendirmeyi yapabiliyorum.

benim şuan düşündüğüm ise etiketler içerisinde sabit bir şekilde ledleri yakmak değilde bir sıra ile yakmak. örnek vermek gerekirse


LEDLER
portb=%00000001
pause 500
if porta.1=1 then BASLA
if porta.2=1 then BASLA
if porta.3=1 then BASLA
portb=%00000011
pause 500
if porta.1=1 then BASLA
if porta.2=1 then BASLA
if porta.3=1 then BASLA
portb=%00000111
pause 500
if porta.1=1 then BASLA
if porta.2=1 then BASLA
if porta.3=1 then BASLA
portb=%00001111
portb=%00000001
pause 500
if porta.1=1 then BASLA
if porta.2=1 then BASLA
if porta.3=1 then BASLA
portb=%00000011
pause 500
if porta.1=1 then BASLA
if porta.2=1 then BASLA
if porta.3=1 then BASLA
portb=%00000111
pause 500
if porta.1=1 then BASLA
if porta.2=1 then BASLA
if porta.3=1 then BASLA
portb=%00001111

GOTO LEDLER


şeklinde ama bu ledlerin arasına yine buton kontrolü koymak istiyorum misal olarak 3 butonum var bunlardan birine basılınca BASLA etiketine gitmesi gerekiyor

bu kodu aralara koyarak şu şekilde yapınca bekleme süresinden dolayı gecikme oluyor.


Bu buton kontrolünü pause dan  önce kullanirsam bekleme ne durumda olur acaba



mesaj birleştirme:: 05 Mayıs 2016, 14:37:42

aklıma hep nedense amelece çözümler geliyor.

şimdi düşündümde pause 500 yazan yeri bölsem de şöyle yapsam 100 ms de bir baksa basılmış mı basılmamış mı diye olmaz mı sizce?  kod satırları çoook uzayacak ama bunun başka yöntemi nedir

pause 100
gosub oku
pause 100
gosub oku
pause 100
gosub oku
pause 100
gosub oku
pause 100
gosub oku

oku:
if porta.1=1 then BASLA
if porta.2=1 then BASLA
if porta.3=1 then BASLA
return
Başlık: Ynt: buton hakkında
Gönderen: ete - 05 Mayıs 2016, 15:58:33
Aşağıdaki satırları silip ,
pause 500
if porta.1=1 then BASLA
if porta.2=1 then BASLA
if porta.3=1 then BASLA

yerine,
GOSUB BEKLE
IF GIT=1 THEN BASLA
yaz.
BEKLE etiketi içine de şunları ekle
BEKLE:
GIT=0  'GIT BIT değişkeni
FOR W=0 to 500
  PAUSE 1
  IF (PORTA & %00001110)>0 THEN GIT=1
NEXT
RETURN

Gecikme uygulanırken butonlardan birisine basılırsa programın hemen BASLA etiketine gitmesini istersen THEN GIT=1 yerine;
...THEN
  GIT=1:RETURN
ENDIF
yazman gerekir.
Böylece epeyce kısalmış olur programın.

Ete
Başlık: Ynt: buton hakkında
Gönderen: yolcu27 - 05 Mayıs 2016, 17:00:39
Hocam şu şekilde kullanirsam sanırım son butona basılmışmi diye bakar değilmi diğer iki buton için kontrol geçmiş oluyor sanırım


if porta.1=1 then BASLA
if porta.2=1 then BASLA
if porta.3=1 then BASLA
pause 500
   


Pause dan önce koydum
Bu şekilde de sadece porta.3 e bakar degil mi en son satır var çünkü.

Şimdi programa biraz daha buton eklemek zorundayım.

Bu sefer a0 a1 ve a6 portlarindaki butona basınca BASLA etiketine.

a2 a3 ve a4 te de X Y Z etikletletine gitmesi gerekiyor.
Bende bu kontrollerin hepsini bir oku adlı etikete yazdım.
Dediğim gibi 100 ms de bir bu etikete gidip gelecek ve bakacak.  Bir deneyeyim. Eğer dediğim gibi olmazsa sizin dediğiniz yolu denerim .  fazla komuttan zarar gelir mi bilmiyorum ama 4 mhz yada 8mhz de dahili osilator ile 16f628 de çalışacak bunlar

Başlık: Ynt: buton hakkında
Gönderen: robomaster - 05 Mayıs 2016, 17:57:26
Alıntı yapılan: yolcu27 - 05 Mayıs 2016, 17:00:39
Pause dan önce koydum
Bu şekilde de sadece porta.3 e bakar değil mi en son satır var çünkü.

Hayır  pauseden önceki 3 satırda hızlıca bir çırpıda çalışır.  Buradaki çırpı kavramı PIC kristal hızı ile ilgilidir.
Hangi satır işletilirken istenilen şart gerçekleşiyor ise program o prosedure dallanacaktır. Burada her satırın
sonunda BASLA olduğuna göre nereye dallanılacağı belli. Eğer 3 satırdaki şart ta gerçekleşmezse (çok kısa sürede butona bastın bastın)
program pause satırında boş bir şekilde bekleyecek ve kendinden önceki satırlar umurunda olmayacaktır.
Bu konuyu aydınlatayım dedim.
Başlık: Ynt: buton hakkında
Gönderen: yolcu27 - 05 Mayıs 2016, 18:59:53
Alıntı yapılan: robomaster - 05 Mayıs 2016, 17:57:26
Hayır  pauseden önceki 3 satırda hızlıca bir çırpıda çalışır.  Buradaki çırpı kavramı PIC kristal hızı ile ilgilidir.
Hangi satır işletilirken istenilen şart gerçekleşiyor ise program o prosedure dallanacaktır. Burada her satırın
sonunda BASLA olduğuna göre nereye dallanılacağı belli. Eğer 3 satırdaki şart ta gerçekleşmezse (çok kısa sürede butona bastın bastın)
program pause satırında boş bir şekilde bekleyecek ve kendinden önceki satırlar umurunda olmayacaktır.
Bu konuyu aydınlatayım dedim.

banada öyle geldi:)

şu şekilde yazdım kodları sizce bir sıkıntısı varmıdır? 100ms içinde kontrol ettiği için butona bastığımı algılar diye düşünüyorum..



@ DEVICE pic16F628A                      'işlemci 16F628                               
@ DEVICE pic16F628A, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_off            'MCLR pini kullanılMIYOR.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
define osc 4

cmcon=7
trisa=%10111111   '  a6 çıkış geri kalan  pinler giriş butonlara bağlanacak
trisb=%00000000   '  b portu rölelere gidecek full çıkış

porta=0
portb=0

basla:

portb=0

if porta.4=1 then ikiyon
if porta.3=1 then sol
if porta.2=1 then sag

goto basla


ikiyon:

high porta.6
pause 1000
low porta.6

    ikiyon1:

portb=%00011000
pause 100
gosub oku1
pause 100
gosub oku1
pause 100
gosub oku1
portb=%00111100
pause 100
gosub oku1
pause 100
gosub oku1
pause 100
gosub oku1
portb=%01111110
pause 100
gosub oku1
pause 100
gosub oku1
pause 100
gosub oku1
portb=%11111111
pause 100
gosub oku1
pause 100
gosub oku1
pause 100
gosub oku1

goto ikiyon1

sol:
high porta.6
pause 1000
low porta.6
    sol1:

portb=%00010000
pause 100
gosub oku2
pause 100
gosub oku2
pause 100
gosub oku2
portb=%00110000
pause 100
gosub oku2
pause 100
gosub oku2
pause 100
gosub oku2
portb=%01110000
pause 100
gosub oku2
pause 100
gosub oku2
pause 100
gosub oku2
portb=%11110000
pause 100
gosub oku2
pause 100
gosub oku2
pause 100
gosub oku2


goto sol1


sag:
high porta.6
pause 1000
low porta.6
    sag1:

portb=%00001000
pause 100
gosub oku3
pause 100
gosub oku3
pause 100
gosub oku3
portb=%00001100
pause 100
gosub oku3
pause 100
gosub oku3
pause 100
gosub oku3
portb=%00001110
pause 100
gosub oku3
pause 100
gosub oku3
pause 100
gosub oku3
portb=%00001111
pause 100
gosub oku3
pause 100
gosub oku3
pause 100
gosub oku3

goto sag1

oku1:
if porta.3=1 then sol
if porta.2=1 then sag
if porta.0=1 then basla
if porta.1=1 then basla
if porta.7=1 then basla
return

oku2:
if porta.4=1 then ikiyon
if porta.2=1 then sag
if porta.0=1 then basla
if porta.1=1 then basla
if porta.7=1 then basla
return

oku3:
if porta.4=1 then ikiyon
if porta.3=1 then sol
if porta.0=1 then basla
if porta.1=1 then basla
if porta.7=1 then basla
return








bu kodlardaki 6 buton baska bir devreye de bağlı orada ilk 3 buton burada portları sıfırlarken diğer devrede başka etiketlere yönlendiriyor.
son 3 buton ise tam tersi işlemi diğer devredeki portb yi sıfırlıyor bu devrede portb den çıkış veriyor
Başlık: Ynt: buton hakkında
Gönderen: yolcu27 - 18 Mayıs 2016, 00:14:19
yine buton kontrolü hakkında aklıma takılan bir yer daha var yeni konu açmak istemedim buradan sorayım hemen

şimdi ben buton kontrolünü en son vermiş olduğum kodlarda 100 ms de bir bir etikete gidip butona bakarak gelerek yapıyprdum bekleme süreleri içerisinde.

programı kısaltmak istedim for next döngüsü içine pause 10  ile 100 kere tekrar etmesini sağladım. örnek kod parçasını aşağıda vereceğim.

merak ettiğim konu şu. ete hocanın verdiği örnekte pause 1 verilmiş ve 500 kere tekrar ile 500ms elde edilmiş.

ben 1 saniye için pause 10 verip 100 kere tekrar ettirdim.    pause 1 verip 1000 kere tekrar et dersem pic bunu yapabilecek midir? pic16f628a dahili osilatör kullanıyorum. kodum aşağıda ben bunu pause 1  verip 1000 kere dönmesini istiyorum yani olabilir mi sizce?

oku3:
for a=1 to 100
pause 10
if porta.4=1 then ikiyon
if porta.3=1 then sol
if porta.0=1 then basla
if porta.1=1 then basla
if porta.7=1 then basla
next
return

Başlık: Ynt: buton hakkında
Gönderen: ete - 18 Mayıs 2016, 11:08:23
Pic in ne yapıp yapamayacağını tartışmak çok anlamsız. Döngüyü 100 olarak kurup Pause 10 verirsen 10*100=1000 ms lik gecikme yaratırsın. Ama butonları her 10 ms de bir kontrol edebilirsin. Bu 10 ms lik buton kontrol gecikmesi demek olur.
Ama 100 yerine 1000 olarak döngüyü kurup (döngü değişkenin word cinsinden olmalı) pause değerini 1 olarak kullanırsan yine 1000 ms lik gecikme yaratır ama butonların kontrol aralığı 1 ms ye düşmüş olur. Bazen bu kadar fark bile çok önemli hale gelebilir.
Soruna direk cevap arıyor ise Pic bunu yapabilir merak etme.
Ete
Başlık: Ynt: buton hakkında
Gönderen: yolcu27 - 18 Mayıs 2016, 14:29:44
Alıntı yapılan: ete - 18 Mayıs 2016, 11:08:23
Pic in ne yapıp yapamayacağını tartışmak çok anlamsız. Döngüyü 100 olarak kurup Pause 10 verirsen 10*100=1000 ms lik gecikme yaratırsın. Ama butonları her 10 ms de bir kontrol edebilirsin. Bu 10 ms lik buton kontrol gecikmesi demek olur.
Ama 100 yerine 1000 olarak döngüyü kurup (döngü değişkenin word cinsinden olmalı) pause değerini 1 olarak kullanırsan yine 1000 ms lik gecikme yaratır ama butonların kontrol aralığı 1 ms ye düşmüş olur. Bazen bu kadar fark bile çok önemli hale gelebilir.
Soruna direk cevap arıyor ise Pic bunu yapabilir merak etme.
Ete

Tesekkurker hocam hep bu isi nasil yapabilirim diye dusunuyordum  gecikmeden etkilenmeyen buton için. Bu sayede deidiginiz gibi yaparak word değişkeni ile pause 1 e 1000 kere dönmesi için değiştirip butonun bekleme süresinden etkilenmesini sıfıra indirmis oluyoruz.

Pic bunu yapabiliyorsa sıkıntı yok artık. Yeniden teşekkürler