yakupcanözdem
Üye
- Katılım
- 26 Şub 2018
- Mesajlar
- 5
- Puanları
- 1
- Yaş
- 26
Sınav için sorumlu olduğum devreye eklemem gereken fan'ı ds1621 ile kontrol etmem gerek Sıcaklık 30 derece olduğu zaman fanın devreye girmesi gerek 25 derece ve altında da durması gerek. Aklımda şöyle birşey kurdum isis şemasında görüceksiniz zaten C2 pinini transistörün b bacağına bağladım C2 pinine 1 geldiği zaman fan çalışıcak 0 olduğunda durdurucak ama onun pic c kodunu yazmayı beceremedim yardımcı olursanız mutlu olurum işte şuanki pic c kodum bu;
PIC16F877 ile DS1621 Sıcaklık ve Termostat Entegresi Uygulaması
*******************************************************************/
#include <16f877.h> // Kullanılacak denetleyicinin başlık // dosyası tanıtılıyor.
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları
#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.
#define use_portb_lcd TRUE // Lcd B portuna bağlı
#include <lcd.c> // lcd.c dosyası programa ekleniyor
#use i2c(master,sda=pin_c1, scl=pin_c0, slow=100000) // I2C Fonksiyonu,SDA ve SCL pinleri ve iletişim hızı belirleniyor
//***************** DS1621 SICAKLIK OKUMA FONKSİYONU **************************
float ds1621_oku (void)
{
signed int8 th,tl;
float sicaklik;
i2c_start(); // i2c iletişimini başlat
i2c_write(0x90); // DS1621 entegresine adres ve R/W bit bilgisi gönderiliyor
// R/W biti yazma yapılacağı için "0"
i2c_write(0x22); // sıcaklık dönüşümünü durdur komutu gönderiliyor
i2c_stop(); // i2c iletişimini durdur
i2c_start(); // i2c iletişimini başlat
i2c_write(0x90); // DS1621 entegresine adres ve R/W bit bilgisi gönderiliyor
// yazma yapılacağından burada R/W biti "0"
i2c_write(0xee); // Sıcaklık dönüşümüne başla komutu gönderiliyor
i2c_stop(); // i2c iletişimini durdur
i2c_start(); // i2c iletişimini başlat
i2c_write(0x90); // DS1621 entegresine adres ve R/W bit bilgisi gönderiliyor
i2c_write(0xaa); // Sıcaklığı oku komutu gönderiliyor
i2c_start(); // i2c iletişimini başlat
i2c_write(0x91); // DS1621 entegresine adres ve R/W bit bilgisi gönderiliyor
// okuma yapılacağından burada R/W biti "1"
th=i2c_read(0); // sıcaklık değerinin yüksek 8 bitlik değerini oku ve "th" değişkenine kaydet
i2c_start(); // i2c iletişimini başlat
i2c_write(0x91); // DS1621 entegresine adres ve R/W bit bilgisi gönderiliyor
tl=i2c_read(0); // sıcaklık değerinin düşük 8 bitlik değerini oku ve "tl" değişkenine kaydet
i2c_stop(); // i2c iletişimini durdur
if (tl==0x80) // Eğer sıcaklık değeri buçuklu ise sıcaklığa 0.5 ekle
sicaklik=th+0.5;
else
sicaklik=th; // Eğer sıcaklık değeri buçuklu değilse aynen değişkene kaydet
delay_ms(11);
return(sicaklik); // Fonksiyon "sicaklik" değeri ile geri döner
}
//*************** DS1621 TH ve TL'ye VERİ YAZMA FONKSİYONU ****************************
void yaz_ds1621_th_tl (signed int th_h, signed int th_l, signed int tl_h, signed int tl_l)
{
if (th_l==0x05) // Eğer th_l sıcaklık değeri buçuklu ise
th_l=0x80; // TH'ın düşük değerlikli 8.bitinde bu belirtiliyor
if (tl_l==0x05) // Eğer tl_l sıcaklık değeri buçuklu ise
tl_l=0x80; // TL'nın düşük değerlikli 8.bitinde bu belirtiliyor
i2c_start(); // i2c iletişimi başlangıç ayarları
i2c_write(0x90); // DS1621 entegresine adres ve R/W bit bilgisi gönderiliyor
// yazma yapılacağından burada R/W biti "0"
i2c_write(0xa1); // TH'a erişme komutu gönderiliyor
i2c_write(th_h); // TH değerinin yüksek değerlikli byte'ı gönderiliyor
i2c_write(th_l); // TH değerinin düşük değerlikli byte'ı gönderiliyor
i2c_stop(); // i2c iletişimi sonlandırılıyor
delay_ms(11); // Belli bir süre bekleniyor
i2c_start(); // i2c iletişimini başlat
i2c_write(0x90); // DS1621 entegresine adres ve R/W bit bilgisi gönderiliyor
i2c_write(0xa2); // TL'ye erişme komutu gönderiliyor
i2c_write(tl_h); // TL değerinin yüksek değerlikli byte'ı gönderiliyor
i2c_write(tl_l); // TL değerinin düşük değerlikli byte'ı gönderiliyor
i2c_stop(); // i2c iletişimini durdur
delay_ms(11);
}
//******** DS1621 KONFİGÜRASYON KAYDEDİCİSİNE VERİ YAZMA FONKSİYONU ************
void yaz_ds1621_ayar (byte deger)
{
i2c_start(); // i2c iletişimini başlat
i2c_write(0x90); // DS1621 entegresine adres ve R/W bit bilgisi gönderiliyor
i2c_write(0xac); // Konfigürasyon kaydedicisine erişme komutu gönderiliyor
i2c_write(deger); // Konfigürasyon ayar bilgisi gönderiliyor
i2c_stop(); // i2c iletişimini durdur
delay_ms(11);
}
//************ DS1621 KONFİGÜRASYON KAYDEDİCİSİNİ OKUMA FONKSİYONU *************
byte oku_ds1621_ayar ()
{
byte con;
i2c_start(); // i2c iletişimini başlat
i2c_write(0x90); // DS1621 entegresine adres ve R/W bit bilgisi gönderiliyor
// yazma yapılacağından burada R/W biti "0"
i2c_write(0xac); // Konfigürasyon kaydedicisine erişme komutu gönderiliyor
i2c_start(); // i2c iletişimini başlat
i2c_write(0x91); // DS1621 entegresine adres ve R/W bit bilgisi gönderiliyor
// okuma yapılacağından burada R/W biti "1"
con=i2c_read(0); // Konfigürasyon kaydedicisi içeriği okunuyor
i2c_stop(); // i2c iletişimini durdur
return(con); // Fonksiyon "con" değişkeni değeri ile geri döner
}
char sonuc[17]; // Karakter tipinde dizi tanımlanıyor
byte ayar; // byte olarak değişken tanımlanıyor
//******************* ANA PROGRAM FONKSİYONU *******************
void main ()
{
setup_psp(PSP_DISABLED); // PSP birimi devre dışı
setup_spi(SPI_SS_DISABLED); // SPI birimi devre dışı
setup_timer_1(T1_DISABLED); // T1 zamanlayıcısı devre dışı
setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
setup_adc_ports(NO_ANALOGS); // ANALOG giriş yok
setup_adc(ADC_OFF); // ADC birimi devre dışı
setup_CCP1(CCP_OFF); // CCP1 birimi devre dışı
setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı
lcd_init(); // LCD başlangıç ayarları yapılıyor
delay_ms(5);
ayar=oku_ds1621_ayar(); // DS1621 konfigürasyon kaydedicisi içeriği okunuyor
bit_set(ayar,1); // Konfigürasyon kaydedicisinde POL biti "1" yapılıyor
// bu bit alarm anında çıkışın lojik-1 olması için
// "1" yapılıyor
bit_clear(ayar,0); // Konfigürasyon kaydedicisinde 1SHOT biti "0" yapılıyor
// sürekli sıcaklık okuması yapılsın diye
yaz_ds1621_ayar(ayar); // Yapılan değişiklikler konfigürasyon kaydedicisine aktarılıyor
yaz_ds1621_th_tl(30,0,25,0); // TH ve TL değerleri belirleniyor
while(1) // Sonsuz döngü
{
sprintf(sonuc,"\fSicaklik=%0.1fC",ds1621_oku());
printf(lcd_putc,"%s",sonuc);
delay_ms(500);
}
}
PIC16F877 ile DS1621 Sıcaklık ve Termostat Entegresi Uygulaması
*******************************************************************/
#include <16f877.h> // Kullanılacak denetleyicinin başlık // dosyası tanıtılıyor.
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları
#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.
#define use_portb_lcd TRUE // Lcd B portuna bağlı
#include <lcd.c> // lcd.c dosyası programa ekleniyor
#use i2c(master,sda=pin_c1, scl=pin_c0, slow=100000) // I2C Fonksiyonu,SDA ve SCL pinleri ve iletişim hızı belirleniyor
//***************** DS1621 SICAKLIK OKUMA FONKSİYONU **************************
float ds1621_oku (void)
{
signed int8 th,tl;
float sicaklik;
i2c_start(); // i2c iletişimini başlat
i2c_write(0x90); // DS1621 entegresine adres ve R/W bit bilgisi gönderiliyor
// R/W biti yazma yapılacağı için "0"
i2c_write(0x22); // sıcaklık dönüşümünü durdur komutu gönderiliyor
i2c_stop(); // i2c iletişimini durdur
i2c_start(); // i2c iletişimini başlat
i2c_write(0x90); // DS1621 entegresine adres ve R/W bit bilgisi gönderiliyor
// yazma yapılacağından burada R/W biti "0"
i2c_write(0xee); // Sıcaklık dönüşümüne başla komutu gönderiliyor
i2c_stop(); // i2c iletişimini durdur
i2c_start(); // i2c iletişimini başlat
i2c_write(0x90); // DS1621 entegresine adres ve R/W bit bilgisi gönderiliyor
i2c_write(0xaa); // Sıcaklığı oku komutu gönderiliyor
i2c_start(); // i2c iletişimini başlat
i2c_write(0x91); // DS1621 entegresine adres ve R/W bit bilgisi gönderiliyor
// okuma yapılacağından burada R/W biti "1"
th=i2c_read(0); // sıcaklık değerinin yüksek 8 bitlik değerini oku ve "th" değişkenine kaydet
i2c_start(); // i2c iletişimini başlat
i2c_write(0x91); // DS1621 entegresine adres ve R/W bit bilgisi gönderiliyor
tl=i2c_read(0); // sıcaklık değerinin düşük 8 bitlik değerini oku ve "tl" değişkenine kaydet
i2c_stop(); // i2c iletişimini durdur
if (tl==0x80) // Eğer sıcaklık değeri buçuklu ise sıcaklığa 0.5 ekle
sicaklik=th+0.5;
else
sicaklik=th; // Eğer sıcaklık değeri buçuklu değilse aynen değişkene kaydet
delay_ms(11);
return(sicaklik); // Fonksiyon "sicaklik" değeri ile geri döner
}
//*************** DS1621 TH ve TL'ye VERİ YAZMA FONKSİYONU ****************************
void yaz_ds1621_th_tl (signed int th_h, signed int th_l, signed int tl_h, signed int tl_l)
{
if (th_l==0x05) // Eğer th_l sıcaklık değeri buçuklu ise
th_l=0x80; // TH'ın düşük değerlikli 8.bitinde bu belirtiliyor
if (tl_l==0x05) // Eğer tl_l sıcaklık değeri buçuklu ise
tl_l=0x80; // TL'nın düşük değerlikli 8.bitinde bu belirtiliyor
i2c_start(); // i2c iletişimi başlangıç ayarları
i2c_write(0x90); // DS1621 entegresine adres ve R/W bit bilgisi gönderiliyor
// yazma yapılacağından burada R/W biti "0"
i2c_write(0xa1); // TH'a erişme komutu gönderiliyor
i2c_write(th_h); // TH değerinin yüksek değerlikli byte'ı gönderiliyor
i2c_write(th_l); // TH değerinin düşük değerlikli byte'ı gönderiliyor
i2c_stop(); // i2c iletişimi sonlandırılıyor
delay_ms(11); // Belli bir süre bekleniyor
i2c_start(); // i2c iletişimini başlat
i2c_write(0x90); // DS1621 entegresine adres ve R/W bit bilgisi gönderiliyor
i2c_write(0xa2); // TL'ye erişme komutu gönderiliyor
i2c_write(tl_h); // TL değerinin yüksek değerlikli byte'ı gönderiliyor
i2c_write(tl_l); // TL değerinin düşük değerlikli byte'ı gönderiliyor
i2c_stop(); // i2c iletişimini durdur
delay_ms(11);
}
//******** DS1621 KONFİGÜRASYON KAYDEDİCİSİNE VERİ YAZMA FONKSİYONU ************
void yaz_ds1621_ayar (byte deger)
{
i2c_start(); // i2c iletişimini başlat
i2c_write(0x90); // DS1621 entegresine adres ve R/W bit bilgisi gönderiliyor
i2c_write(0xac); // Konfigürasyon kaydedicisine erişme komutu gönderiliyor
i2c_write(deger); // Konfigürasyon ayar bilgisi gönderiliyor
i2c_stop(); // i2c iletişimini durdur
delay_ms(11);
}
//************ DS1621 KONFİGÜRASYON KAYDEDİCİSİNİ OKUMA FONKSİYONU *************
byte oku_ds1621_ayar ()
{
byte con;
i2c_start(); // i2c iletişimini başlat
i2c_write(0x90); // DS1621 entegresine adres ve R/W bit bilgisi gönderiliyor
// yazma yapılacağından burada R/W biti "0"
i2c_write(0xac); // Konfigürasyon kaydedicisine erişme komutu gönderiliyor
i2c_start(); // i2c iletişimini başlat
i2c_write(0x91); // DS1621 entegresine adres ve R/W bit bilgisi gönderiliyor
// okuma yapılacağından burada R/W biti "1"
con=i2c_read(0); // Konfigürasyon kaydedicisi içeriği okunuyor
i2c_stop(); // i2c iletişimini durdur
return(con); // Fonksiyon "con" değişkeni değeri ile geri döner
}
char sonuc[17]; // Karakter tipinde dizi tanımlanıyor
byte ayar; // byte olarak değişken tanımlanıyor
//******************* ANA PROGRAM FONKSİYONU *******************
void main ()
{
setup_psp(PSP_DISABLED); // PSP birimi devre dışı
setup_spi(SPI_SS_DISABLED); // SPI birimi devre dışı
setup_timer_1(T1_DISABLED); // T1 zamanlayıcısı devre dışı
setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
setup_adc_ports(NO_ANALOGS); // ANALOG giriş yok
setup_adc(ADC_OFF); // ADC birimi devre dışı
setup_CCP1(CCP_OFF); // CCP1 birimi devre dışı
setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı
lcd_init(); // LCD başlangıç ayarları yapılıyor
delay_ms(5);
ayar=oku_ds1621_ayar(); // DS1621 konfigürasyon kaydedicisi içeriği okunuyor
bit_set(ayar,1); // Konfigürasyon kaydedicisinde POL biti "1" yapılıyor
// bu bit alarm anında çıkışın lojik-1 olması için
// "1" yapılıyor
bit_clear(ayar,0); // Konfigürasyon kaydedicisinde 1SHOT biti "0" yapılıyor
// sürekli sıcaklık okuması yapılsın diye
yaz_ds1621_ayar(ayar); // Yapılan değişiklikler konfigürasyon kaydedicisine aktarılıyor
yaz_ds1621_th_tl(30,0,25,0); // TH ve TL değerleri belirleniyor
while(1) // Sonsuz döngü
{
sprintf(sonuc,"\fSicaklik=%0.1fC",ds1621_oku());
printf(lcd_putc,"%s",sonuc);
delay_ms(500);
}
}