ADC0831 yerine ADC0832 kullanma

Başlatan elektronikhobi, 09 Şubat 2012, 00:24:30

elektronikhobi

Aslında PIC16F84 denetçi, LM35DZ sıcaklık sensörü ve ADC0831 kullanarak bir uygulama yapmak istiyorum ama ADC0831 bulamadım. Onun yerine ADC0832 aldım. Aslında ADC0831 alma şansım da var ama uzun bir süre geçecek.

Ayrıca okuduğum kitapta 4-5 uygulamada kullanılıyor.



Şimdi incelediğim kadarıyla tümleşik devrenin hangi bacağı açık tutacağını DI (veri giriş) ucu belirliyormuş.



Buna göre DI (veri giriş) ucuna 1 ve 0 gönderdiğimiz zaman CH0 ucu (+) analog giriş olarak belirliyormuşuz.

Gene anladığım kadarıyla VCC 5V'a, CH0 ucu analog giriş olduğu için sıcaklık sensörünün ucuna, CH1 ve GND toprak olacak şekilde devreyi kuruyoruz.

CS (yonga seç) biti normalde 1 miş. CS yonga seçim bitini 0 yaptığımız zaman verileri tümleşik devreye göndermeye başlıyormuşuz.

Algoritmayı da şöyle yazmayı düşündüm.

1)CS (yonga seçim) ucunu 0 yap
2) 1 saat pulsu gönder
3) DI (veri giriş) ucunu 1 yap
4) 1 saat pulsu gönder
5) DI (veri giriş) ucunu 0 yap
6) 1 saat pulsu gönder
7) veri oku
8) 1 saat pulsu gönder (7. ve 8. adımları 8 kere yap)
9) CS (yonga seçim) ucunu 1 yap

Buna göre benim veri okuma algoritmamda bir hata var mı acaba?

elektronikhobi

Kendi sorduğum soruya kendim cevap vereyim  :D

Tabi işin aslı bunu Yakın Doğu Üniversitesinden sayın Prof. Dr. Doğan İbrahim'e sordum. Aynen aktarıyorum. Buna göre ADC0832 kullanmak istersek algoritmamız şu şekilde olacak.

Sıcaklık sensörünün çıkışını CH0 ucuna bağla. Kanal 0'ı kullanacağız.

1) CS (yonga seçim) ucunu 0 yap
2) DI (veri giriş) ucunu 1 yap (Bu START bitidir)
3) 1 saat pulsu gönder (Burada puls 0'dan 1'e geçiştir)
4) 1 saat pulsu gönder( Burada puls 0'dan 1'e geçiştir)
5) D1 ucunu 0 yap
6) 1 saat pulsu gönder
7) 1 saat pulsu gönder (Burada puls 1'den 0'a geçiştir)
8 ) veri oku (MSB veri (yani bir bitin en yüksek değerli en soldaki 4 biti) saat pulsu 1'den 0'a geçince hazırdır)
9) 9 ve 10 arasında tam 8 tane puls gönder ve saat pulsu 1'den 0'a geçtiğinde veri oku.
(Toplam 11 tane puls gönderilecek)
10) CS (yonga seçim) ucunu 1 yap

elektronikhobi



Arkadaşlar bu devreyi kurdum. Ancak büyük ihtimal yazılımsal olarak bir hata yapıyorum. Ama hatayı bulamadım.

Kod şu şekilde:

#include <pic.h>
#include "secenek16f84.h"



#define DO RA0 // giriş
#define CLK RA1
#define CS RA2
#define DI RA3


/* sıcaklığı oku ve sayısala dönüştür */
unsigned char sicaklikOku()
{
    unsigned char sayisal = 0;

    CS = 0; // yonga seçim ucunu 0 yap
    DI = 1; // veri giriş ucunu 1 yap
    CLK = 0; // saat pulsu başlangıçta 0

    for (unsigned char i = 0; i < 3; ++i) {
        /* üç saat pulsu gönder */
        CLK = 1;
        if (i == 1) {
            DI = 0; // veri giriş ucunu 0 yap
        }
        CLK = 0;
    }

    for (unsigned char i = 0; i < 8; ++i) {

        /* 8 saat pulsu gönder */
        CLK = 1;
        CLK = 0;
        sayisal = sayisal << 1;
        sayisal = sayisal + DO;
    }
    CS = 1;
    return sayisal;

}

int main()
{
    const int katsayi = 5000 / 256;
    int miliVolt, santigrat;
    unsigned char sicaklik = 0;

    TRISB = 0; // port B çıkış
    TRISA = 1; // RA0 giriş, RA1, RA2 ve RA3 çıkış

    PORTB = 0; // ledleri söndür
    PORTA = 4; // yonga seçim ucu (CS = 1) yap


    for (;;) {

        sicaklik = sicaklikOku();
        miliVolt = sicaklik * katsayi;
        santigrat = miliVolt / 10;

        PORTB = santigrat;
        __delay_ms(250);
    }

}


Kodun tamamı:

https://github.com/erdemoncel/sicaklik/blob/master/adcevirici1.c
https://github.com/erdemoncel/sicaklik/blob/master/secenek16f84.h

Programı çalıştırdığım zaman bir kere sıcaklığı okuyor gösteriyor. Daha sonra tüm ledler sönüyor.

Büyük ihtimal sıcaklığı okuyan ve sayısal sinyale çeviren işlevde bir hata var. Ama hatayı bulamadım  ???

Yorumu olan var mı acaba ..