Merhaba CC5X ile ilgilenenler bilir, CC5X ile gelen pek kütüphane yok gibi. sadece birkaç matematik kütüphane ile geliyor o kadar.
En basitinden, PIC'in eeprom'una bisay yazacaksiniz, gidip datasheet'i karistirip assembler kodunu aynen C de yaziyorsunuz. Eger böyle ufak fonksyonlari bir araya getirebilirsek, bir kütüphane olusturabiliriz. CCS'in built-in fonksyonlarinin open-source hali gibi. Tartismasiz CC5X PIC(16) için en iyi compiler olur.
Su an aklima gelen fonksyonlar: Eepromayaz(..,..),Eepromdanoku(...), Flashayaz(..), Lcdinit(..), Lcdgönder(..), PWMayarla(..,..) ,vs....
Belki daha sonra bu kütüphane PIC Library projesinin bir parçasi olur.
Bu compiler için yazilmis fonksyonlar diger C compilerlari ile de çalisir, birkaç include yapilirsa tabii.
örnek olarak ilk kodu veriyorum (Daha önce baska yerde vermistim). Umarim gerisi gelir, insanlar katilir.
//**********************************************************************
//EEprom'a yazma proseduru : 8 bitlik degiskeni belirtilen adrese yazar
//**********************************************************************
void Eeproma_yaz(uns8 sayi,uns8 adres){
while(WR==1);// EEPROM'a yazilimadigini kontrol et, bitmesini bekle
//sayiyi adrese yaz
EEADR=adres; //yazilacak adres seçilir
EEDATA=sayi; // yazilacak veri yazmaça girilir
/*EEPROM'a yazmak için yapilmasi gereken kod. bkz. sayfa 35
(16F87x datasheet)*/
EEPGD=0;
WREN=1; //Yazmaya basla
GIE=0; //Burda interruptlar kapatiliyor
EECON2=0x55;
EECON2=0xAA;
WR=1;
GIE=1; //Interruptlar tekrar açilir
WREN=0;
}
İ2c için örnek teşkil edebilecek kodlarıda ben ekde veriyim.
Bu kodlar için epey deneme yanılma çalışması yapmak zorunda kaldım.
Aşağıdaki kodları Atmel 24C32 tipi bir hafıza biriminde çalıştırdım.
#define I2C_EE_WRITE 0b10100000
#define I2C_EE_READ 0b10100001
void i2c_init(void)
{
SSPSTAT = 0;// Cleared all status bits
SMP = 0;// Disable slew rate control
SSPADD = 0x0B;// 400kHz
SSPCON = 0;// Cleared all Configuration bits
SSPEN = 1;// Enabled serial port
SSPM3 = 1;// I2C Master with Fosc based clock
SSPCON2 = 0;
PORTC = 0b.0000.0000;
TRISC = 0b.0001.1000;
}
void i2c_write(uns16 eeadr,uns8 data)
{
SSPIF = 0;
SEN = 1;
while (SEN);// Start Condition Ok!
SSPIF = 0;
SSPBUF = I2C_EE_WRITE;// Write condition
while (ACKSTAT);// Is received?
while (!SSPIF);
SSPIF = 0;
SSPBUF = eeadr.high8;
while (!SSPIF);
ACKDT = 1;
SSPIF = 0;
SSPBUF = eeadr.low8;
while (!SSPIF);
SSPIF = 0;
SSPBUF = data;
// while (ACKSTAT);// Is received?
while (!SSPIF);
ACKEN = 1;
SSPIF = 0;
while (ACKEN);
while (!SSPIF);
SSPIF = 0;
PEN = 1;
while (PEN);
while (!SSPIF);
ACKDT = 0;
}
uns8 i2c_read(uns16 eeadr)
{
uns8 ee_data;
SSPIF = 0;
SEN = 1;
while (SEN);// Start Condition Ok!
SSPIF = 0;
SSPBUF = I2C_EE_WRITE;// Write condition
while (ACKSTAT);// Is received?
while (!SSPIF);
SSPIF = 0;
SSPBUF = eeadr.high8;
while (!SSPIF);
SSPIF = 0;
SSPBUF = eeadr.low8;
while (!SSPIF);
SSPIF = 0;
RSEN = 1;
while (RSEN);// Start Condition Ok!
SSPIF = 0;
SSPBUF = I2C_EE_READ;// Write condition
while (ACKSTAT);// Is received?
while (!SSPIF);
SSPIF = 0;
ACKDT = 1;
RCEN = 1;
while (RCEN);
SSPIF = 0;
ee_data = SSPBUF;
while (ACKSTAT);// Is received?
ACKEN = 1;
SSPIF = 0;
while (ACKEN);
while (!SSPIF);
PEN = 1;
SSPIF = 0;
while (PEN);
while (!SSPIF);
ACKDT = 0;
return ee_data;
}
uns8 i2c_readcurrent(void)
{
uns8 ec_data;
SSPIF = 0;
SEN = 1;
while (SEN);// Start Condition Ok!
SSPIF = 0;
SSPBUF = I2C_EE_READ;// Write condition
while (ACKSTAT);//
while (!SSPIF);
SSPIF = 0;
ACKDT = 1;
RCEN = 1;
while (RCEN);
SSPIF = 0;
ec_data = SSPBUF;
while (ACKSTAT);// Is received?
ACKEN = 1;
SSPIF = 0;
while (ACKEN);
while (!SSPIF);
PEN = 1;
SSPIF = 0;
while (PEN);
while (!SSPIF);
ACKDT = 0;
return ec_data;
}
CC5X ile Hi-tech kodunun uyumlulugu ne kadardir acaba?
http://www.microchipc.com/sourcecode
sitesindeki Hi-tech kodlarini CC5X ile kompil edersek çalisirmi? Ne degisiklikler yapmak gerek?
CC5X CCS den dahamı küçük kod üretiyor yani neden CC5X?
Alıntı yapılan: "CaFFeiNe"CC5X CCS den dahamı küçük kod üretiyor yani neden CC5X?
Evet CC5X cok daha kompakt kod uretiyor.
CCS kadar luks fonksiyonlari olmasa da byte lerin hesabini yapanlar icin ideal :)
CCS, C programlamasini bilen ve mikrodenetleyicinin yapisini iyi bilmeyen, kaynaklari optimal bir sekilde kullanmayanlar için ideal olabilir.
//--------------------------------------------------------------------
//////////////////////---PWM ÇIKIŞ İŞLEVLERİ---//////////////////////
//--------------------------------------------------------------------
void PWMayar()
{
TRISC=0xF0;
PORTC=0x00;
//Not: 1Mhz için:
//PWM period = (PR2 + 1)*4 * Tosc* TMR2 prescalar
//16.384 mS = 256 * 4 * 1uS * 16 -> 61Hz
//20 mS nominal
PR2=0XFF;
//PWM dutycyle = [CCPR1L:CCP1CON<4:5>]*Tosc*TMR2 prescalar
// 1500uS = 93 * 1uS * 16
//1.5mS için CCPR1L:CCP1CON<4:5> =93
CCP1CON.4=1; //
CCP1CON.5=1;
CCPR1L=255;
CCP2CON.4=1;
CCP2CON.5=1;
CCPR2L=255;
TRISC.2=0;
TRISC.1=0;
T2CON = 0b.0000.0111; //POSTSCALE 1:1, TMR2 ON, PRESCALE 1:16
CCP1CON=0xFF; //PWM MODE
CCP2CON=0xFF; //PWM MODE
PSA=1;
PS0=1;
PS1=0;
PS2=1;
}
//--------------------------------------------------------------------
//Yukarıdaki fonksiyon ile pwm kullanabilmek için örnek kod
//--------------------------------------------------------------------
void setMotor(unsigned val1) //PWM Çıkışı -> PORTC.2
{
CCPR1L=val1;
}
Arkadaşlar cc5x de bir program yazdım derledim ve proteusta denedim çalışıyor ama pic 16f628 e atınca çalışmıyor sigortaları ayarlayamadım galiba ama onda sigortalar nasıl ayarlanıyor programa ne yazmam gerekiyor kendi içindeki osilatörü kullanmak istiyorum şimdiden çok teşekkür ederim yardımlarınızı bekliyorum iyi çalışmalar