Lcd.c dosyasinda sorun

Başlatan semesu, 28 Şubat 2008, 21:38:03

semesu

acıklamalarınız ıcın cok teşekkür ederım. evet kusura bakmayın eksık yerler var yazdıgım maılde.

baskalarına acıklayıcı olması acısından programın tamamını ekliyorum;


#include<pic.h>
#include<delay.c>
#include<lcd.c>
#include <stdio.h>

main (void){
const float lsb=5000.0/1024.0;
float dusuk,yuksek,volt;
unsigned char goster[]="  ";
unsigned int mv;


ADCON0=0x41;
ADCON1=0x8E;
TRISB=0;
TRISA=0xF3;
lcd_init();



for(;;){
lcd_clear();
ADCON0=0x45;
while((ADCON0 & 4)!=0);
yuksek=ADRESH;
dusuk=ADRESL;

volt=256.0*yuksek+dusuk;
volt=volt*lsb;
mv=(int)volt;
sprintf(goster,"%d",mv);
lcd_puts(goster);
DelayMs(250);


      }

}





iyi calısmalar

semesu

mrb yazdıgım programda bende lcd de hem adc_val degerini hemde volt degerını gostermesı ıcın degsıklıkler yaptım.
gayet sorunsuz calısıyor ancak lcd de 2.satıra gecıremedım volt degerını
sizin komutlarınızı kullandım lcd_goto(S1_1) lcd_goto(S2_1) seklınde olan ama hata verdı.(undefined S1_1 seklınde)
sonra su sekılde yazdım
lcd_goto(0x80) boyle yazdıgımda 2.satıra atlamıyor
lcd_goto(ox85) yazdıgımda da ekranda hıcbırsey cıkmıyor.
aradakı rakamları(0x81,0x82,0x83 gibi)  denedım yıne farketmedı
lcd olarak da
LM032L kullanıyorum
yardımcı olursanız sevınırım
iyi calısmalar

CLR

Merhaba,

0x80 yerine 0xC0 yaz,  2. satıra geçecektir.

Aslan74'ün tanımlamalarını görmedim fakat 1. satır için

S1_1=0x80 // 1. satır 1. karakter
S1_2=0x81
...
S1_16=0x8F // 1. satır 16. karakter
2. satır için
S2_1=0xC0   // 2. satır 1. karakter
S2_2=0xC1
...
S2_16=0xCF

olmalı  tabii bunları #define ile tanımlayacaksın
#define   S1_1     0x80   // gibi

Kolay gelsin
Knowledge and Experience are Power

arslan74

Alıntı yapılan: "semesu"mrb yazdıgım programda bende lcd de hem adc_val degerini hemde volt degerını gostermesı ıcın degsıklıkler yaptım.
gayet sorunsuz calısıyor ancak lcd de 2.satıra gecıremedım volt degerını
sizin komutlarınızı kullandım lcd_goto(S1_1) lcd_goto(S2_1) seklınde olan ama hata verdı.(undefined S1_1 seklınde)
sonra su sekılde yazdım
lcd_goto(0x80) boyle yazdıgımda 2.satıra atlamıyor
lcd_goto(ox85) yazdıgımda da ekranda hıcbırsey cıkmıyor.
aradakı rakamları(0x81,0x82,0x83 gibi)  denedım yıne farketmedı
lcd olarak da
LM032L kullanıyorum
yardımcı olursanız sevınırım
iyi calısmalar

Merhaba,

eemkutay bey güzel bir şekilde acıklamış. Bu bahs ettiği işlemi ben "lcd.h" dosyasında yaptığım için o hatayı almıyorum. Yani Hi-tech'in "lcd.h" ve "lcd.c" dosyalarına ben biraz ekleme yaptım. Amac okunabilirliği artırmak için, böyle yaptım. yayınladığım proje dosyasının içinde aradığınız bütün bilgiler var. Benim kullandığım "lcd.c" ve "lcd.h" dosyasını kullanırsanız o hata mesajını almassınız.

Selamlar

semesu

MERHABA DEDİKLERİNİZİ DENEDIM
LCD_GOTO(0X80) YERİNE LCD_GOTO(0XC0) YAZDIM ANCAK BİRSEY FARKETMEDI. EKRANDA SACEDE ADC_VAL  DEGERİNİ GOREBILIYORUM.
YAZDIGIM PROGRAMI ASAGIYA EKLIYORUM ACABA GOZDEN KACIRDIGIM BIRSEYMI VAR?




#include<pic.h>
#include<delay.c>
#include<lcd.c>
#include <stdio.h>



main (void){
unsigned char goster []= "  ";





ADCON0=0x41;
ADCON1=0x8E;
TRISB=0;
TRISA=0xF3;
lcd_init();



for(;;){
unsigned int  adc_val;
unsigned int dusuk,yuksek;
float volt;


lcd_clear();

ADCON0=0x45;
while((ADCON0 & 4)!=0);
yuksek=ADRESH;
dusuk=ADRESL;
adc_val=256*yuksek+dusuk;
volt=adc_val*(5./1024);



lcd_goto(0x80);
sprintf(goster," adc_val=%d",adc_val);
lcd_puts(goster);

lcd_goto(0xC0);
sprintf(goster," volt=%1f",volt);
lcd_puts(goster);
DelayMs(500);


   }

}


iyi calısmalar

arslan74

Alıntı yapılan: "semesu"MERHABA DEDİKLERİNİZİ DENEDIM
LCD_GOTO(0X80) YERİNE LCD_GOTO(0XC0) YAZDIM ANCAK BİRSEY FARKETMEDI. EKRANDA SACEDE ADC_VAL  DEGERİNİ GOREBILIYORUM.
YAZDIGIM PROGRAMI ASAGIYA EKLIYORUM ACABA GOZDEN KACIRDIGIM BIRSEYMI VAR?




#include<pic.h>
#include<delay.c>
#include<lcd.c>
#include <stdio.h>



main (void){
unsigned char goster []= "  ";





ADCON0=0x41;
ADCON1=0x8E;
TRISB=0;
TRISA=0xF3;
lcd_init();



for(;;){
unsigned int  adc_val;
unsigned int dusuk,yuksek;
float volt;


lcd_clear();

ADCON0=0x45;
while((ADCON0 & 4)!=0);
yuksek=ADRESH;
dusuk=ADRESL;
adc_val=256*yuksek+dusuk;
volt=adc_val*(5./1024);



lcd_goto(0x80);
sprintf(goster," adc_val=%d",adc_val);
lcd_puts(goster);

lcd_goto(0xC0);
sprintf(goster," volt=%1f",volt);
lcd_puts(goster);
DelayMs(500);


   }

}


iyi calısmalar

Çalışmadığını söylüyorsunuz ama hangi "lcd.c" programını kullandığınız belirtmemişsiniz. Bu durumda bu iş SCMA (sari cizmeli mehmet ağa) yı bulmaya döner.
sonuca ulaşmak için ya benim gösterdiğim şekilde benim "lcd.c" programını kullanmalısın yada başka "lcd.c" programını kullanacaksanız o zaman bu "lcd_goto" fonksiyonun içindeki koduda yayınlamanız gerekiyor.
Ancak o zaman size cevap verilebilir. Bu durumda kimse kesin cevap veremez.

Selamlar

CLR

Merhaba,

@semesu

0x80 ile birinci satıra gidip yazıyorsa 0xC0 ile de 2. satıra gider ve yazar.
Knowledge and Experience are Power

semesu

eemkutay,sizin soyledıklerınızı tekrar tekrar denedım ama olmuyor , sanırım bendeki lcd.c ve lcd.h dosyalarında eksıkler var,sebebini bende anlamadım. yardımcı oldugunuz ıcın teşekkür ederım.
arslan74, lcd.c ve lcd.h dosyalarınızın bulundugu proje klasorune ulasamadım. nerden bulabılecegımı soyleyebilirmisiniz?

semesu

arkadaslar deneme yaparken bır hatamı daha buldum. bu hatamı goremedim cunku volt ve adc_val degerlerını aynı anda goremıyordum ekranda.Lcd ye sadece adc_val yada sadece volt degerını  yazdırdıgımda  ozaman ikiside dogru degerleri veriyor ama



sprintf(goster," volt=%f",volt);
lcd_puts(goster);
DelayMs(500);
lcd_clear();


sprintf(goster," adc_val=%d",adc_val);
lcd_puts(goster);
DelayMs(750);

seklınde yazdıgımda once volt degerini dogru gosterıyor ancak bu degerı sılıp adc_val degerini dogru gostermıyor alakasız deger  yazıyor ekranda . aynı sekılde


sprintf(goster," adc_val=%d",adc_val);
lcd_puts(goster);
DelayMs(750);
lcd_clear();

sprintf(goster," volt=%f",volt);
lcd_puts(goster);
DelayMs(500);
yaptıgımda da adc_val degerini dogru gosterıyor ancak  bu sefer de volt degerı alakasız bırsey yazıyor ekranda.


hatam nerede bulamadım bırturlu
iyi calısmalar arkadaslar

ahmet2004

Lcd.c
void
lcd_goto(unsigned char pos)
{
	LCD_RS = 0;
	lcd_write(0x80+pos);
}


lcd_goto(0x00); 
		sprintf(goster1," Adc_value= %d",adc_val); 
		lcd_puts(goster1); 

		lcd_goto(0x40); 
		sprintf(goster2," %1fvolt",volt); 
		lcd_puts(goster2); 
		DelayMs(200);


yazarak deneyebilirsiniz.

semesu

mrb
ahmet2004  sizin dedıklerınızı yaptım

lcd_goto(0x00);
     sprintf(goster1," Adc_value= %d",adc_val);
     lcd_puts(goster1);

     lcd_goto(0x40);
     sprintf(goster2," %1fvolt",volt);
     lcd_puts(goster2);
     DelayMs(200);
komutlarını yazdım ıkı degeride gorebılıyorum ekranda ancak eger adc_val degerini ilk satıra yazarsam ikinci satırda  volt degeri sıfır gozukuyor lcd de,yada volt degerini ilk satıra yazarsam ikinci satırda adc_val degeri cok alakasız bır sayı yazıyor bu seferde .

ayrıca bende olan  lcd.c dosyasına baktım yazdıgınız
void
lcd_goto(unsigned char pos)
{
  LCD_RS = 0;
  lcd_write(0x80+pos);
}


komutları aynı bendeki dosyadakıyle .
hangı hatadan  dolayı lcd de  iki degeride aynı anda dogru goremıyor olabılrım ??

ahmet2004

HI-TIDE

main.c
#include <htc.h>

#include <string.h>
#include <stdio.h>

#include "delay.h"
#include "lcd.h"

main (void){ 
unsigned char goster1[20]= " "; 
unsigned char goster2[20]= " ";


ADCON0	=	0x41; 
ADCON1	=	0x8E; 
TRISB	=	0x00; 
TRISA	=	0xF3;
TRISD	=	0x00;

 
	lcd_init(); 

	for(;;) {
unsigned int adc_val; 
unsigned int dusuk,yuksek; 
float volt;
ADCON0	=	0x45;

		lcd_clear(); 
		while((ADCON0 & 4) != 0); 
		yuksek=ADRESH; 
		dusuk=ADRESL; 
		adc_val=256*yuksek+dusuk; 
		volt=adc_val*(5./1024); 

		lcd_goto(0x00); 
		sprintf(goster1," Adc_value= %d",adc_val); 
		lcd_puts(goster1); 

		lcd_goto(0x40); 
		sprintf(goster2," %1fvolt",volt); 
		lcd_puts(goster2); 
		DelayMs(200); 
	} 
}

ahmet2004

void
lcd_write(unsigned char c)
{
	PORTB = c >> 4;
	LCD_STROBE;
	PORTB = c;
	LCD_STROBE;
	DelayUs(40);

}

Bportuna direkt değer atılıyor.Buda tabii kontrol pinlerini etkiliyor.
O yüzden kontrol pinleri D ye alıp dene.veya başka pinlere.


Main.c
........
TRISD=0x00; //D portu çıkış yapıldı.
........


Lcd.c
........
static bit LCD_RS	@ ((unsigned)&PORTD*8+6);	// Register select
static bit LCD_EN	@ ((unsigned)&PORTD*8+7);	// Enable
.......



Görüldüğü gibi;
Lcd RS pinini PortD6
Lcd E pinini   PortD7

Lcd kontrol pinlerini bu şekilde değiştir.

ahmet2004

Float değişkenleri kullanmak içinse;



HI-TIDE Proje özelliklerinden Linker bölümünde bulunan

float parametresini programa bildirmen gerekiyor.

semesu

MRB
SİZİN DEDİGİNİZ SEKILDE LCD.C DOSYASINI DEGISTIRDIM ONA GORE ISISTE DEGISIKLIKLERDE YAPTIM ANCAK EKRANDA BU SEFER HIC BIRSEY CIKMIYOR.
BİRTURLU OLMADI:(