Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

CC5X Kütüphanesi

Başlatan picusta, 31 Ekim 2005, 14:39:12

picusta

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;
}

Macera

İ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;
}
"Art without engineering is dreaming; engineering without art is calculating." -- Steven K. Roberts

picusta

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?

CaFFeiNe

CC5X CCS den dahamı küçük kod üretiyor yani neden CC5X?

Erol YILMAZ

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 :)

picusta

CCS, C programlamasini bilen ve mikrodenetleyicinin yapisini iyi bilmeyen, kaynaklari optimal bir sekilde kullanmayanlar için ideal olabilir.

nuwanda

//--------------------------------------------------------------------
//////////////////////---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;
}

chorckbey

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