button ile led yakma ve osilatörler hakkında

Başlatan ewreka10, 01 Ağustos 2014, 00:13:52

ewreka10

Merhaba üstadlar, ben picbasicpro ya yeni başladım o yüzden hemen hemen hiçbirşey bilmiyorum neyse sorum şu;

pic16f877a kullandığım projemde düğmeye basinca led yanmasını planlıyorum kod şu;

@ __config _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF

D var byte              'D değişkenini byte tipinde tanımlar
TRISB=%00000000       'PortB çıkış oldu
TRISA=%00000010       'PortA nın birinci biti giriş
PORTB=0               'PortB deki ledleri söndür
D=0                   'button değişkenini sıfırla

buttonKontrol:
button PORTA.1, 0, 254, 254, D, 1, ledSevDeg

goto buttonKontrol      'buttonu tekrar kontrol et

ledSevDeg:
toggle PORTB.0          'PortB.0 ın seviyesini değiştir

goto buttonKontrol      'Buttonu tekrar kontrol et

end


isis şeması işe şu;



Arkadaşlar gerçekten çok uğraştım ama olmadı bu yüzden sizi rahatsız ediyorum.

Devre çalıştığında led çok hızlı bir biçimde yanıp sönüyor isis te tabi.

Birde osilatör tipleri nelerdir ve pbp da nasıl kullanılır?

Şimdiden herkeze çok teşekkür ederim.

polleme

RA1 ucunu buton ile direnç arasına bağlamalısınız. Bu şekilde pull-up olmaz.

ipek

portA1' direk 5 volta bağlamışsın.

A1'den 5 volta 10K direnç bağla,butanda A1'den gnd'ye olsun.
ayrıca şu an şeman RC OSC'ye ayarlı böyle olmasını istiyor isen sigorta ayarlarından ayarlaman gerek.OSC hızını vermemişsin,F877^'da comparator var iptal etmen gerekir.

bunları sigorta ayarlarının altına yaz.
DEFINE OSC 4
CMCON= 7

ewreka10

Sayın ipek ve polleme cevabınız için çok teşekkür ederim.

Fakat led hızlı bir şekilde yanıp sönüyor hala ,kod burara;
@ DEVICE pic16F877A
@ DEVICE pic16F877A, XT_OSC
@ DEVICE pic16F877A, WDT_OFF
@ DEVICE pic16F877A, PWRT_ON
@ DEVICE pic16F877A, CPD_OFF 
DEFINE OSC 4
CMCON= 7                                               
D var byte              'D değişkenini byte tipinde tanımlar
TRISB=%00000000       'PortB çıkış oldu
TRISA=%00000010       'PortA nın birinci biti giriş
PORTB=0               'PortB deki ledleri söndür
D=0                   'button değişkenini sıfırla

buttonKontrol:
button PORTA.1, 0, 254, 254, D, 1, ledSevDeg

goto buttonKontrol      'buttonu tekrar kontrol et

ledSevDeg:
toggle PORTB.0          'PortB.0 ın seviyesini değiştir

goto buttonKontrol      'Buttonu tekrar kontrol et

end


yeni isis şeması ise bu

mehmet

Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

bayelektronik

toggle portb.0 dan sonra bekleme komutu yerleştir ne kadar hızla yanıp sönmesini istiyorsan.pause komutuydu sanırsam picbasicte.fakat bu bekleme komutu bu seferde buton algılamanı etkileyecektir.daha değişik çözümlerde üretebilirsin öğrendikçe.

ewreka10

Cevabınız için çok teşekkürler bayelektronik ama planladığım şey olmadı butonun hiçbir etkisi yok sadece yanıpsönüyor.
butona basınca yakma işlem,ni nasıl yapabilirim teşekkürler.

Kabil ATICI

ambar7

ete

Buton bağlantısını düzeltmen gerekiyor. Bir butonun basılıp basılmadığını işlemcinin anlayabilmesi için butonun bağlı olduğu pinin konum değiştirmesi gerekir. Direk +5V ta bağlı olan bir pin kesinlikle LOW olamayacağı için konum değiştiremez. O halde yapılacak iş;
- Buton pini direk Butona bağlanacak
- Butonun diğer ucu GND ye bağlanacak.
- Buton pinine 10K direnç bağlanıp direncin diğer ucu +5V ta bağlanacak.
Bu bağlantı şekline göre butona basılmadığı sürece 10K lık direnç buton pinini direnç üzerinden HIGH da tutar. Butona basılınca butonun diğer ucuna bağlı GND nedeni ile buton pinine LOW uygulanmış olur. Böylece işlemcide konum değişikliğini hemen algılar.
Programa gelince, oldum olası basit bir buton kontrolü için çok komplike olan button komutunu sevmedim. Bu yüzden kesinlikle kullanmam. Basitçe buton kontrolü nasıl yapılır aşağıda görülebilir.
Söz ile açıklamak gerekir ise;
- Buton pini LOW olmuşmu (Yanı butona basılmışmı?)
- Basılmış ise PORTB.0 pinini TOGGLE yap.
- Butonun bırakılmasını bekle. Burada WHILE TUS=0:WEND komutu buton basılı olduğu müddetçe bu komut satırında programı döndürerek bekleme yapar.
- Buton bırakılmış ise buton titremesini (kısa bir an içinde birden fazla bas bırak yapma işlemi) önlemek için 50 ms lik bir gecikme uygula
- Sonra tekrar başa dön.
Programda bazı eksikler var idi. Mesela ADCO1=7 komutu . PortA pinleri öncelikle Komparatör olarak açılırlar. CMCON=7 komutu komparatörü iptal edince pinler bu sefer Analog olarak açılırlar. Analog özelliğini kapatmak için ADCON1=7 komutu verilerek pinler digital hale getirir.
Her programın BASLA satırından evvel en azından 200-500ms civarında bir bekletmesi olması gerekir. Bu registerlerin yerli yerine oturması için gereklidir. Koyulmasa ne olur. Şansınız varsa bir şey olmadan program çalışabilir ama abuk subuk çalışma ihtimalide vardır. O nedenle daima bir gecikme koyulması uygun olacaktır.

Ete

@ DEVICE pic16F877A
@ DEVICE pic16F877A, XT_OSC
@ DEVICE pic16F877A, WDT_OFF
@ DEVICE pic16F877A, PWRT_ON
@ DEVICE pic16F877A, CPD_OFF 
DEFINE OSC 4
CMCON= 7  
ADCON1=7    

TRISB=%00000000       'PortB çıkış oldu
TRISA=%00000010       'PortA nın birinci biti giriş
PORTB=0               'PortB deki ledleri söndür     
                                    
D var byte              'D değişkenini byte tipinde tanımlar
SYMBOL TUS=PORTA.1


D=0                   'button değişkenini sıfırla

PAUSE 200

BASLA:
       IF TUS=0 THEN
          TOGGLE PORTB.0
          WHILE TUS=0:WEND
          PAUSE 50
       ENDIF   

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

ewreka10

ete hocam Allah razı olsun sizden ben pic'e yeni başladım ve 'picbasic pro ile pic programlama' kitabından öğrenmeye çalışıyorum uzun zamandır da çalıştıramamıştım elinize sağlık.Size ne kadar teşekkür etsem az, diğer arkadaşlara da ilgilendikleri için çok teşekkür ederim.Selametle.