avatar_furkan41

Pbp ve 16f628a RB4 . biti

Başlatan furkan41, 09 Haziran 2017, 03:50:49

furkan41

Değerli meslektaşlarım hocalarım şimdi bir deneme kartı yaptık ve bu deneme kartını denemek icinde lcd sine yazı yazdırıcam fakat nekadar uğraştıysam bu kolay uygulamada birşey farkettim RB4 bitinde ne lojik 0 nede lojik1 seviyesi olmuyor öylece kalıyor open collectör gibi davranıyor ama ben 628a mikrodenetleyicisinde sadece A portunda open collectör var diye biliyorum yada confıg ayarlarından kaynaklı birşeyi yanlış mı yapıyorum anlamadım.
@ __config _XT_OSC & _PWRTE_ON & _WDT_ON & _CP_OFF
DEFINE LCD_DREG PORTB 'LCD data bacakları PortB de bağlı
DEFINE LCD_DBIT 0 'LCD data bacakları 4. bitten başlıyor
DEFINE LCD_EREG PORTB 'LCD Enable Bacağı PortB de bağlı
DEFINE LCD_EBIT 5 'LCD Enable Bacağı 3. bite bağlı
DEFINE LCD_RSREG PORTB 'LCD RS Bacağı PortB de bağlı
DEFINE LCD_RSBIT 4 'LCD RS bacağı 1. Bite bağlı
DEFINE LCD_BITS 4 'LCD 4 bit olarak bağlı
TRISB = %00000000
TRISA = 0
PORTB = 0
PORTA = 0
CMCON = 7
PAUSE 200

BASLA:
LCDOUT $fe,$1
LCDOUT $fe,$2, "FURKAN KELESOGLU"
LCDOUT $fe,$C0, "****BASARILI****"
PAUSE 3000
GOTO BASLA
END

furkan41

Aynı kodu PIC16F84A 'da deniyorum hiç bir sıkıntı yok ama 16F628A ' da bunu beceremedim.

İlyas KAYA

B4 ü lcd rs için kullanmissiniz zaten nasıl cikti alacaksınız ki. Lcd de RS e bagli olması gerekir.
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

furkan41

lcd rs pinine bağlıycam cıkış yapmıyayımda giriş mi yapayım galiba yorum olsun diye cevap yazdınız ?

İlyas KAYA

Haklısın. Rs pinini ve lcd data pinleri ni manuel olarak kontrol edecek kadar bilginiz var ise size başarılar
Yorum yazınca yorum sayım artıyor ya belki admin yapar o yüzden :)
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

furkan41

iLYAS KAYA bak acıklamalara değil kod satırına bir bak istiyorum ? dikkatlice sonra yaptığın yoruma

ete

Neden en ufak bir şeyi ters algılayıp gerilmeye başlıyorsunuz anlamış değilim. Ramazandan olsa gerek.
Ortada fol yok yumurta yok ama gerginlik var bu olmuyor arkadaşlar. Bir birimize daha fazla sabır göstermeliyiz.

Furkan LCD tanımlamaların yanına verdiğin açıklamalar ile uyuşmuyor. Bu nedenle sanki o bacağı ayrı kullanıyormuşun gibi bir algı oluşuyor. Ilyas'ın yorumuda buradan geliyor olsa gerek. Ya yanındakileri sileceksin yada doğru açıklama vereceksin böylece yanlış anlaşılmada olmaz herhalde.

PORTB.4 pini Open Collector değildir. Ama Senin LCD Initalize işlemin yanlış.
Açılışta vermiş olduğun PAUSE 200 gecikmesinden önce;
LCDOUT $FE,1  komut satırını vermen ve bundan sonra en azından 200 ms beklemen gerekir. Bu omut LCD yi aktif hale getirir registerlerini hafıza içinde uygun yerlere yerleştirip kullanıma hazır hale getirir.
Bu işlemi  Program içinde yaparsanki öyle yapmışsın. LCD açılmaya çalışırken sürekli yazma komutu gelir ve LCD ne yapacağını şaşırır.

Dediğimi yapıp yeniden dene.

Ete

furkan41

@ __config _XT_OSC & _PWRTE_ON & _WDT_ON & _CP_OFF
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 5
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 4
DEFINE LCD_BITS 4
LCDOUT $fe,1
pause 300
TRISB=%00000000
TRISA=%11111111
PORTB=0
PORTA=0
CMCON=7
pause 50

BASLA:
LCDOUT $FE,$2, "SDDFDSFGD"
LCDOUT $FE,$C0, "DGDFGDFGSD"
PAUSE 2000
GOTO BASLA
END

Ete hocam dediğiniz gibi yaptım fakat yine değişen birşey olmadı anlamadığım bunu sadece bu picte yaptı 84a da böyle bir hata ile karşılaşmadım

ete

O zaman pici değiştir muhtemelen bozuk B.4 pini. Çalışması gerekirdi.

Ete

furkan41

Ete hocam bu pic le alakalı değil isis sümülasyonunda böyle ve ben simülasyon sacmalıyordur diye hex kodunu yükleyip karta taktım cidden lcd de yazı cıkmıyor aynı kodu 84a ile deniyorum misler gibi yazıyor isistede sorun olmuyor

ete

O zaman dosyaları koy buraya bakalım. Görmediğimiz başka bir şey vardır.
Ete

furkan41


furkan41

Alıntı yapılan: İlyas KAYA - 09 Haziran 2017, 04:40:23
Haklısın. Rs pinini ve lcd data pinleri ni manuel olarak kontrol edecek kadar bilginiz var ise size başarılar
Yorum yazınca yorum sayım artıyor ya belki admin yapar o yüzden :)
Hocam özür dilerim kusuruma bakmayın iftara az birşey kala işte insanlık hali birde defalarca denedim olmayınca sinir oluştu aramızda kücük tartışma geçti saygısızlığım oldu özür dilerim kusura bakmayın yaptığım hatalar affola hata bende idi acıklamaları silmem gerekirdi tekrar özür diliyorum

ete

#13
Bir yandan programın hangi frekansta çalıştığı belli değil diğer yandan da sgorta ayarların eksik.
Ayrıca simulasyon dosyasındaki işlemci çalışma frekansı 1Mhz de kalmış Onuda 4 yap.

Mevcut sigorta ayarları satırını sil ve aşağıdaki iki satırı programa ilave et. Tekrar dene bakalım.
@ __config _BODEN_ON & _BOREN_ON & _CP_ON & _PWRTE_ON & _WDT_ON & _LVP_OFF & _MCLRE_ON & _XT_OSC

DEFINE OSC 4

Tavsiye olarak söylüyorum. LCD initalize satırı o koyduğun yerde değil aşağıdaki yerde olmalı. Fark eden bir şey olmaz ikiside çalışır muhtemelen ancak doğrusu benim verdiğim şekildedir.
DEFINE LCD_DREG	PORTB 
DEFINE LCD_DBIT 0
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 5
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 4
DEFINE LCD_BITS 4

TRISB=%00000000
TRISA=%11111111
PORTB=0
PORTA=0
CMCON = 7

LCDOUT $fe,1
pause 300
BASLA:


Servo motor konusundaki isteğinin cevabı aşağıdaki linkte mevcut zaten baktınmı acaba?

http://etepic.com/index.php/topic,63.0.html

Sana lazım olan pot ile servo kontrolü örneklerin incelersan anlarsın sanırım. İşin temelinde bir servonun ne sürede pals ile ne kadar hareket yaptığı yatar. Genelde 500us ile 2000 us lik peryotlar aralığında çalışırlar.
Bu durumda değişim miktarı 2000-500=1500 us dir. O halde bir potun tüm hareketine karşılık okuduğumuz 0-1023 ADC değerini 0-1500 us lik değere çevirmemiz gerekir. Bunun için formülü şöyle buluruz.
1500/1023 = 1,466275659824047 bu sayıyı 256 ile çarpıp */ parametresini kullanabiliriz.
Çarpım sonucu bulunan 375,366568914956  değerini 375,4 ve bunuda 10 ile çarpıp 3754 olarak sabit çarpanımız olarak bulmak mümkün olur. Bu durumda formül,
SURE=(Ham_ADC_Degeri */3754)/10   şeklini almış olur. Unutma ki */ ifadesi yanındaki sayıyı kenidisinden sonraki ile çarpıp 256 bölerek sonucu bulur. Servo 500-2000 aralığını kullanacağı için bu formül sonucu bulunan değere birde 500 eklememiz gerekir. Zira formül bize sadece 0-1500 aralığını hesaplayacaktır.
O halde formül SURE=(Ham_ADC_Degeri */3754)/10 +500 şekli ile son halini almış olur. Böylece potu çeviripp bıraktıımız nokta bize bir süre değeri verecek ve bu değeri motora verdğimiz zamanda motorumuz konum alacaktır.
Servo motorlar standrat 500-2000 us lik aralığı kullanır kimisi bu aralıkta 90 derecelik bir hareket yapar kimisi 180 derece hareket eder. Kimisi de farklı sürelerde çalışabilir. Bu nedenle öncelikle elinizdeki motorun data sheetini inceleyerek çalışma aralığını tespit edip ona uygun puls vermeniz gerekir.
Bir servo ya belirli bir puls değerini sürekli (20ms lik aralıklarla) vermeniz halinde motor yalnızca bir kere o konuma gelir ve puls süresi değişmedikçe konum değiştirmez. Değiştirse idi zaten düz dc motor olacaktı.
Bu arada genel kaide motora 50 hz lik frekans aralığında puls vermek gerekiyor. Bu her 20 ms de bir komut verilmesi anlamına geliyor. İkinci konu da motora puls verirken şayet Pulsout komutunu kullanacak isen bu komut ;
PULSOUT Pin,Period şeklinde parametre alır.  Pin puls'ın çıkacağı pin dir. Period ise süre dir ve 10'un katları şeklinde verilmelidir. 1000 ms lik bir puls çıkartmak için o parametre 100 olarak verilmelidir. Bunu dikkate alarak yukarıda verdiğm formülde sonucu en sonda 10'a bölmende yarar var. Böylece hesaplanan değeri Pulsout komutu ile kullanabilirsin.


Ete

furkan41

Saolun ete hocam calıştı fakat anlamadığım şey ise 16f84a da DEFINE OSC 4 diye bir komut girmeye gerek kalmadan calışıyor sadece confıg ayarlarında _XT_OSC demek yeterli kalıyor bütün pic lerde bunlar değişkenlik gösterebilirmi böyle

Powered by EzPortal