CCS C to PIC basic ??

Başlatan 122055221, 16 Ekim 2009, 13:59:19

122055221

Arkadaşlar CCS C' ye yabancı olduğum için, aşağıdaki programı Pic BasicPro ya dönüştürmek için yardım edebilirmisiniz. Şimdiden teşekkürler....

#include <16F84A.h>
#fuses NOWDT,HS, NOPUT, NOPROTECT
#use delay(clock=10000000)
#use rs232(baud=19200, xmit=PIN_A2, rcv=PIN_A3)
//#use i2c(master,sda=PIN_C7,scl=PIN_C6,FORCE_HW)
#use i2c(master,sda=PIN_A1,scl=PIN_A0,SLOW)
#define GREEN_LED PIN_B2
#define TRIGGER PIN_B3



BYTE wait_response(void);
BYTE read_response(BYTE *response);
BYTE get_token(void);
BYTE start_read(void);


void main()
{

     BYTE buffer[22];
     BYTE token;

     while(1)
     {

        /*
        while(1)
        {
        output_high(GREEN_LED);
        delay_ms(500);
        output_low(GREEN_LED);
        delay_ms(500);
        }
        */
       
        output_high(GREEN_LED);
        delay_ms(500);
       


        //Read Token - We expect 0x6A or 0x6B
        printf("Read Token:");
        token=get_token();
        printf("%X",token);
        printf("\n \r");




        printf("%X",token);
        printf("\n \r");


        //Start Read
        printf("Starting Read:");

        token=start_read();

        printf("%X",token);
        printf("\n \r");


        //Wait until we get 0x6E token
        printf("Waiting Tag \n \r");
        while(token!=0x6E)
        {
        token=get_token();
        printf("%X",token);
        printf("\n \r");
        delay_ms(500);
        }



        //Now we have 0x6E token. A tag was read . We will request data
        output_high(TRIGGER);
        delay_ms(1000);
        delay_ms(1000);
        delay_ms(1000);

        printf("A Tag was read! \n \r");

        i2c_start();
        i2c_write(0x82);
        i2c_write('R');
        i2c_stop();

        i2c_start();
        i2c_write(0x83);     //0x41h<<1 = 0x82 | 1  = 0x83 (READ )
        buffer[0]=i2c_read();
        buffer[1]=i2c_read();
        buffer[2]=i2c_read();
        buffer[3]=i2c_read();
        buffer[4]=i2c_read(0);
        i2c_stop();

        printf("%X",buffer[0]);
        printf("%X",buffer[1]);
        printf("%X",buffer[2]);
        printf("%X",buffer[3]);
        printf("%X",buffer[4]);
        printf("\n \r");


        i2c_start();
        i2c_write(0x83);     //0x41h<<1 = 0x82 | 1  = 0x83 (READ )
        buffer[0]=i2c_read();
        buffer[1]=i2c_read();
        buffer[2]=i2c_read();
        buffer[3]=i2c_read();
        buffer[4]=i2c_read(0);
        i2c_stop();

        printf("%X",buffer[0]);
        printf("%X",buffer[1]);
        printf("%X",buffer[2]);
        printf("%X",buffer[3]);
        printf("%X",buffer[4]);
        printf("\n \r");


        output_low(TRIGGER);








        output_low(GREEN_LED);
        delay_ms(500);




    }


}

BYTE get_token(void)
{
BYTE tk;

        tk=0;

        i2c_start();
        i2c_write(0x83);     //0x41h<<1 = 0x82 | 1  = 0x83 (READ )
        tk=i2c_read(0);      //NACK before Stop.
        i2c_stop();

        return tk;

}


BYTE start_read(void)
{
BYTE tk;

        i2c_start();
        i2c_write(0x82);     //0x41h<<1 = 0x82 | 0  = 0x82 (WRITE )
        i2c_write(0x10);     //Read Command
        i2c_write(0x03);     //EM4100
        i2c_write(0x02);     //Read two Blocks ( 2 x 4Byte)
        i2c_write(0x00);     //Null
        i2c_write(0x00);     //Null
        i2c_write(0x00);     //Null
        i2c_write(0x00);     //Null
        i2c_write(0x15);     //Checksum 0x10 + 0x03 + 0x02 + 0x00 .... 0x00
        i2c_stop();


        //Read Token - We expect 0x6B (Read is Active). If we read 0x88(busy) token, then make a new read until we dont get 0x88 token.
        tk=0x88;
        while(tk==0x88)
        {
           tk=get_token();

          //Good to put some delay
           delay_ms(1);

        }

        return tk;



}

Okan AKÇA

slm yanlış yerden başlmışsınız kod degistirme diye bir şeyyok tur sadece aynı mantıkda claısan kod yazabilirsiniz

koordinat

bu isteğiniz herhalde amatör yardımdan sapıyor

122055221

Benim kastettiğim öyle bişey değildi zaten, Ben Pic BasicPro dilini biliyorum, CCS diline yabancıyım. Bu iki dili bilen bir arkadaş bu programı picbasic pro için yorumlayabilir mi acaba....

122055221

Alıntı yapılan: "koordinat"bu isteğiniz herhalde amatör yardımdan sapıyor


Nedemek istediğinizi anlayamadım ama bu kodlar pek profesyonel olmasa gerek. İncelerseniz amatörce bir I2C veri transferiyle ilgili bir program.

koordinat

i2c protokolünü biliyormusunuz.ben şahsen kullanmadım ama programın neresinde takıldıysanız açıklamaya çalışayım

122055221

Dediğim gibi CCS ye yabancı olduğumdan, programı tam anlamıyla analiz edemiyorum. Bana genel olarak programın başından sonuna gelene kadar ne yapılmış açıklayabilirmisiniz. Bende bu sayede basicpro ya çevirebilirim. Teşekkürler....

122055221

BYTE wait_response(void);
BYTE read_response(BYTE *response);
BYTE get_token(void);
BYTE start_read(void);

Birde burayı anlamadım. Bu değişkenler nasıl değişken

koordinat

Alıntı yapılan: "122055221"
#include <16F84A.h>
#fuses NOWDT,HS, NOPUT, NOPROTECT
#use delay(clock=10000000)
#use rs232(baud=19200, xmit=PIN_A2, rcv=PIN_A3)
//#use i2c(master,sda=PIN_C7,scl=PIN_C6,FORCE_HW)
#use i2c(master,sda=PIN_A1,scl=PIN_A0,SLOW)  //veri sda dır,scl //clocktur
#define GREEN_LED PIN_B2  
#define TRIGGER PIN_B3



BYTE wait_response(void);           //değişkenler
BYTE read_response(BYTE *response);
BYTE get_token(void);
BYTE start_read(void);


void main()
{

     BYTE buffer[22];    //dizi tanımlanıyor 22 elemanlık
     BYTE token;

     while(1)
     {

        /*
        while(1)                                     //burası silinmiş
        {
        output_high(GREEN_LED);
        delay_ms(500);
        output_low(GREEN_LED);
        delay_ms(500);
        }
        */
       
        output_high(GREEN_LED);     //yeşil ledi yaktık
        delay_ms(500);                    //0.5sn bekledik
       


        //Read Token - We expect 0x6A or 0x6B
        printf("Read Token:");        //seri iletişimle token ı oku yazdırıyoruz
        token=get_token();         //get_token fonks.??nerede anlamadım
        printf("%X",token);         //yazdırmaya devam
        printf("\n \r");




        printf("%X",token);         //yazdırma rs232ye
        printf("\n \r");


        //Start Read
        printf("Starting Read:");        //okumaya başlıyoruz

        token=start_read();            //fonks.çağırılıo

        printf("%X",token);          
        printf("\n \r");


        //Wait until we get 0x6E token
        printf("Waiting Tag \n \r");
        while(token!=0x6E)           //token0x6e olmadığı sürece
        {
        token=get_token();        //çağır bakalım
        printf("%X",token);
        printf("\n \r");              //yazdır
        delay_ms(500);          //beklet
        }



        //Now we have 0x6E token. A tag was read . We will request data
        output_high(TRIGGER);    //tetikleme pinini lojik1 yap
        delay_ms(1000);
        delay_ms(1000);   //beklee 1sn her seferde
        delay_ms(1000);

        printf("A Tag was read! \n \r");

        i2c_start();            //i2c haberleşmesi hazır kütüphanesini çağırdı
        i2c_write(0x82);   //0x82 gönderdi
        i2c_write('R');        //yazdı
        i2c_stop();            //durdurdu

        i2c_start();
        i2c_write(0x83);     //0x41h<<1 = 0x82 | 1  = 0x83 (READ )
        buffer[0]=i2c_read();
        buffer[1]=i2c_read();
        buffer[2]=i2c_read();
        buffer[3]=i2c_read();
        buffer[4]=i2c_read(0);
        i2c_stop();

        printf("%X",buffer[0]);
        printf("%X",buffer[1]);
        printf("%X",buffer[2]);
        printf("%X",buffer[3]);
        printf("%X",buffer[4]);
        printf("\n \r");


        i2c_start();
        i2c_write(0x83);     //0x41h<<1 = 0x82 | 1  = 0x83 (READ )
        buffer[0]=i2c_read();
        buffer[1]=i2c_read();
        buffer[2]=i2c_read();
        buffer[3]=i2c_read();
        buffer[4]=i2c_read(0);
        i2c_stop();

        printf("%X",buffer[0]);
        printf("%X",buffer[1]);
        printf("%X",buffer[2]);
        printf("%X",buffer[3]);
        printf("%X",buffer[4]);
        printf("\n \r");


        output_low(TRIGGER);   //tetik sinyalini lojik 0 yaptı








        output_low(GREEN_LED); //yeşil ledi de
        delay_ms(500);




    }


}

BYTE get_token(void)
{
BYTE tk;

        tk=0;

        i2c_start();
        i2c_write(0x83);     //0x41h<<1 = 0x82 | 1  = 0x83 (READ )
        tk=i2c_read(0);      //NACK before Stop.
        i2c_stop();

        return tk;

}


BYTE start_read(void)
{
BYTE tk;

        i2c_start();
        i2c_write(0x82);     //0x41h<<1 = 0x82 | 0  = 0x82 (WRITE )
        i2c_write(0x10);     //Read Command
        i2c_write(0x03);     //EM4100
        i2c_write(0x02);     //Read two Blocks ( 2 x 4Byte)
        i2c_write(0x00);     //Null
        i2c_write(0x00);     //Null
        i2c_write(0x00);     //Null
        i2c_write(0x00);     //Null
        i2c_write(0x15);     //Checksum 0x10 + 0x03 + 0x02 + 0x00 .... 0x00
        i2c_stop();


        //Read Token - We expect 0x6B (Read is Active). If we read 0x88(busy) token, then make a new read until we dont get 0x88 token.
   //biz 0x6b (okuma aktif )jetonu bekiyoruz.ama 0x88(meşgul)jetonu gelirse taki okuma akitf olana kadar yeni okuma yapıyoruz
        tk=0x88;
        while(tk==0x88)
        {
           tk=get_token();

          //Good to put some delay
           delay_ms(1);

        }

        return tk;



}

koordinat

bence program eksik.eksiksiz olduğuna emin misiniz?bazı fonksiyonlar gözükmüyor