arkadaşlar önce herkese mrbç demek istiyorum. pic proğlamada çok tecrübem yok ama meraklıyım.birbirimize tecrübelerimizden faydalandıralım inş. bilgi paylaştıkça artar. ben sitede olan örnekten 18b20.c dos. kullanarak lcd kullanarak16f628 A ile ve ds 1302 ve 18b20 ile saat sıcaklık devresi yapmak istedim fakat zaman da problem yok ama sıcaklıkta karşıma 240 gibi değer geldi boardda,proteusta ise sabit -0,5 yazıyor ve hiç değişmiyor. boardda sıc. artınca değerde artıyor. proğram kodlarım aşağıda şimdiden tşkler.
#include <16f628A.h>
#use delay (clock=4000000)
#include <benim_LCD.c>
#include <DS1302.c>
#include <ds18b20.c>
#byte saniye,dakika,saat,gun,ay,yil,haftanin_gunu;
float temperature;
void main ( )
{
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_CCP1(CCP_OFF); // CCP1 birimi devre dışı
lcd_hazirla(); // LCD başlangıç ayarları yaptırılıyor
rtc_init(); // DS1302 başlangıç ayarları yapılıyor
while(1)
{
temperature = ds1820_read();
rtc_get_time(saat,dakika,saniye);
rtc_get_date(gun,ay,yil,haftanin_gunu);
imlec(1,1);
printf(lcd_veri,"%02d/%02d/20%02d ",gun,ay,yil);
switch(haftanin_gunu)
{
case 1: printf(lcd_veri," PAZ"); break;
case 2: printf(lcd_veri," PZT"); break;
case 3: printf(lcd_veri," SAL"); break;
case 4: printf(lcd_veri," CRS"); break;
case 5: printf(lcd_veri," PER"); break;
case 6: printf(lcd_veri," CUM"); break;
case 7: printf(lcd_veri," CTS"); break;
}
imlec(2,1);
printf(lcd_veri,"%02d:%02d:%02d %3.1f C.",saat,dakika,saniye,temperature);
delay_ms(1000); // 1 sn gecikme veriliyor
}
}
LCD DOSYA KODUM ;
//benim_lcd.c dosyam
#define e pin_a3 // LCD'nin E ucu RB5 pinine bağlı
#define rs pin_a2 // LCD'nin RS ucu RB4 pinine bağlı
//****** LCD'ye Komut Gönderme Fonksiyonu **********
void lcd_komut(byte komut)
{
output_b(komut>>4); // Komutun yüksek değerli 4 bitini gönder
output_low(rs); // LCD komut almak için ayarlandı
output_high(e); // E ucu lojik-1'den lojik-0'a çekiliyor
output_low(e);
delay_ms(2); // 2 msn gecikme veriliyor
output_b(komut&0x0F); // Komutun düşük değerli 4 bitini gönder
output_low(rs); // LCD komut almak için ayarlandı
output_high(e); // E ucu lojik-1'den lojik-0'a çekiliyor
output_low(e);
delay_ms(2); // 2 msn gecikme veriliyor
}
//******* LCD'ye Veri Gönderme Fonksiyonu **********
void lcd_veri(byte veri)
{
output_b(veri>>4); // Verinin yüksek değerli 4 bitini gönder
output_high(rs); // LCD veri almak için ayarlandı
output_high(e); // E ucu lojik-1'den lojik-0'a çekiliyor
output_low(e);
delay_ms(1); // 1 msn gecikme veriliyor
output_b(veri&0x0F); // Verinin düşük değerli 4 bitini gönder
output_high(rs); // LCD veri almak için ayarlandı
output_high(e); // E ucu lojik-1'den lojik-0'a çekiliyor
output_low(e);
delay_ms(1); // 1 msn gecikme veriliyor
}
//******* LCD'de İmlec Konumlandırma Fonksiyonu ********
void imlec(byte satir, byte sutun)
{
if (satir==1) // Eğer satır değişkeni "1" ise
lcd_komut(0x80|(sutun-1));
if (satir==2) // Eğer satır değişkeni "2" ise
lcd_komut(0x80|(0x40+(sutun-1)));
}
//********* LCD Başlangıç Ayarları Fonksiyonu ******
void lcd_hazirla()
{
lcd_komut(0x02);// LCD'yi kullanıma hazır hale getir, imleç // 1.satır 1.sütunda komutu
lcd_komut(0x28);//2 satır, 4 bit iletişim, 5x8 dot matris seçildi
lcd_komut(0x08);//Display kapalı,alt çizgi ve yanıp sönme yok
lcd_komut(0x0C);//Display açık,imleç alt çizgi ve yanıp sönme yok
lcd_komut(0x06);// Her veri yazıldığında imleç bir sağa gitsin
lcd_komut(0x01);// Display sil. İmleç 1.satır 1.sütunda
delay_ms(1); // 1 msn bekle
}
//ds18b20.c dopsya kodum;
#define ONE_WIRE_PIN PIN_A1
void onewire_reset()
{
output_low(ONE_WIRE_PIN);
delay_us( 500 ); //1-wire resetleme için sıfıra çekilir
output_float(ONE_WIRE_PIN); //1-wire bir yapılır
delay_us( 500 ); // sensörün hazırlanması için beklenir.
output_float(ONE_WIRE_PIN);
}
void onewire_write(int data)
{
int count;
for (count=0; count<8; ++count)
{
output_low(ONE_WIRE_PIN);
delay_us( 2 ); // Sensöre yazma işlemine başlamak için 1-wire sıfıra çekilir.
output_bit(ONE_WIRE_PIN, shift_right(&data,1,0)); // yazılacak bilgi 1-wire'da
delay_us( 60 ); // Yazma işlemi zamanı doldurulur.
output_float(ONE_WIRE_PIN); // 1-wire bir yapılır,
delay_us( 2 ); // 1us'den fazla beklenir.
}
}
int onewire_read()
{
int count, data;
for (count=0; count<8; ++count)
{
output_low(ONE_WIRE_PIN);
delay_us( 2 ); //Sensördem okuma işlemi içinl 1-wire sıfıra çekilir.
output_float(ONE_WIRE_PIN); //1-wire bir yapılır,
delay_us( 8 ); // Sensörün kendine gelmesi beklenir,
shift_right(&data,1,input(ONE_WIRE_PIN)); // sonuc bilgisi alınır.
delay_us( 120 ); //Okuma işlemi zamanı doldurulur.
}
return( data );
}
float ds1820_read()
{
int8 busy=0, temp1, temp2;
signed int16 temp3;
float result;
onewire_reset();
onewire_write(0xCC);
onewire_write(0x44);
while (busy == 0)
busy = onewire_read();
onewire_reset();
onewire_write(0xCC);
onewire_write(0xBE);
temp1 = onewire_read();
temp2 = onewire_read();
temp3 = make16(temp2, temp1);
result = (float) temp3 / 2.0;
delay_ms(200);
return(result);
}