Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

16f628 yerine 16f88 kullanmak

Başlatan dyonizos, 04 Nisan 2011, 20:06:01

dyonizos

merhabalar,
programlama işinde yeni olduğum için içinden bir türlü çıkamadım. yardımcı olabilir misiniz?
Ekteki şemada bulunan devreyi yaptım çalıştırdım ancak bana birde ADC girişi lazım olduğu için 628 yerine 88 kullanmam gerektiğini öğrendim. (877 elimde bulunsada ekrana bir türlü yazı yazdıramadığım için 88 i denemek istiyorum).
Bu devre ve kodlarda nasıl bir değişiklik yapmalıyım. Bu hali ile doğrudan 16f88 i kodlayarak çalıştırmayı denediğimde lcd nin üst satırında sadece kutucuklar çıkıyor. Yerine 628 takarsam tıkır tıkır çalışıyor.
Yardımlarınızı bekliyorum

teşekkürler şimdiden

kodlar

' PIC Defines
' -----------

@ DEVICE  INTRC_OSC_NOCLKOUT
' System Clock Options
@ DEVICE  WDT_ON
' Watchdog Timer
@ DEVICE  PWRT_ON
' Power-On Timer
@ DEVICE MCLR_OFF
' Master Clear Options (Internal)
@ DEVICE BOD_ON
' Brown-Out Detect
@ DEVICE LVP_OFF
' Low-Voltage Programming
@ DEVICE CPD_OFF
' Data Memory Code Protect
@ DEVICE  PROTECT_OFF
' Program Code Protection



' Define Hardware
' ---------------

'TRISA = %00000000
TRISB = %00000011
'
' Initialise Hardware
' -------------------
DEFINE OSC 4
CMCON=7




'---------------VAR's--------------------------------
ENG  VAR word
MEM1 VAR WORD
MEM1 = 0



     
     
           
           
'------------------Main program----------------------

       Pause 1000       ' Wait for LCD to start up


Splash:
                           
       LCDOut $FE, 1   'Clear screen
       

       'LCDOut $FE, $80, "     Heli   "             
       'LCDOut $FE, $C0, "  Tachometer" 
       
       LCDOut $FE, 1
       LCDOut $FE, $80, " Mike Freeman  "             
       LCDOut $FE, $C0, "  08-03-07    " 
       PAUSE 1000       ' Wait

       LCDOut $FE, 1   ' Clear screen
       PAUSE 100      ' Wait .2 second
       
Main:
       
       Count PORTB.2,1500,ENG   'Count disk RPM for 1.5 Seconds and store in ENG
       ENG = ENG * 20      'Convert to RPM 
       

       
       
       IF PORTB.0 = 1 THEN  'When Button is pressed, store RPM reading in MEM1
       MEM1 = ENG
       ENDIF
                       
       LCDOut $FE, $80, "RPM = ", DEC ENG DIG 3, DEC ENG DIG 2, DEC ENG DIG 1, DEC ENG DIG 0     
       LCDOUT $FE, $C0, "MEM = ", DEC MEM1 DIG 3, DEC MEM1 DIG 2, DEC MEM1 DIG 1, DEC MEM1 DIG 0
       LCDOUT $FE, 2

       
      GoTo Main 






END

dyonizos

Datasheet lerı okudum. Basic konusuna da yabancı degılım pic basicte sonucta basic e benziyor. Benim sorunum pic te basic kullanmak ve pin bağlantıları ile ilgili. Ayrıca biliyor olsam zaten sormazdım. Sanırım sizde bilmesine rağmen yardımcı olmayanlardansınız.
Bana "şu pinler farklı olduğu için bunlar değiştirilmeli ve kodlarda da şu satır eklenirse yada değiştirilirse olabilir" şeklinde yardımcı olabilecek kimse yokmu acaba?

Andromeda

88 ile bende sorun yaşamıştım
şu satırları ekleyin bakalım ne olacak..
OSCCON =%01110000   
OSCTUNE = 0x00

" Tanrı, iradesini hakim kılmak için yeryüzündeki iyi insanları kullanır, yeryüzündeki kötü insanlar ise kendi iradelerini hakim kılmak için Tanrı'yı kullanırlar." ..." Tanrı'dan mesaj gelmiyor, biz Tanrı'ya mesaj gönderiyoruz"

dyonizos

OSCTUNE = 0x00
bu satırda yazım hatası veriyor compile ederken. Bu arada MCS kullanıyorum.

subram

sihirli sözcük; ANSEL 16f88in içinde bulunan bir kaydedidicidir. ANSEL=0 yaptığında LCDye yazı yazdırabilirsin. Analog işlem için biraz daha araştırman lazım.
http://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz

dyonizos

Terkar merhabalar,
ANSEL=0 yapıncada calısmadı malesef,
bende kızdım hazır kod olayına sıfırdan tekrar yazdım :) sımdı calısıyor herbisey:)
yardımlarınız ıcın tekrar tesekkurler,
Ancak sımdıde soyle bır sorum olucak. AN0 dan aldıgım analog gırısı ekrana yazdırabılıyorum yani 0-255 arası 8 bit deger alabılıyorum potansıyometre ıle. Bunu kodlarla 0-100 arası gıbı gostermek ıstıyorum. yanı lcd de pot un ıkı ucu arasını 0-100 arası scale etmek ıstıyorum. 255 degerını 0,3921 gıbı bır carpanla yapmaya calıstım hata verdı. nasıl yapabılırım acaba?

ferit06

PicBasic te ondalık işlem/float işlem yok diye biliyorum o yüzden 0,323 gibi bir rakamla çarpma yapamazsınız. 100 ile çarpıp 255 e bölün. Yada float işlem yapabilceğiniz proton gibi bir basic derleyicisine geçin.

dyonizos

cevaplarınız ıcın cok tesekkurler.
baya bır asama kaydettım hem analog gırıslerımı hem butonlarımı calıstırabılıyorum.

ete

Alıntı YapTerkar merhabalar,
Ancak sımdıde soyle bır sorum olucak. AN0 dan aldıgım analog gırısı ekrana yazdırabılıyorum yani 0-255 arası 8 bit deger alabılıyorum potansıyometre ıle. Bunu kodlarla 0-100 arası gıbı gostermek ıstıyorum. yanı lcd de pot un ıkı ucu arasını 0-100 arası scale etmek ıstıyorum. 255 degerını 0,3921 gıbı bır carpanla yapmaya calıstım hata verdı. nasıl yapabılırım acaba?

BAsicte bu tür işlemleri yapmanında bir yolu var elbette. Ama ondan önce ADC çözünürlüğünü 10 bite çıkarmanda yarar var. Çıkartırsan potun tam skalası karşılığı 0-1023 arası bir değer elde edeceksin.
Önce istediğin işlemi 8 bit (0-255) arası nasılyaparsın onu izah edeyim. 0-255 demek sıfır dahil 256 değişik pot kademesi anlamına gelir.
O halde birim kademe başına düşen miktarı bulabilmek için maksimum değerin olan 100 değerini 256 ya böleriz. Zaten bölmüşsün ve 3,9....
değerini bulmuşsun. Çıkan değer 0,390625 dir. Bu sayıyı 256 ile çarparsan 32 bit işlem yapacak hale getirebiliriz.
Çarpan=0,390625 x 256 = 100
Şimdi aşağıdaki formülü kullanırsan istediğini elde etmiş olacaksın.
Sonuc=(ADC_okunan+1)*/100 
Burada */ ifadesi ADC den okunan ham değerin 100 ile çarpılıp 256 ya bölünmüş halini sana verecektir. (32 bitlik değerin ortada yer alan byte değerini verir) Dolayısıyla ADC değerini 0,390625 ile çarpmış olacaksın. Örnek yapalım hemen. Diyelimki ADc den 127 okudun.
Sonuc=(127+1) * 100/256 =50  bulunacaktır. Bu değer pot un orta noktasını gösterecektir.

Aynı işlemi 10 bit ADC okumada gerçekleştirir isek;
Çarpan= (100/1024 )*256 =25 bulunacaktır. O halde formülün   SOnuc=(ADC_Ham+1)*/25 şeklinde olacaktır.
Değişken tiplerine dikkat etmen gerek. Byte değişkeni ile bu hesaplamaları yapamazsın word tipinde seçsen iyi olur.

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

dyonizos

Alıntı yapılan: ete - 06 Nisan 2011, 09:31:19
Alıntı YapTerkar merhabalar,
Ancak sımdıde soyle bır sorum olucak. AN0 dan aldıgım analog gırısı ekrana yazdırabılıyorum yani 0-255 arası 8 bit deger alabılıyorum potansıyometre ıle. Bunu kodlarla 0-100 arası gıbı gostermek ıstıyorum. yanı lcd de pot un ıkı ucu arasını 0-100 arası scale etmek ıstıyorum. 255 degerını 0,3921 gıbı bır carpanla yapmaya calıstım hata verdı. nasıl yapabılırım acaba?

BAsicte bu tür işlemleri yapmanında bir yolu var elbette. Ama ondan önce ADC çözünürlüğünü 10 bite çıkarmanda yarar var. Çıkartırsan potun tam skalası karşılığı 0-1023 arası bir değer elde edeceksin.
Önce istediğin işlemi 8 bit (0-255) arası nasılyaparsın onu izah edeyim. 0-255 demek sıfır dahil 256 değişik pot kademesi anlamına gelir.
O halde birim kademe başına düşen miktarı bulabilmek için maksimum değerin olan 100 değerini 256 ya böleriz. Zaten bölmüşsün ve 3,9....
değerini bulmuşsun. Çıkan değer 0,390625 dir. Bu sayıyı 256 ile çarparsan 32 bit işlem yapacak hale getirebiliriz.
Çarpan=0,390625 x 256 = 100
Şimdi aşağıdaki formülü kullanırsan istediğini elde etmiş olacaksın.
Sonuc=(ADC_okunan+1)*/100 
Burada */ ifadesi ADC den okunan ham değerin 100 ile çarpılıp 256 ya bölünmüş halini sana verecektir. (32 bitlik değerin ortada yer alan byte değerini verir) Dolayısıyla ADC değerini 0,390625 ile çarpmış olacaksın. Örnek yapalım hemen. Diyelimki ADc den 127 okudun.
Sonuc=(127+1) * 100/256 =50  bulunacaktır. Bu değer pot un orta noktasını gösterecektir.

Aynı işlemi 10 bit ADC okumada gerçekleştirir isek;
Çarpan= (100/1024 )*256 =25 bulunacaktır. O halde formülün   SOnuc=(ADC_Ham+1)*/25 şeklinde olacaktır.
Değişken tiplerine dikkat etmen gerek. Byte değişkeni ile bu hesaplamaları yapamazsın word tipinde seçsen iyi olur.

Ete

çok tesekkurler hocam. bırde analog dıjıtal portlar ıle ılgılı bır sorum vardı vaktınız oldugunda onada bakabılırsenız cok sevınırım.
butona 2sn gıbı bır sure basılı tutuldugunda sayma ıslemını hızlandırmak baslıklı yerde sormustum.

tekrar tesekkurler.

ete

Sorunu cevapladım sanıyorum. Eksik bir şey kaldı ise yeniden sor istersen.

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