Basit bir LCD termometre

Başlatan sero, 16 Kasım 2007, 14:56:46

sero

Texas Instrument tarafından üretilen DS1620 entegresi, -55 º ~+125º  arasında sıcaklık ölçümü yapabilir. Mikrokontrolör ile DQ,RST ve CLK olarak isimlendirilen üç pin aracılığıyla iletişim kurar. Elde ettiği sıcaklık bilgisini 2' formunda 9 bitlik seri datalar halinde gönderir. RST bacağı 1 olduğunda DQ pini aracılığıyla CLK palslerle birlikte entegreye bilgi gönderilir veya bilgi alınır.Ayrıca TH ve TL pinleri kullanılarak  entegre Termostat gibi de kullanılabilir.Termometre yapmak isteyen arkadaşlar bakabilirler. Upload dosyasının içince projenin PICC Lite diline yazılmış .C dosyası, .DSN ve .hex dosyaları mevcuttur.

Upload linki: http://uploaded.to/?id=bntbjp

Daha ayrıntılı bilgi için;
http://pdfserv.maxim-ic.com/en/ds/DS1620.pdf

Resim:
http://img77.yukle.tc/image.php?id=188resim.JPG

arslan74

Merhaba,

Yazdığın programda sprintf fonksiyonunu yanlış kullanmışsın.

Selamlar

sero

Merhaba arslan74 hocam.Daha önce DS18B20 içinde aynı uyarıyı yapmıştınız.Buradada sprintf komutunu belirttiğiniz şekilde kullandığımda bir değişiklik olmadı. Biraz daha detay verirsiniz sevinirim. Şimdiden teşekkürler,kolay gelsin...

arslan74

Alıntı yapılan: "sero"Merhaba arslan74 hocam.Daha önce DS18B20 içinde aynı uyarıyı yapmıştınız.Buradada sprintf komutunu belirttiğiniz şekilde kullandığımda bir değişiklik olmadı. Biraz daha detay verirsiniz sevinirim. Şimdiden teşekkürler,kolay gelsin...

Merhaba,

Eğer yazi tutan bir diziye uzunluk belirtmezen ve ilk değer olarak bir yazı girersen o zaman bu dizinin toplam uzunluğu girilen yazı kaadardır.

unsigned char goster[]="SICAKLIK: ";


O zaman bu dinamik dizinin uzunluğu 11 byte dir.

unsigned char goster[]="SICAKLIK: ";
	unsigned int sicaklik;

	sicaklik=bilgi_oku(sicaklik_oku,9);
	sprintf(goster+9,"%d C",sicaklik);


Sen burada goster+9 yazmışsın. int değişken 16 bit dir, bu değişkeni yazı olarak göstermek için en az 5 byte ihtiyac vardır. O zaman bu durumda 9+5+1= 16 uzunluğundan kısa bir dizide gösteremesin. Program dogru çalıştığını idda ediyorsunuz, bu olabilir ama bunun hiç bir garantisi yok, cünkü dizide taşmaya neden oluyorsunuz ve taşdığı alanın neresi olduğu belli değil.

Bu durumu çözmenin bir kaç yolu var, en basidi kullandığın dizi taşmaya neden olmayacak kadar uzun tutarsan bu sorunu en basidinden halletmiş olursun.

Ama sen burada sabit olan bir yazıyı RAMde tutuyorsun bu durumda kısıtlı olan RAMini daha fazla gereksiz olarak kısıtlamış olursun.
Onun yerine sabit yazıları flash bellekte tutman daha iyi olur.

Örneğin;

unsigned char goster[6];
	unsigned int sicaklik;

	sicaklik=bilgi_oku(sicaklik_oku,9);
	sprintf(goster,"%d C",sicaklik);

	lcd_goto(0x00);
	lcd_puts("SICAKLIK: ");
	lcd_puts(goster);


Yukardaki gibi yazarsan bu durumda 6 byte lık ramle işini halletmiş olursun.

veya

const unsigned char goster2[]="SICAKLIK: ";
	unsigned char goster[6];
	unsigned int sicaklik;

	sicaklik=bilgi_oku(sicaklik_oku,9);
	sprintf(goster,"%d C",sicaklik);

	lcd_goto(0x00);
	lcd_puts(goster2);
	lcd_puts(goster);


şeklinde kullandığın zaman, const değişkenler ROM tutlacağı için RAM'i gereksiz yere kullanmamış olursun.

Programın kısa bir program olduğu için şimdilik RAMle bir sıkıntın olmaz ama Yazdığın programın capı büyürse ve RAMı böyle işler için kullanırsan ilerde kesinlikle RAM yetmeyecek.

O yüzden önerdiğim şeklide kullanırsan daha sağlıklı olur.


Selamlar

arslan74

Alıntı yapılan: "sero"Merhaba arslan74 hocam.Daha önce DS18B20 içinde aynı uyarıyı yapmıştınız.Buradada sprintf komutunu belirttiğiniz şekilde kullandığımda bir değişiklik olmadı. Biraz daha detay verirsiniz sevinirim. Şimdiden teşekkürler,kolay gelsin...

Merhaba,

Eğer yazi tutan bir diziye uzunluk belirtmezen ve ilk değer olarak bir yazı girersen o zaman bu dizinin toplam uzunluğu girilen yazı kaadardır.

unsigned char goster[]="SICAKLIK: ";


O zaman bu dinamik dizinin uzunluğu 11 byte dir.

unsigned char goster[]="SICAKLIK: ";
	unsigned int sicaklik;

	sicaklik=bilgi_oku(sicaklik_oku,9);
	sprintf(goster+9,"%d C",sicaklik);


Sen burada goster+9 yazmışsın. int değişken 16 bit dir, bu değişkeni yazı olarak göstermek için en az 5 byte ihtiyac vardır. O zaman bu durumda 9+5+1= 16 uzunluğundan kısa bir dizide gösteremesin. Program dogru çalıştığını idda ediyorsunuz, bu olabilir ama bunun hiç bir garantisi yok, cünkü dizide taşmaya neden oluyorsunuz ve taşdığı alanın neresi olduğu belli değil.

Bu durumu çözmenin bir kaç yolu var, en basidi kullandığın dizi taşmaya neden olmayacak kadar uzun tutarsan bu sorunu en basidinden halletmiş olursun.

Ama sen burada sabit olan bir yazıyı RAMde tutuyorsun bu durumda kısıtlı olan RAMini daha fazla gereksiz olarak kısıtlamış olursun.
Onun yerine sabit yazıları flash bellekte tutman daha iyi olur.

Örneğin;

unsigned char goster[6];
	unsigned int sicaklik;

	sicaklik=bilgi_oku(sicaklik_oku,9);
	sprintf(goster,"%d C",sicaklik);

	lcd_goto(0x00);
	lcd_puts("SICAKLIK: ");
	lcd_puts(goster);


Yukardaki gibi yazarsan bu durumda 6 byte lık ramle işini halletmiş olursun.

veya

const unsigned char goster2[]="SICAKLIK: ";
	unsigned char goster[6];
	unsigned int sicaklik;

	sicaklik=bilgi_oku(sicaklik_oku,9);
	sprintf(goster,"%d C",sicaklik);

	lcd_goto(0x00);
	lcd_puts(goster2);
	lcd_puts(goster);


şeklinde kullandığın zaman, const değişkenler ROM tutlacağı için RAM'i gereksiz yere kullanmamış olursun.

Programın kısa bir program olduğu için şimdilik RAMle bir sıkıntın olmaz ama Yazdığın programın capı büyürse ve RAMı böyle işler için kullanırsan ilerde kesinlikle RAM yetmeyecek.

O yüzden önerdiğim şeklide kullanırsan daha sağlıklı olur.


Selamlar

sero

Çok teşekkür ederim hocam. Dediğinizi şimdi çok daha iyi anladım ve programı o şekilde tekrar düzenledim. Selamlar...

arslan74

Alıntı yapılan: "sero"Çok teşekkür ederim hocam. Dediğinizi şimdi çok daha iyi anladım ve programı o şekilde tekrar düzenledim. Selamlar...

Ayrica sadece int türü bir değişkeni LCD göstermek sprintf fonksiyonunu program içine eklemek gereksiz yere hafızayı 2k artırmaya neden olur. Onun yerine kendin yazacağın basit bir fonksiyon ile hafızayı ve işlem hızını cok daha verimli kullanmış olursun.

Selamlar