C programlamaya yeni başlayan. Derleyici sorunu.

Başlatan hops-c, 23 Ocak 2011, 14:42:05

hops-c

Arkadaşlar ben sadece assembler ile programlama biliyorum. Tubitağın termometre projesini yapmak istedim ve ordaki program C ile yazılmıştı. Hazır C kodları ve HEX kodları vardı. Ben aldım HEX kodunu 877A ya programladım. Buraya kadar sorun yok ancak ben o projede bir değişikli kyapmak istiyorum ve LCD'ye "Bilim ve Teknik" yerine kendi ismimi yazmak istiyorum. C kodunda bir değişiklik yapıp bunu yeniden .HEX 'e derleyip PIC'e programlamak istiyorum. Hem birazda PIC C öğrenmek istiyorum.

PICC ve HITECH Derleyicilerini yükle dediler bana başkaları Ben yükledim. MPLAB'da yüklü. Ancak bu programlarda C dosyasını nasıl HEX'e çevirecem bulamadım. Acaba yüklediklerimdemi bi eksiklik vardı anlamadım. Compile butonuna tıklıyorsun ancak hex dosyaları çıkmıyor. Bide tübitağın kodunda lcd.h gibi header dosyaları var bunları ne PICC ne de HITECH buluyor. Bulunamadı deyip hata veriyor. Siz PIC C ile programlama yapıyorsunuz sonuçta; ben bu programları kaldırıp adam akıllı çalışan bi program kurmak istiyorum ve tek istediğim nasıl .asm uzantısını .hex e MPASM ile çeviriyorduk işte bu seferde .C uzantılı dosyayı .HEX'e çevirmek istiyorum. PRogramların setup dosyalarını nereden bulabiliirm. Hangi programı kullanmalıyım. hexe bi türlü çeviremedik. aşağıda kodu var. buradan setup dosyası linki gönderebilirmisiniz. nerede yazmalıyım programı nerede derlemeliyim hiç bilmiyorum.

#include <pic.h>
#include <delay.c>
#include <lcd.c>
#include <stdio.h>
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(250); // 250ms 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("Bilim ve Teknik"); 

// 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();

} // Ölçümü tekrarla
} // Programın sonu

sigmoid

kodlar hitech c derleyicisi ile yazılmış. Önce MPLAB sonrada Hitech C kurun.

MPLABtan Proje->Proje Wizard ile yeni bir proje oluşturun burada kullandığınız PICi ve derleyici olarak ta hitechi seçin. File -> New den yeni bir dosya oluşturup. Save AS ile c uzantılı olarak kaydet. Bu dosyaya yazdığın kodları yapıştır. Sol tarafta Source Files, Header Fİles vs yazan project penceresi var. Source files üzerin sağ tuşa tıklayarak c uzantılı dosyaları ekle. Header files üzerinde sağ tuşa tıklayarak h uzantılı dosyaları da ekle. Lcd ve delay dosyalar hitechin samples klasörü içinde

birde koddaki yanlışlık asla c uzantılı dosyalar include edilmez. h uzantılı dosyalar include edilir.

#include <delay.h>
#include <lcd.h>

olmalıydı.

kolay gelsin.

sigmoid

o zaman c dosyalarını include etmek doğru değildir şeklinde düzelteyim.

Bilindiği gibi c derleyicileri derleme işlemi sonucunda tüm c uzantılı dosyaları object dosyasını dönüştürür. Sonrada linker bu object dosyalarını birleştirerek hex veya exe dosyasına dönüştürür. Eski zamanlarda bilgisayarın kapasitesi az olduğunda çok büyük c dosyaları derlenemek zor oluyordu. Sürekli hiç değişiklik yapılmamış kaynak kodlarını defalarca derlemek ekstra yük getiriyordu. Aynı görevleri yapan fonksiyonlar ayrı c dosyalarına kaydedilerek bu problemin önüne geçildi. Bu dosyalar bir kere derleniyor. Sonrada değişiklik olan dosyalar yeniden derlenip daha önceden derlenmiş object dosyaları ile birleştiriliyordu.

h dosyalarında sadece fonksiyon prototipleri, #define ile yapılmış tanımlamalar vs yer alır.

Pic programlarken pek fark edilmesede bilgisayarda yazılan büyük projeler için bu şekilde yapmak gerekiyor. Build ile Build All arasındaki farkı ancak bu şekilde kullanabilirsiniz. Ayrıca derleyicinin bir c dosyasını object dosyasına dönüştürme kapasitesininde bir sınırı vardır.

hasan KOCA

selam arkadaşlar şu programı bir türlü hex e çeviremedim hata veriyor yardım ederseniz sevinirim.
//Initial Includes
#include <p18f452.h>
#include <timers.h>
#include <delays.h>
#include <adc.h>
#include <stdlib.h>

//Servo Initialization
int servo0 = 0xFC17;

//More Initializations
int radar_direction = 0;
int whichway = 0;
int count = 0;
int result = 0;
int round = 0;

//Function Declarations
void InterruptHandlerHigh (void);
int Ir_Data_Eval(int, int);

void main(void)
{

//Allow Interrupts
RCON = 0b000000000;
INTCON = 0b10100000;

//Setup & Open A/D, Timers
OpenTimer0( TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_2 );
OpenTimer1( TIMER_INT_ON & T1_16BIT_RW & T1_SOURCE_INT & T1_PS_1_2 & T1_OSC1EN_OFF & T1_SYNC_EXT_OFF );

//Initialize Timers
WriteTimer0( 0xB1DF );
WriteTimer1( 0xFC17 );

//Initialize Port Directions
TRISD = 0x00;
TRISB = 0x00;
TRISC = 0x00;

//Initially Light Up All Leds & Turn Them Off
PORTB = 0xFF;
PORTD = 0xFF;
Delay10TCYx(100);
PORTD = 0x00;
Delay10KTCYx(100);

PORTB = 0x00;
PORTD = 0xFF;
Delay10TCYx(100);
PORTD = 0x00;
Delay10KTCYx(100);

//Infinite While Loop
   while(1)
   {
   
      //If radar is at one of 5 spots take a/d & output it to the leds
      switch(radar_direction)
      {
     
         case 0:
               
               ConvertADC();
               while( BusyADC() );
                  result = ReadADC();
                 
               PORTB = Ir_Data_Eval(result, 1);
               PORTD = 0x01;               
               Delay10TCYx(10);
               result = 0;
               PORTD = 0x00;
               break;
         case 1:

               ConvertADC();
               while( BusyADC() );
                  result = ReadADC();
                 
               PORTB = Ir_Data_Eval(result, 0);
               PORTD = 0x02;
               Delay10TCYx(10);
               result = 0;
               PORTD = 0x00;
               break;
         case 2:

               ConvertADC();
               while( BusyADC() );
                  result = ReadADC();

               PORTB = Ir_Data_Eval(result, 0);
               PORTD = 0x04;
               Delay10TCYx(10);
               result = 0;
               PORTD = 0x00;
               break;
         case 3:

               ConvertADC();
               while( BusyADC() );
                  result = ReadADC();
                 
               PORTB = Ir_Data_Eval(result, 0);
               PORTD = 0x08;
               Delay10TCYx(10);
               result = 0;
               PORTD = 0x00;
               break;
         case 4:

               ConvertADC();
               while( BusyADC() );
                  result = ReadADC();

               PORTB = Ir_Data_Eval(result, 0);
               PORTD = 0x10;
               Delay10TCYx(10);
               result = 0;
               PORTD = 0x00;
               break;
      }
   }
}

//INTERRUPT CONTROL
#pragma code InterruptVectorHigh = 0x08                //interrupt pointer address (0x18 low priority)
void InterruptVectorHigh (void)
{
        _asm        //assembly code starts
        goto InterruptHandlerHigh                //interrupt control
        _endasm //assembly code ends
}
#pragma code
#pragma interrupt InterruptHandlerHigh        //enf.

void InterruptHandlerHigh()        // declaration of InterruptHandler
{//this gets ran when ever the timers flop over from FFFF->0000
        if(INTCONbits.TMR0IF)                        //check if TMR0 interrupt flag is set
        {
            WriteTimer0( 0xB1DF );
            WriteTimer1( 0xFC17 );
            count = 0;
             INTCONbits.TMR0IF = 0;                //clear TMR0 flag               
        }
        if(PIR1bits.TMR1IF == 1 && PIE1bits.TMR1IE == 1)        //if set controls the first servo
        {
      count++;   
            switch(count){     
         case 1:     PORTC = 0x01; // First Stage
                   WriteTimer1( servo0 );
                  break;
         default:   PORTC = 0x00; // Left Gripper
                  WriteTimer1(0);
                  break;
            }

                PIR1bits.TMR1IF = 0;                        //clear Timer1 flag
                PIE1bits.TMR1IE = 1;                        //clear Timer1 enable flag set to zero

/*

Begin Direction Control

*/
   //Move the Servo In Small Steps
   if(whichway)
      servo0+=5;
   if(!whichway)
      servo0-=5;

   //When 90 degrees or 0 degrees is reached, switch direction
   if(servo0 <= 0xF82F ){
      whichway = 1;
      round++;
   }
   if(servo0 >= 0xFC17){
      whichway = 0;
      round++;
   }

/*

End Direction Control

*/

/*

Begin Radar Directional Lighting Control

*/

//If 120 < servo0 < 130
if(servo0 > 0xF8A7 && servo0 < 0xF8B1)
{
   if(whichway == 0)
      radar_direction = 0;
   if(whichway == 1)
      radar_direction = 1;
}

//If 370 < servo0 < 380
if(servo0 > 0xF9A1 && servo0 < 0xF9AB)
{
   if(whichway == 0)
      radar_direction = 1;
   if(whichway == 1)
      radar_direction = 2;
}

//If 620 < servo0 < 630
if(servo0 > 0xFA9B && servo0 < 0xFAA5)
{
   if(whichway == 0)
      radar_direction = 2;
   if(whichway == 1)
      radar_direction = 3;
}

//If 870 < servo0 < 880
if(servo0 > 0xFB95 && servo0 < 0xFB9F)
{
   if(whichway == 0)
      radar_direction = 3;
   if(whichway == 1)
      radar_direction = 4;
}
   
/*

End Radar Directional Lighting Control

*/

        }
    INTCONbits.GIE = 1;                                //re-enable all interrupts
}

int Ir_Data_Eval(int ir_data, int isCHIP0)
{
   //   @ 70cm+
if(ir_data > 0x171 && ir_data <= 0x19E){
   if(isCHIP0)
      return 0xC0;
   else
      return 0x40;
}
   //   @ 60cm+
else if(ir_data > 0x19E && ir_data <= 0x1C3 ){
   if(isCHIP0)
      return 0xA0;
   else
      return 0x20;
}
   //   @ 50cm+
else if(ir_data > 0x1C3 && ir_data <= 0x1EB ){
   if(isCHIP0)
      return 0x90;
   else
      return 0x10;
}

   //   @ 40cm+
else if(ir_data > 0x1EB && ir_data <= 0x20D ){
   if(isCHIP0)
      return 0x88;
   else
      return 0x08;
}

   //   @ 30cm+
else if(ir_data > 0x20D && ir_data <= 0x262 ){
   if(isCHIP0)
      return 0x84;
   else
      return 0x04;
}

   //   @ 20cm+
else if(ir_data > 0x262 && ir_data <= 0x2C6 ){
   if(isCHIP0)
      return 0x82;
   else
      return 0x02;
}

   //   @ 10cm+
else if(ir_data > 0x2DA){
   if(isCHIP0)
      return 0x81;
   else
      return 0x01;
}
   //If chip 0 make sure to turn on the very first led
if(isCHIP0)
   return 0x80;

return 0x00;
}