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;
}
slm yanlış yerden başlmışsınız kod degistirme diye bir şeyyok tur sadece aynı mantıkda claısan kod yazabilirsiniz
bu isteğiniz herhalde amatör yardımdan sapıyor
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....
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.
i2c protokolünü biliyormusunuz.ben şahsen kullanmadım ama programın neresinde takıldıysanız açıklamaya çalışayım
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....
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
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;
}
bence program eksik.eksiksiz olduğuna emin misiniz?bazı fonksiyonlar gözükmüyor