C kodunu bir türlü HEX e çeviremiyor hata üstüne hata alıyorum

Başlatan haxan_35, 20 Aralık 2012, 17:52:16

haxan_35

Herkese iyi günler arkadaşlar tubitak ın LCD GÖSTERGELİ TERMOMETRE projesini yapıyorum.Oradaki hazır kodu kullanıyorum ilaveten sadece 2 tane led ekledim.PİCC MİKROC ve Hi-tech programlarını kullanarak HEX dosyası oluşturmaya çalıştım hepsindede hata aldım.En son Hi-tech de kütüphanleride dahil ettim herşey güzeldi Led LERDE hata verdi.Arkadaşlar hatam nerde yada benim için kodu HEX e çevirebilir misin çok teşekkürler.Kullandığım denetleyici PIC16F877.
KOD:
#include <pic.h>
#include <delay.c>
#include <lcd.c>
#include <stdio.h>
#define   led_mavi        pin_c0        // RC0 pini led_mavi ifadesine eşitleniyor
#define   led_kirmizi     pin_c1        // RC1 pini led_kırmızı ifadesine eşitleniyor
int main (void)
{
// Değişken tanımlamaları
const float lsb=5.0/1024.0;
unsigned char gerilim, ust, alt;
float sicaklik;
unsigned char sonuc[]="SICAKLIK = ";

// Port konfigürasyonu
TRISB=0; // PORTB çıkış 
TRISA=1; // RA0 analog giriş

// Ön LCD işlemleri
DelayMs(350); // 350ms bekle
lcd_init(); // LCD'yi hazırla
lcd_clear(); // LCD'yi temizle

// ADC ayarları
ADCON1=0x8E; // AN0 analog giriş
ADCON0=0x41; // A/D aktif

for(;;){

// A/D çevrimi başlat
ADCON0=0x45;
// Dönüşümün bitmesini bekle
while((ADCON0&4)!=0);

// Dönüşüm sonucunu kaydet
gerilim=ADRESH;
gerilim=256*gerilim+ADRESL;

// Sıcaklık bilgisini oluştur
sicaklik=gerilim*lsb*100.0;

// Tam ve ondalık kısımları ayır
ust=(int)sicaklik;
alt=(int)(10.0*(sicaklik-ust));

// LCD'ye yazdırma işlemlerini yap
sprintf(sonuc+11,"%d.%dC ",ust,alt);

// 1. satıra geç ve LCD'ye yaz
lcd_goto(0x00);
lcd_puts("Hasan CIMEN");

// 2. satıra geç ve sıcaklık değerini yaz
lcd_goto(0x40);
lcd_puts(sonuc); 

// Biraz bekle ve ekranı temizle 
DelayMs(250);
lcd_clear();
if(sicaklik<15)
       {
                     output_high(pin_c0); // pin_c0(MAVİ Led) lojik-1 yapılıyor.
                     output_low(pin_c1);  //pin_c1(KIRMIZI Led) lojik-0 yapılıyor.
                        }else if(sicaklik>22)
                        {
                              output_low(pin_c0); // pin_c0(MAVİ Led) lojik-0 yapılıyor.
                              output_high(pin_c1);  //pin_c1(KIRMIZI Led) lojik-1 yapılıyor.
                        }
} // Ölçümü tekrarla
} // Programın sonu


AsHeS

Bu kodun yarısı Hi-Tech yarısı CCS hiçbirinde derlenmez bu şekliyle.

haxan_35

Alıntı yapılan: AsHeS35 - 20 Aralık 2012, 18:30:06
Bu kodun yarısı Hi-Tech yarısı CCS hiçbirinde derlenmez bu şekliyle.

hocam tubitak ın hazır kodu ben sadece led ekledim peki nereyi düzeltmeliyim

gogge

Derleyici olarak hi-tech kullanıdığınızdan eminseniz kodu aşağıdaki örneklere bakarak düzenleyin.

#define   led_mavi        pin_c0   --YANLIŞ
#define   led_mavi        RC0    --DOĞRU

output_high(pin_c0);  --YANLIŞ
RC0=1;       --DOĞRU

Standart hi-tech lcd kütüphanesini eklediğinizden emin olun ve derleyin.


haxan_35

Alıntı yapılan: gogge - 21 Aralık 2012, 01:31:00
Derleyici olarak hi-tech kullanıdığınızdan eminseniz kodu aşağıdaki örneklere bakarak düzenleyin.

#define   led_mavi        pin_c0   --YANLIŞ
#define   led_mavi        RC0    --DOĞRU

output_high(pin_c0);  --YANLIŞ
RC0=1;       --DOĞRU

Standart hi-tech lcd kütüphanesini eklediğinizden emin olun ve derleyin.

Hocam nerde yazıldığını bilmiyorum tubitak ın kodlar benim eklediğim ledler neden olmuyor peki?Birde sizin dediğiniz gibi ekleyim.Hi-tech lcd kütüphanesi mi pic deki lcd kütüphanesini mi eklemeliyim.Yardımlarınız için teşekkürler

gogge

Kodun doğrusu aşağıdaki gibi olacak. Derleyicin hi-tech pic c olmalı. https://www.picproje.org/index.php/topic,44109.0.html buraya bir göz atmanı tavsiye ederim.

Hi-tech klasöründeki lcd.c ve lcd.h kütüphanelerini kullanman gerekir.

#include <pic.h>
#include <delay.c>
#include <lcd.c>
#include <stdio.h>
#define   led_mavi        RC0        // RC0 pini led_mavi ifadesine eşitleniyor
#define   led_kirmizi     RC1        // RC1 pini led_kırmızı ifadesine eşitleniyor
int main (void)
{
// Değişken tanımlamaları
const float lsb=5.0/1024.0;
unsigned char gerilim, ust, alt;
float sicaklik;
unsigned char sonuc[]="SICAKLIK = ";

// Port konfigürasyonu
TRISB=0; // PORTB çıkış 
TRISA=1; // RA0 analog giriş

// Ön LCD işlemleri
DelayMs(350); // 350ms bekle
lcd_init(); // LCD'yi hazırla
lcd_clear(); // LCD'yi temizle

// ADC ayarları
ADCON1=0x8E; // AN0 analog giriş
ADCON0=0x41; // A/D aktif

for(;;){

// A/D çevrimi başlat
ADCON0=0x45;
// Dönüşümün bitmesini bekle
while((ADCON0&4)!=0);

// Dönüşüm sonucunu kaydet
gerilim=ADRESH;
gerilim=256*gerilim+ADRESL;

// Sıcaklık bilgisini oluştur
sicaklik=gerilim*lsb*100.0;

// Tam ve ondalık kısımları ayır
ust=(int)sicaklik;
alt=(int)(10.0*(sicaklik-ust));

// LCD'ye yazdırma işlemlerini yap
sprintf(sonuc+11,"%d.%dC ",ust,alt);

// 1. satıra geç ve LCD'ye yaz
lcd_goto(0x00);
lcd_puts("Hasan CIMEN");

// 2. satıra geç ve sıcaklık değerini yaz
lcd_goto(0x40);
lcd_puts(sonuc); 

// Biraz bekle ve ekranı temizle 
DelayMs(250);
lcd_clear();
 if(sicaklik<15)
       {
                     led_mavi=1; // pin_c0(MAVİ Led) lojik-1 yapılıyor.
                     led_kirmizi=0;  //pin_c1(KIRMIZI Led) lojik-0 yapılıyor.
                        }else if(sicaklik>22)
                        {
                              led_mavi=0; // pin_c0(MAVİ Led) lojik-0 yapılıyor.
                              led_kirmizi=1;  //pin_c1(KIRMIZI Led) lojik-1 yapılıyor.
                        }
} // Ölçümü tekrarla
} // Programın sonu



haxan_35

Alıntı yapılan: gogge - 22 Aralık 2012, 15:24:54
Kodun doğrusu aşağıdaki gibi olacak. Derleyicin hi-tech pic c olmalı. https://www.picproje.org/index.php/topic,44109.0.html buraya bir göz atmanı tavsiye ederim.

Hi-tech klasöründeki lcd.c ve lcd.h kütüphanelerini kullanman gerekir.

#include <pic.h>
#include <delay.c>
#include <lcd.c>
#include <stdio.h>
#define   led_mavi        RC0        // RC0 pini led_mavi ifadesine eşitleniyor
#define   led_kirmizi     RC1        // RC1 pini led_kırmızı ifadesine eşitleniyor
int main (void)
{
// Değişken tanımlamaları
const float lsb=5.0/1024.0;
unsigned char gerilim, ust, alt;
float sicaklik;
unsigned char sonuc[]="SICAKLIK = ";

// Port konfigürasyonu
TRISB=0; // PORTB çıkış 
TRISA=1; // RA0 analog giriş

// Ön LCD işlemleri
DelayMs(350); // 350ms bekle
lcd_init(); // LCD'yi hazırla
lcd_clear(); // LCD'yi temizle

// ADC ayarları
ADCON1=0x8E; // AN0 analog giriş
ADCON0=0x41; // A/D aktif

for(;;){

// A/D çevrimi başlat
ADCON0=0x45;
// Dönüşümün bitmesini bekle
while((ADCON0&4)!=0);

// Dönüşüm sonucunu kaydet
gerilim=ADRESH;
gerilim=256*gerilim+ADRESL;

// Sıcaklık bilgisini oluştur
sicaklik=gerilim*lsb*100.0;

// Tam ve ondalık kısımları ayır
ust=(int)sicaklik;
alt=(int)(10.0*(sicaklik-ust));

// LCD'ye yazdırma işlemlerini yap
sprintf(sonuc+11,"%d.%dC ",ust,alt);

// 1. satıra geç ve LCD'ye yaz
lcd_goto(0x00);
lcd_puts("Hasan CIMEN");

// 2. satıra geç ve sıcaklık değerini yaz
lcd_goto(0x40);
lcd_puts(sonuc); 

// Biraz bekle ve ekranı temizle 
DelayMs(250);
lcd_clear();
 if(sicaklik<15)
       {
                     led_mavi=1; // pin_c0(MAVİ Led) lojik-1 yapılıyor.
                     led_kirmizi=0;  //pin_c1(KIRMIZI Led) lojik-0 yapılıyor.
                        }else if(sicaklik>22)
                        {
                              led_mavi=0; // pin_c0(MAVİ Led) lojik-0 yapılıyor.
                              led_kirmizi=1;  //pin_c1(KIRMIZI Led) lojik-1 yapılıyor.
                        }
} // Ölçümü tekrarla
} // Programın sonu



Hocam dediğiniz gibi yaptım Hİ-tech klasörü içinde samples dosyasındaki LCDemo daki lcd.h ve lcd.c leri ekledim fakat aşağıdaki gibi hatalar aldım.Koda birşey include etmek gerekli pic in modeli gibi veya lcd.h gibi.Resmi yeni sekmede açarsanız daha net görebilirsiniz

mozkan87

#include <delay.c> 
#include <lcd.c>

Yukarıdaki iki satırı
#include <delay.h> 
#include <lcd.h>

olrak değiştir.

haxan_35

Alıntı yapılan: mozkan87 - 23 Aralık 2012, 15:27:27
#include <delay.c> 
#include <lcd.c>

Yukarıdaki iki satırı
#include <delay.h> 
#include <lcd.h>

olrak değiştir.

Hocam öncelikle yardımlarınız için teşekkürler sayenizde hata çözüldü.Fakat bu sefer main hatası aldım hataya tıkladığımda koddaki mainden sonraki ilk parantezi gösteriyor.Hatanın sebebi nedir yaklaşık 5 gündür hex e çeviremedim eklediğim 2 led hi-tech değilde başka programlarda da kütüphane hatası aldım.Aşağıdaki resimde hata !!!


mozkan87

Programın en sonuna bir iki tane fazlandan enter koy. Ayrıca
int main(void) satırını void main(void) ile değiştir.

Hata kodlarını resim ile eklemek yerine sadece output penceresinde yazan hataları buraya yazmanız yeterli olacaktır.

haxan_35

Alıntı yapılan: mozkan87 - 23 Aralık 2012, 22:37:01
Programın en sonuna bir iki tane fazlandan enter koy. Ayrıca
int main(void) satırını void main(void) ile değiştir.

Hata kodlarını resim ile eklemek yerine sadece output penceresinde yazan hataları buraya yazmanız yeterli olacaktır.

Hocam pic programlamada sıfırım.Enter koy ne demek hiçbir fikrim yok.Dediğiniz gibi int main i void main(void) yaptım.2 hata kaldı geriye.
(1273) Omniscient Code Generation not available in Lite mode (warning)
Error   [237] C:\Users\Hasan\Desktop\hex\termometre.c; 8. function "_main" redefined

Bir arkadaşım redefined hatasına fonksiyonların birden çok tanımlanması dedi.Kodda fonksiyon göremedim ben

mozkan87

Ben dikkat etmemiştim sizde 2 adet main fonksiyonu var. Sizin dosyada hem termometre.c hem main.c dosyaları var. Eğer pic ile ilgili hiç bir bilginiz yok ise biraz araştırıp öğrenmenizi öneririm. Bu sorunu çözsek başka sorunlar yaşayabilirsiniz. Ama bu sorunun çözümü main.c dosyasını programdan çıkarmak.

haxan_35

Alıntı yapılan: mozkan87 - 24 Aralık 2012, 00:26:16
Ben dikkat etmemiştim sizde 2 adet main fonksiyonu var. Sizin dosyada hem termometre.c hem main.c dosyaları var. Eğer pic ile ilgili hiç bir bilginiz yok ise biraz araştırıp öğrenmenizi öneririm. Bu sorunu çözsek başka sorunlar yaşayabilirsiniz. Ama bu sorunun çözümü main.c dosyasını programdan çıkarmak.

Hocam projeye geç başladım vizeler felan derken haftaya kadar teslim etmem lazım pic e bakıcak vaktim olmadı.Aslında şimdi öğrenmek en iyisi olurdu.
Allah razı olsun sizden ve diğer arkadaşlardan sayenizde HEX e çevirdim.Fakat proteusta LCD çıktısını göremiyorum.Tubitakın HEX inde sorun yok onu gösteriyor.Derleyici yüzünden mi göstermedi proteus çıktıyı nedeni nedir?

mozkan87


haxan_35

Alıntı yapılan: mozkan87 - 24 Aralık 2012, 12:08:29
LCD pinlerini yanlış bağlamış olabilirsin.

Hocam öncelikle bütün yardımlarınız için teşekkürler.Proteus şeması aşağıdadır.Tubitak ın kendimiz yapalım köşesindeki lcd göstergeli termometre oradaki hazır HEX çalışıyor.Problem KOdda mı yoksa yanlış bir derleyici ile mi derledik benim eklediğim 2 led ve LCD de ki yazıyı değiştirdim.2x16 lcd normalde BILIM VE TEKNIK yazıyor ben onu ismimle değiştirdim.Hata nerede hocam fikriniz var mı?