16F887 Dört adet analog input'u aynı programda neden çalıştıramıyorum?

Başlatan Bedri, 11 Mayıs 2017, 08:51:28

Bedri

        Sayın Ustalarım,
Bir sensörden gelen analog akım sinyali okuyup MCP4725 dac kullanarak üç adet farklı çıkış olarak kullanmak istiyorum. Çıkışları da akım olarak alacağım için farklı empedanslarda olsalar dahi doğru akım değerini okuyabilmek için feedback almam gerektiğinde olaylar karışıyor. Adcon0,Ansel vb. registerler ile ne kadar yapmaya çalışsam da beceremedim. En son Kodda da gözüktüğü gibi analog okuma öncesi Adcon0'ı ayarlayıp denedim yinede sadece iki adet girişi okuyabildim. Sigorta ayarları ile ilgili pek deneyimim yok. Aynı şekilde register ayarlarıyla da yok. Genelde bunları Sizlerin örnek programlarınızdan kopyalayıp geri kalan kodu kendim yazarım. Eğer bir çözümü var ise bi destek verebilirseniz ne mutlu bana.
       Bu ilk aşamayı aşabilsem daha sonra devreye çok daha fazla eklemeler yapacağım; Fakat takıldım kaldım işte :)
Dosyayı ekledim ama yinede kodu yazayım: Şimdiden teşekkürler.
Device 16F887
OSCCON = %01110001
XTAL=8
Include "modedefs.bas"
OPTION_REG=7
INTCON=$88
TRISA=%00001111
TRISB=%00000000
ADCON0=%10000000     
ADCON1 = %10000000
ANSEL = %00001111   
ANSELH = %00000000
ADIN_RES 10         
ADIN_TAD FRC
ADIN_STIME 150   
Symbol SDA = PORTC.4
Symbol SCL = PORTC.3
Dim GIR As Word
Dim U1 As Word
Dim U2 As Word
Dim U3 As Word
Dim U11 As Word
Dim U22 As Word
Dim U33 As Word
Dim K As Word
PORTB=0
U11=0
U22=0
U33=0
PORTB.3=0
I2COUT SDA, SCL,$C0,[U11]
DelayMS 20
I2COUT SDA, SCL,$C4,[U22]
DelayMS 20         
I2COUT SDA,SCL,$C8,[U33]
DelayMS 20
BASLA:
ADCON0=%11001101
DelayMS 2
ADIn 3,GIR
K=GIR+1
ADCON0=%11000101
DelayMS 2
ADIn 1,U1
ADCON0=%11001001
DelayMS 2
ADIn 2,U2
ADCON0=%11000001
DelayMS 2
ADIn 0,U3
If U1<K Then U11=U11+1
If U1>K Then U11=U11-1
If U2<K Then U22=U22+1
If U2>K Then U22=U22-1
If U3<K Then U33=U33+1
If U3>K Then U33=U33-1
I2COUT SDA, SCL,$C0,[U11]
DelayMS 20
I2COUT SDA, SCL,$C4,[U22]
DelayMS 20         
I2COUT SDA,SCL,$C8,[U33]
DelayMS 20
GoTo BASLA

ete

Bazı eksikler var bazı lüzümsuz ilaveler var.
ADCON0 registerine şu şekilde değer verin. ADCON0=%11000001 
Bu işlemcide Komparatörler var. Muhtemelen diğer ADC girişleriniz bu nedenle çalışmıyor. Çünki komparatör default seçenektir ve ADC den önce gelir sıralamada. Programa şunları ilave edin.
CM1CON0=0 'C1 Komparatör iptal
CM2CON0=0 'C2 Komparatör iptal

Programda kesme kullanılmamş ama INTCON registerine gereksiz değer verilmiş.
INTCON=$88  komutunu silin.
OPTION_REG ile bir işiniz yok iken onada gereksiz değer vermişsiniz. Onuda silin.
ADIN_STIME 150 değeri , ADC örnekleme zamanını ayarlar ve 150us çok uzun bir değerdir. Data sheet FRC osilatör kullanınca bu değerin en düşük 4us olacağını söylemiş bunu 5 yapın bana kalırsa. Bu işlemcide normal örnekleme zaman 4,72us dir FRC haricindeki seçeneklerde (ki aslında Fosc/32 kullanılması daha doğru olurdu) bu süre 5us olarak kullanılmalıdır.
Programa mutlaka bir açılış gecikmesi verin. Değişken tanımlamalarından sonra DelayMS 300 gibi bir değer verin.

ADCON0=%11001101
DelayMS 2
ADIn 3,GIR
şeklinde bir ADC okuması yapmak da gereksiz bir iş. ADCO0 registeri kanal seçer ama ASM de program yazıyorsanız veya ADIN komutunu kullanmadan sırf registerle rile ADC okuması yapacaksanız ADCON0 ile kanal seçmeniz gerekir. Siz hem onunla kanal seçip hemde ADCIN komutunu kullanmışsınız.
Yukarıdaki 3 satır yerine yalnızca ADIn 3,GIR yazmanız yeterlidir. Diğer adc okumalarınıda bu şekilde düzeltin.

Bu dediklerimi yapıp tekrar deneyin bakalım.
Bu arada bu işlemci için programınıza uygun sigorta ayarları şöyle olmalı; Proton kullanmadığım için genel anlamda vereceğim siz uyarlarsınız.
CONFIG_1 değerleri
INTRC_OSC_NOCLKOUT
WDT_ON  (veya WDT_OFF)
PWRTE_OFF
MCLRE_OFF
CP_OFF
CPD_OFF
BOR_OFF
IESO_OFF
FCMEN_OFF
LVP_OFF
DEBUG_OFF

CONFIG2 değerleri;
WRT_OFF
BOR21V

Ete

Bedri

          Sayın ETE hocam,
     Öncelikle verdiğiniz hızlı yanıt için teşekkürler. Yazmış olduğunuz düzeltmeleri yaptım fakat maalesef sonuç alamadım. İyice uğraşmadan da tekrar sormak istemedim. Çeşitli varyasyonlar denedim ve debug ettiğimde ADCON0 registerinin kendi kafasına göre analog girişler seçtiğini gördüm. Benim istediğim : AN0,AN1,AN2,AN3 yerine AN0,AN2,AN4,AN6 yı aktive ediyordu. Sensin abi deyip te verdiği girişleri programa uyguladığımda bu sefer de AN0,AN4,AN8,AN12 yi aktif etmeye başladı. Yine değiştirdim ve sonunda üç kanaldan bilgi okumaya başladım. Hala sonuç istediğim gibi değil. Bu gün kodları basic'e dönüştürüp bir de oradan uğraşıcam.

Bedri


ete

Derleyicinin hatası olsa gerek. Çok iyi görünmüyor ne olup bittiyor. İsis hatasıda olabilir derleyici hatasıda olabilir. Sonuçta yazılım içinde yazılm çalışıyor.
PBP da denemek lazım. Onda bu tür abuk subuk işler olmuyor en azından.
Ete

Hattuşa

slm merak edip dosyayı indirdim. protonda derlemek istedim ama sanırım sizin derleyici çok eski herneyse siz declare ile tanımlamaları yaapmadığınızı gördüm ve düzelttim. yapılmak istenen ne olduğunu bilsek yani konuya hakim olsak bizde yardımcı olmaya çalışırdık

yapmaya çalıştığınız aşağıdaki gibi birşey mi?

ete

Komut kullanımıda Proton'a göre yanlış gibi geliyordu bana. Baktım Değişken=ADin 1  şeklinde kullanılması lazım gelirken PBP formatındaki gibi kullanılmış. Hatanın sebepleri bunlar olsa gerek. PRO_TR komutları doğru kullanmış bence denemeye değer.
Ete

Bedri

      Doğru söylüyorsun Ete ustam. Pro-TR'nin yüklediği düzenleme çalışıyor. Proton'u seyrek kullandığımdan bazı şeyler gözden kaçabiliyor.

       Yardımcı olan Ete ve Pro-Tr ustalarıma teşekkür ediyorum.
   Sayın pro-TR yapmak istediğim tam da bu idi. Programın tamamı biraz büyük olacağından çıkacak sorunlara karşı test etmem ve kod kod takip edebilmem gerekiyordu. En önemli olan bu ilk aşamada takılmış kalmıştım. Kendi yazdığım kodları basicte (PBP) düzenlediğimde  çalıştı fakat İsis'te debug yapamıyordum. Tekrar teşekkür ediyorum. Programın geri kalanı matematik zaten.
Saygılar.

Bedri

          Sayın pro-TR ustam,

    Senin göndermiş olduğun "bas" dosyasını test ettiğimde normal çalışıyor. Düzenleme yapmak için protonda açtığımda hiçbir şeye dokunmadan dahi derlesem çıkan "bas" dosyasını test ettiğimde yine analog kanallar okunmaz oluyor. İnat ettim ve sizin gönderdiğiniz ile değişiklik yapmadan benim protonumda derledikten sonra ortaya çıkan tüm dosyaları karşılaştırdım." Asm" dosyaları sizinki 26 kB benimki 6kB olduğunu keşfettim. Sonuç baya bi komik. Benim proton complier versiyonum sanırım taş devrinden kalmış. Ruslar sağolsun kazma kürekli 3.5.9.3'ü yükleyince her şey aydınlandı. Sorunlar çözüldü.
   
     Belki kimsenin işine yaramaz veya yarayabilir de ama devreyi ve kodu paylaşmak istedim. Henüz tamamı bitmiş değil fakat olayın özü bu. 1 adet 4-20mA sinyali okuyup üç farklı çıkıştan yük empedansları farklı da olsa çoklayacak projem.

     Bu programlama işinde usta birisi sayılmam, genelde lazım olanı sizlerin örnek gösterdiğiniz ve paylaştığınız kodlardan alıp kendime göre düzenlemek şeklinde yaparım. Bu projede de birçok arkadaşıma gerekecek, örnek olabilecek şeyler olabileceğini düşünüyorum.

     Çok yazdım ama MCP4725 DAC hakkında örnek kod bulana kadar afedersiniz göbeğim çatladı. Tekrardan Teşekkürler.

Hattuşa

rica ederim ustam, bizlerde genelde herhangi bir sensör alıp bunu işlemci ile kontrolünde sizin yaptığınız gibi hazır kod bulmaya çalışırız bulamazsak veya kritik bir işlemse datasheetinden yararlanırız. beceremezsek sıkıntı yok zira ETE hocam var genelde kendisi bu site üzerinden herkese yardımcı oluyor.ben aslen elektronikçi değilim. bu işi öğrenmek içinde yaşımız genç sayılmaz, açıkcası ETE hocam gibi bir IDO'muz olmasa çoktan bırakmıştık.Son 1 yıldır PC programlarını öğrenmeyi çok istiyorum sebebi herhangi bir sensör veya analog yapıdan aldığımız dataları PC ortamına taşıyıp windows veya android programlarında bu dataları işlemek, her ne kadar kod yazma mantığınıda biliyor olsakta yetersiz kalıyor. şimdilik PIC den PC ye dataları atabiliyoruz yada PC den PIC e dataları gönderebiliyoruz ama ötesi için hala bir tırmalama vaziyetlerine devam ediyoruz. ilerlemenin yavaş olmasını PC programlamada "ETE" hoca gibi birisinin olmayışına bağlıyorum. her ne kadar youtube veya forum sitelerinde bu işi öğretmeye çalışanlar olsada hep yüzeysel veya yarım kalmış. anlayacağınız PC de programlama için acilen "ETE" hocalara ihtiyacımız var.

sakin06

Merhaba Arkadaşlar, zaman buldukça değişik işlemcileri incelemeye çalışıyorum, bugün elime geçen mcp4725 ile uğraşma fırsatı buldum, ancak tek adres pini yüzünden tek veri hattına aynı anda iki adet bağlanacağını düşünüyorum, bilgi yapraklarında 3 bit adres olduğunu ama sadece A0 bitinin kontrolü kullanıcıya verilmiş diğer iki bit üretimde siparişe göre organize edildiği yazılmış, Sayın Bedri nin paylaştığı yazılımda 3 adet olarak görünüyor, öğrendiğim kadarıyla adres pinin boş bırakmak yada gnd ye çelmek aynı yani $c0 adresi kullanılarak erişiliyor, eğer pini + ya bağlarsak da $c2 olarak erişilebiliyor, yani ilk dör bit 1100 olarak device code sonraki 3 bit 000 veya 001 olabiliyor son bit ise 1 veya 0 oluyor bu durumda adres pini gnd ye bağlı ise (11000000) $C0 ile eğer adres pini + ya bağlanmış ise (11000010) $C2 ile erişebiliyoruz yada ben böyle erişebildim, 3 adet için nasıl bir yöntem uyguladınız atladığım nokta nedir çözemedim deneyimi olan arkadaşların fikrini almak isterim

selam ve sevgilerimle

ete

MCP4725 Data sheet'inde yazıldığına bakılırsa A2-A1 adres değerleri fabrikadan istek yapılarak ayarlanıyor yada istek yapılmadan ikiside %00 olarak verilerek malzeme piyasaya sunuluyor. Bu durumda kullanıcıya yalnızca A0 pini boşta bırakılarak verildiğine göre bu aletden en fazla 2 tanesini aynı anda kullanabilirsiniz.
A0=1 veya A0=0 yaparak bu ayırımı yapabiliyorsunuz. Yada Microchip'e özel sipariş verip A2-A1=%00 A1-A1=%10 ve A2-A1=%01 şeklinde ayarlanmış chipler alarak 8 farklı MCP4725'i adresleyip kullanabilirsiniz.
Piyasada bu aleti nasıl satıyorlar bilemiyorum. Belkide üzerinde adres bilgileri yazılı olarak alternatifli satılıyordur.
Yani alırken A2=1 veya A1=1 şeklinde alabiliyorsunuzdur. Bu durumda bu alternatifleri alıp ona göre kullanmak istediğiniz adedi ayarlamak da mümkündür.
Sonuçta fabrikadan %00 şeklinde çıkmış A2 ve A1 adres bitlerine sahip bir entegreye programla $C8 veya $C4 adres bilgisi verilemez. Ancak dediğim şekilde verilebilir.

Ete

Powered by EzPortal