16f883 uygulaması

Başlatan kılıckaya, 09 Kasım 2012, 23:17:25

kılıckaya

Arkadaşlar,ekteki dosyada göreceğiniz üzere 16f883 mikrodenetleyicisi ile AN0 'dan giriş yaparak adval değeri oluşturmak ;ardından da adval değerine göre b7 veya b3 pinini lojik1 yapmak istiyorum.Kendim bununla ilgili birşeyler yazdım ama isis'te çalıştıramadım.Sizce PBP de yazmış olduğum bu dosyada hata nerededir?Neden çalışmıyor?Yardımlarınızı bekliyorum.Teşekkürler.

ete

Kusur-1: programınbaşına çalışma frekansını eklemen gerek  ................................................................Define OSC 4
Kusur-2: An0 pinini analog giriş olarak kullanmak için  ANSEL=1  komutunu vermen gerekirdi ...............ANSEL=1
Kusur-3: Hem    ADCON1.7=0     komutunu vermişsin hemde hemen altına
                         ADCON1  = %10000010 komutunu vermişsin. Bu alttaki yukardakini zaten iptal ediyor ama doğrusu yukardaki olduğu için bu satırı silmen gerekiyor. Zira 8 bit ADC okumada ADCON1.7=0 olmalıdır.
Kusur-4:  Bu işlemcide A portunda default açılan komparatör pinleri vardır. Bunların İptal edilmeleri gerekiyor. Bunun için
               CM1CON0.7=0 ve  CM2CON0.7=0 komut satırlarını programa ilave etmen gerekiyor.
Kusur-5: Program kısmında Okunan ADC değerine bağlı olarak 2 ile 35 arasında PortB pinlerinde işlem yapılıyor.
              Ancak Çıkışı HIGH yapılan pinlerin LOW yapılması bir şarta bağlanmamış. Diyelimki ADVAL=30 oldu ve PORTB.3=1 yapıldı. Sonra ADVAL 100 olursa PortB.3 HIGH da kalmış olacak ve LOW a dönemeyecek. Bunu önlemek amacı ile,
IF ADVAL<2 AND ADVAL>35 THEN PORTB=0 satırını programa eklersen daha iyi olacaktır. Yada başka bir mantığın var ise onu eklemende yarar var.

Ete

kılıckaya

Ete Hocam,çok teşekkür ederim.

kılıckaya

#3
Ete Hocam ,bir süre önce burada sizden 16f883 uygulaması hakkında yardım istemiştim,çok teşekkür ederim.Anlattıklarınızı uygulama fırsatını ancak buldum.Anlattıklarınızı yeni yazılımımda uyguladım.Yazılımı derledim ve Protuus'ta denedim.Sorunsuz çalışıyor gibi görünüyor.Ancak devrenin gerçeğini kurduğumda ve derlemiş olduğum hex kodlarını 16f883'e yüklediğimde gerçek devrede çalışmıyor.Acaba yazılımda dahili osilatör tanıtımında mı hata yaptım diyerek devreye harici 4 MHz lik kristal osilatör  bağladım ve yazılımda da deneme amaçlı harici kristal osilatör bulunduğunu belirttim ama sonuç aynı,devre çalışmıyor.Hatanın yazılımımdan mı yoksa devreden mi olduğunu anlayabilmem için devrede sadeve mikrodenetleyici,+5 Volt besleme için 7805 ve 100 nf kondansatör,10 KOhmluk da MCLR ucu için direnç kullandım.Sorunun nereden kaymaklandığı konusunda tekrar yardımınızı istiyorum.Proteus dosyası ve PBP dosyasını ekliyorum.Teşekkürler.

ete

Programda eksik olarak gördüğüm OSCCON registerine değer verilmemiş.
BU işlemcide Dahili osc frekansını bu register ayarlıyor.
OSCCON=%01100100
OSCTUNE=0
Satırlarını programa ilave et ve yeniden dene istersen.
Deneme yaparken de gerçek devrende , İşlemci besleme bacaklarına +5V geldiğinden emin ol.
Dahili OSC doğru seçildiğine göre ayrıca kristal vs. bağlaman gerekmez.
MCLR bacağı sigorta ayarlarından seçilmemiş. Bu nedenle oraya 1K lık bir direnç bağla ve direncin ucuna +5V ver.
Bunun dıiında başkada bir sorun görmüyorum. Bir kaç sigorta ayarını eksik vermişiz. İstersen tam ayarları aşağıda vereyim onları ilave et.
@ DEVICE PIC16F883
@ DEVICE PIC16F883 , WDT_OFF
@ DEVICE PIC16F883 , FCMEN_OFF
@ DEVICE PIC16F883 , IESO_OFF
@ DEVICE PIC16F883 , CPD_OFF
@ DEVICE PIC16F883 , MCLR_OFF
@ DEVICE PIC16F883 , PWRT_ON
@ DEVICE PIC16F883 , BOD_OFF
@ DEVICE PIC16F883 , PROTECT_ON
@ DEVICE PIC16F883 , LVP_OFF
@ DEVICE PIC16F883 , CPD_ON
@ DEVICE PIC16F883 , INTRC_OSC_NOCLKOUT

Ete



kılıckaya

Ete hocam,gerçek devrede mikrodenetleyicinin besleme bacağına +5 volt değil de +4,97 volt gerilim geliyor.Sanırım sonucu etkilemez. MCLR bacağına da 1 K değil de 10 K lık direnç bağlamıştım.Sonucu etkiler mi?Diğer belirttiğiniz OSCCON=%01100100
OSCTUNE=0 satırlarını ilave edip deneyeceğim ve sonucu sizinle paylaşacağım.Teşekkür ederim.

ete

4,97 sonucu değiştirmez normaldir.
Yeni sigorta ayarlarında MCLR yi iptal ettim zaten ama 10K direnç orada kalsın.

Ete

kılıckaya

#7
Ete Hocam,gerçek devrede denedim ama yine çalışmadı.PBP yazılımının son durumunu ekliyorum.Bir de belirtmiş olduğunuz "OSCCON=%01100100
OSCTUNE=0" satırlarında = işareti ile diğer yazılar arasında bir karakter boşluk olup olmaması önemli mi? Ben her iki durumda da denedim,çalışmadı.Size de zahmet veriyorum.Kusura bakmayın.Son durumu gösteren dosyayı ekliyorum.

ete

#8
Şu anda yapabileceğim bir şey yok maalesef. Hiç kullanmadığım bir işlemci. Belki vardır bir kritik ayar veya register.
Çalışmadı derken hiç hareket yok onu kastediyorsunuz değilmi. Kısaca ledlerde bir hareket olmuyor yani.
Butonlara basınca A0 pinine kaç volt veriliyor hiç olmazsa onları kontrol edin. İsis deki ile karşılaştırın.
Yapabiliyorsanız
ANSEL=0 verip örneğin
BASLA:
PORTB.0=1
pause 200
PORTB.0=0
Pause 200
Gotobasla
şeklinde bir program verin ve bakın bakalım çalışıyormu. Yani sorun analog giriştemi yoksa komple işlemci çalışmıyormu hiç olmazsa onu anlayabilirsek nerede sorun arayacağımızı biliriz.

Ete

kılıckaya

#9
Ete Hocam,kusura bakmazsanız biraz daha başınızı ağrıtacağım.Daha önce yazdıklarım hakkında belirttiklerinizi yeni yazılıma uyguladım ve son şeklini tekrar ekliyorum.Ancak yine ADC çevrimi ISIS'te çalıştığı halde gerçek devrede çalışmıyor.Gerçek devrede 
AN0 pinindeki gerilimi farklı değerlerde ölçerek isisteki değerler ile karşılaştırdım,değerler birbirini tutuyor ancak gerçek devrede bir sonuç alamıyorum. PBP yazılımımda bir de şurası dikkatimi çekiyor; "Define   ADC_CLOCK  1" dersem  devre İsi'te çalışıyor.Diğer değerlerde (2 ve 3 ) çalışmıyor.Bu durum normal midir?Bu Pic 20 MHz hızındadır. Hatta 16F883'ün dahili osilatörünün kullanılacağını belirttiğim halde çizime osilatör de ekledim.Fakat sonuç aynı.Bir önceki mesajınızda belirttiğiniz üzere buton kontrollü olarak ledi yakıp söndürdüm,gerçek devresini yaptım.Bu devre sorunsuz çalışıyor.Bu durumda sanırım sıkıntı yine sizin bir önceki mesajınızda belirttiğiniz üzereanalog girişte olmalı.Yardımcı olabilirseniz çok sevinirim.Teşekkürler.

ete

16F883 hiç kullanmadığım bir işlemci. Demekki register ayarlarında kritik bir şey var. Data sheet 'in detaylı incelenmesi gerekiyor.
Ete

kılıckaya

Ete Hocam,bu durum 16F883 'ün referans voltajından kaynaklanıyor olabilir mi?Örneğin 16F877 de referans voltajının nereden alınacağını belirleyerek VDD ve VSS den alabiliyorduk. 16F873 acaba referans voltajlarını VDD ve VSS den almıyor mu? Referans voltajı için farklı bir pine bağlantı mı yapmamız gerekiyor?Teşekkür ederim.

http://f1301.hizliresim.com/15/9/hsxp6.png

ete

Epeyce inceledim data sheeti. Bir ADC işlemi başlatmak için aşağıdakilerin yapılması gerekiyor.
Bu arada 16F883 kullanmadım ama 16F886 ve 16F887 kullandım ki 883 de aynı seriden işlemci imiş. Aynı data sheet'i kullanıyorlar.

- Öncelikle İlgili Analog pini Giriş olarak ayarlanmalı  TRISA=%00000001
- 10 bit okuma yapılacak ise ADCON1.7 biti 1 olacak değilse sıfır olacak ADCON1.7=0 (sen 8 bit okuma yapıyorsun)
- Ansel registerinde ilgili giriş pini analog olarak set edilmesi gerekiyor  ANSEL=%00000001
- ADCON0 registeri 7 ve 6 nolu bitleri kullanılan OSC tipine göre ayarlanmalı  ADCON0=%11000000

Buraya kadar Analog giriş okuma için gerekenler ayarlanmış oldu.
Sonra değişkenleri ayarla
LCD nin açılış gecikmesini ve komutunu ver.  LCDOUT $FE,1:pause 200
Başla satırından evvel yaklaşık 300 ms lik bir açılış gecikmesi ver.  PAUSE 300
SOnunda programa başla.

Programına bakınca bunları aşağı yukarı yapıldığını görüyorum.
Sigorta ayarlarında doğru. Bu durumda sistemin çalışması gerekir. İsis de çalıştığını belirtmişsin zaten.
Yaptığın sistemin bir dezavantajı var. ADC den okuduğun değeri görebileceğin bir LCD bağlı değil devrene.
Bu durumda okuyoprmusun okumuyormusun anlamak kolay değil.
İşini biraz olsun kolaylaştırmak için aşağıdaki kodu dene istersen. Programın BASLA satırına kadar olan kısmı aynen kalacak basla dan itibaren aşağıdakileri kullanacaksın.


BASLA:   
ADCIN 0, adval   ' AN0(RA0) PİNİNDEN GELEN ANALOG  DEĞER W İSMİMLİ DEGİŞKENE ATANIR.
PORTC=ADVAL
pause 100   

GOTO BASLA
END

Böylece ADC den okunan değerin karşılığını C portundan görme imkanın olacaktır. C portuna gerekirse bir kaç led bağlarsın (220 ohm seri direnç ile) ve olan biteni görürsün.

Bu işlemcide  16F877 de olduğu gibi bir seçim tablosu yoktur. O tablonun gördüğü işlevi ANSEL registeri görmektedir.
Bu registeri kullanarak istediğin kanalı ADC olarak atayabilme imkanın vardır. Referans voltajı seçimi ise ADCON1 registeri 4 ve 5 nolu bitleri ile yapılmaktadır. Bu bitler REF pininden girişlerinmi yoksa standart VDD ve VSS pinlerinin mi ref voltajı olarak kullanıalcağını belirler. Bu bitlerin sıfır olması demek ref voltajı olarak besleme değerlerinin kullanılacağını gösterir.

Bütün bunlara rağmen programın çalışmıyorsa kusuru devrende aramalısın.

Ete


kılıckaya

Ete Hocam,devrede sorun olup olmadığını kesinleştirmek için tam 3 adet devre yaptım ve mikrodenetleyici için soket kullandım.3 devrede 3 farklı 16F883 kullandım ama hiçbirinde çalışmadı.Ardından aynı yazılımı 16f876 ya uyarladım(16f876 ile 16F883'ün pin bağlantıları aynı).Yapmış olduğum devrede bu sefer 16f876 yı denedim,devre sorunsuz bir şekilde çalıştı.Artık 16f876 kullanmaktan başka seçenek kalmadı.Bugüne kadar bıkmadan sorularıma vermiş olduğunuz cevaplardan ve yardımlarınızdan dolayı çok teşekkür ederim.Bir de şunu sorabilir miyim; daha önce 16f886 kullandım demiştiniz.Bu projeniz ADC ile ilgili ise ve sizce bir sakıncası yoksa pbp kodlarını ve isis şemasını yükleyebilir misiniz?En azından inceler fikir sahibi olurum.Teşekkürler.

ete

Programın en baş kısmını vereyim. Ne yazıkki ADC uygulaması yok bu programda ama çalışmaması için bir sebep görmüyorum.
En kısa zamanda bir ADC uygulamasıda deneyeceğim.
ETE

@ DEVICE PIC16F886
@ DEVICE PIC16F886, WRT_OFF
@ DEVICE PIC16F886, BOR21V
@ DEVICE PIC16F886, LVP_OFF
@ DEVICE PIC16F886, FCMEN_ON
@ DEVICE PIC16F886, IESO_OFF
@ DEVICE PIC16F886, BOD_OFF
@ DEVICE PIC16F886, CPD_OFF
@ DEVICE PIC16F886, PROTECT_OFF
@ DEVICE PIC16F886, MCLR_OFF
@ DEVICE PIC16F886, PWRT_ON
@ DEVICE PIC16F886, WDT_ON 
@ DEVICE PIC16F886, INTRC_OSC_NOCLKOUT
DEFINE OSC 8
PORTA=0:TRISA=%00000011
PORTB=0:TRISB=%00001111
PORTC=0:TRISC=0
DEFINE LCD_DREG PORTC 'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT    4 'LCD data bacakları hangi bitten başlıyor?
DEFINE LCD_EREG PORTC 'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT    3 'LCD Enable Bacağı Hangi bite bağlı ?
DEFINE LCD_RSREG PORTC 'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT   2 'LCD RS bacağı Hangi Bite bağlı ?
DEFINE LCD_BITS    4 'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES   2 'LCD Kaç sıra yazabiliyor

OSCCON=%01111110 'dahili osc 8Mhz e ayarlandı
ANSEL= 0 'A portu analog pinler iptal
ANSELH=0  'B portu Analog pinler iptal
CM1CON0=0 'C1 Komparatör iptal
CM2CON0=0 'C2 Komparatör iptal
WPUB=0  'PORTB pullup lar kapalı
INTCON=%10011000  'PortB0 kesmesi ile PortB değişiklik kesmesi açıldı
IOCB=%00000100   'PORTB.2 den giren uca portB değişiklik kesmesi uyguladık.


Powered by EzPortal