CCS C alıştırma Turlarım

Başlatan Mucit23, 10 Şubat 2012, 15:29:51

pwm.c

hazır yeri gelmişken bir soruda ben sorayım.

CCS ile 8, 16 yada 32 bit birsayıyı desimal basamaklarına ayırmak için özel bir komut var mı?

basic ile DIG komutunu kullanarak kolayca yapabiliyoruz.
D1=Dig SAYI,2
D2=Dig SAYI,1
D3=Dig SAYI,0


CCS ile ancak hesaplama yaparak ayarıyabiliyorum. bunun için iki ayrı örnek kod var.

1. bu:
int SAYI[4];
int16 ADC1;


SAYI[0]=(ADC1/1000)%10; //BİNLER
SAYI[1]=(ADC1/100)%10;  //YÜZLER
SAYI[2]=(ADC1/10)%10;   //ONLAR
SAYI[3]= ADC1 %10;     //BİRLER


2. şu:
int   bir=0,on=0,yuz=0,bin=0;
int16 ADC1;

BIR=0;
ON=0;
YUZ=0;
BIN=0;
WHILE(ADC1>=1000)    {ADC1=ADC1-1000,     BIN      ++;}
WHILE(ADC1>=100)     {ADC1=ADC1-100,      YUZ      ++;}
WHILE(ADC1>=10)      {ADC1=ADC1-10,       ON       ++;}
WHILE(ADC1>=1)       {ADC1=ADC1-1,        BIR      ++;} 


basicdeki DIG komutuna benzer birşey yok mu?
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

Mucit23

Merhaba arkadaşlar.
boş vaktim oldukça CCC C ile ilgileniyorum çalışmalar yapıyorum. Ençokda ARM için C öğrenmek istiyorum. Fakat ben Biryandanda ARM ile uğraşmak istiyorum. Elimde MCBSTM32C board var.

image hosting png
Board üzerinde STM32F107VC Mikrodenetleyicisi var. TFT si felan duruyor. Ben bu boarda Keil ile gelen example yazılımlarını keilde derleyip Jtag üzerinden Keil UlinkMe yardımıyla yükleyip çalıştırabiliyorum. (Blink Vs okadar ilerlemedim daha :D ) Yapabildiğim sadece bu kadar.
Elimde hiç Ekitap vs yani kaynak yok. Mesela STM32F serisi işlemcilerde portlara nasıl erişilir. Giriş çıkışlar nasıl ayarlanır. Diğer tüm donanımlar ve keil üzerinde kullanımını öğrenebileceğim bildiğiniz bir e kitap varmıdır. 
Barış Samancının LPC2000 kitabı var. Mesela o kitapda çok güzel anlatılmış. Bilmediğim bir konu da şudur. Philips LPC işlemcilerinin komut yapısı ile ST işlemcilerinin komut yapısı aynımıdır. Yani ikiside ARM çekirdekli. Örnek veriyorum  İki işlemcidede X portunun X. bitine erişebilmek için kullanılacak komutlar iki işlemcide farklılık gösterirmi?

haydarpasamikro

Mikrodenetleyicinin Manual pdf dökümanını indirip okumaya başlayın. Ben de MCB1700 NXP LPC1768 mikro su için var. Manual i 800 sayfa:) hepsini okudum.
Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi

Mucit23

STM32F107  nin manuali 1096 sayfaymış :o Ben şimdilik örnek programlar üzerinde oynarayak idare edeyim.

pwm.c

C:\Keil\ARM\Examples\ST\*
burada bazı örnekler var. belki işine yarar.
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

Mucit23


Mucit23

Merhaba Arkadaşlar

CCS C de LCD komutlarını toplu bir halde bulabileceğim bir kaynak gösterebilirmisiniz.
Örneğin LCD bir değişken yazdırmak için, LCD yi silmek, kursörü taşıma vs gibi komutları bilmiyorum.

Bazı komutları öğrendim Aslında ama hane sayısı belli olmayan (int8,int16,int32,float vs..) bir sayıyı ekrana basamadım bir türlü.

serhat1990

Alıntı yapılan: Mucit23 - 24 Şubat 2012, 10:23:36
Merhaba arkadaşlar.
boş vaktim oldukça CCC C ile ilgileniyorum çalışmalar yapıyorum. Ençokda ARM için C öğrenmek istiyorum. Fakat ben Biryandanda ARM ile uğraşmak istiyorum. Elimde MCBSTM32C board var.

image hosting png
Board üzerinde STM32F107VC Mikrodenetleyicisi var. TFT si felan duruyor. Ben bu boarda Keil ile gelen example yazılımlarını keilde derleyip Jtag üzerinden Keil UlinkMe yardımıyla yükleyip çalıştırabiliyorum. (Blink Vs okadar ilerlemedim daha :D ) Yapabildiğim sadece bu kadar.
Elimde hiç Ekitap vs yani kaynak yok. Mesela STM32F serisi işlemcilerde portlara nasıl erişilir. Giriş çıkışlar nasıl ayarlanır. Diğer tüm donanımlar ve keil üzerinde kullanımını öğrenebileceğim bildiğiniz bir e kitap varmıdır. 
Barış Samancının LPC2000 kitabı var. Mesela o kitapda çok güzel anlatılmış. Bilmediğim bir konu da şudur. Philips LPC işlemcilerinin komut yapısı ile ST işlemcilerinin komut yapısı aynımıdır. Yani ikiside ARM çekirdekli. Örnek veriyorum  İki işlemcidede X portunun X. bitine erişebilmek için kullanılacak komutlar iki işlemcide farklılık gösterirmi?

Forumda Bülent Hoca'nın örneklerini inceleyebilirsin. Fikir sahibi olmanda yardımcı olur. Portlara erişmek için GPIOx-ODR , GPIOx-IDR gibi registerlar var.
Burayı incelersen yardımcı olabilir.--> http://www.keil.com/dd/docs/datashts/st/stm32f10xxx.pdf

Sayfa 138 ' den itibaren başlıyor portlarla ilgili kısım. Biraz incelersen çok yardımı olur.

CCS C kısmına gelecek olursak ,

lcd_gotoxy(2,1);printf(lcd_putc,"Deneme=%3f ",x);


buradaki lcd_gotoxy(a,b);  // burada a kısmı sütunu , b kısmı satırı belli eder. yukarıdaki örnekte 1.satır , 2.sütundan itibaren yazılmaya başlanır.
printf(lcd_putc,"Deneme=")  // burada " buraya yazılan mesaj direk olarak gözükür. ascII olarak "
printf(lcd_putc,"deger=%f",x)  //burada "deger=" sıkmı lcd'ye yazılır. Sonrasındaki %f kısmı ise sonra bir değişkenin float cinsinden yazılacağını gösterir.

Buradaki %f ,%d kısımlarını aşağıda açıklıyorum.

%d --> işaretli 8 bit tamsayı gösterir.
%c --> karakterleri gösterir.
%s --> string ifadeleri gösterir.
%f  --> ondalıklı sayıları gösterir.
%x --> hexadesimal 8 bit sayıları gösterir. Harfler küçük yazılır.
%X --> hexadesimal 8 bit sayıları gösterir. Harfler büyük yazılır.
%u --> 8 bit işaretsiz tam sayı gösterir.
%Ld --> 16bit ve 32bit işaretsiz tam sayı gösterir.
%Lu --> 16bit ve 32bit işaretli tam sayı gösterir.
%Lx --> hexadesimal 16bit ve 32bit sayıları gösterir.Harfler küçük yazılır.
%LX --> hexadesimal 16bit ve 32bit sayıları gösterir.Harfler Büyük yazılır.
...


Bu böyle devam eder gider :)

Bu tanımlamaları Serdar Hoca'nın kitabından aldım. İyi bir kaynak birçok sorunuzun cevabını bulabilirsiniz.

İyi çalışmalar dilerim...


Mucit23

Alıntı YapBuradaki %f ,%d kısımlarını aşağıda açıklıyorum.

%d --> işaretli 8 bit tamsayı gösterir.
%c --> karakterleri gösterir.
%s --> string ifadeleri gösterir.
%f  --> ondalıklı sayıları gösterir.
%x --> hexadesimal 8 bit sayıları gösterir. Harfler küçük yazılır.
%X --> hexadesimal 8 bit sayıları gösterir. Harfler büyük yazılır.
%u --> 8 bit işaretsiz tam sayı gösterir.
%Ld --> 16bit ve 32bit işaretsiz tam sayı gösterir.
%Lu --> 16bit ve 32bit işaretli tam sayı gösterir.
%Lx --> hexadesimal 16bit ve 32bit sayıları gösterir.Harfler küçük yazılır.
%LX --> hexadesimal 16bit ve 32bit sayıları gösterir.Harfler Büyük yazılır.

Teşekkür ederim aradığım buydu. Elim alışana kadar sürekli elimin  altında olması gerekiyor.

serhat1990

Sorun değil eğer ccs c öğrenmek istiyorsanız Serdar Çiçek CCS C ile Pic Programlama kitabını edinmenizi öneririm. Sadece örnek kod olarak değil birçok donanımıda anlatması nedeniyle güzel bir kitap.

İyi çalışmalar dilerim.

Mucit23

Arkadaşlar Merhaba

Ds18B20den okuduğum sıcaklık bilgisini 2 det byte tipi değişkene bölmek istiyorum. Sıcaklık bilgisi float tipi değişkende 27.2 gibi değerlerle geliyor. CCS de buna özel bir fonksiyon varmı. Yada nasıl yapabilim.

Aynı şekilde 2 adet byte tipi değişkeni nasıl tek bir 16 bitlik değişkende birleştireceğimide öğrenmek isterim. CCS de make komutları var. Bunlar ne işe yarıyor. Buna benzer bir kullanımı var gibi.

halilgalic

"mucit23"  ccs c de 18b20 nasıl okuyosun kütüpkanesi falan varmı?

serhat1990

Alıntı yapılan: Mucit23 - 13 Ağustos 2012, 17:06:29
Arkadaşlar Merhaba

Ds18B20den okuduğum sıcaklık bilgisini 2 det byte tipi değişkene bölmek istiyorum. Sıcaklık bilgisi float tipi değişkende 27.2 gibi değerlerle geliyor. CCS de buna özel bir fonksiyon varmı. Yada nasıl yapabilim.

Aynı şekilde 2 adet byte tipi değişkeni nasıl tek bir 16 bitlik değişkende birleştireceğimide öğrenmek isterim. CCS de make komutları var. Bunlar ne işe yarıyor. Buna benzer bir kullanımı var gibi.

Öncelikle şuna cevap vereyim .

2 adet 8 bitlik değişkeni 16 bit yapmak istiyorsun. Bu çok basit kağıt kalemle nasıl yapıyorsan öyle yapacaksın. Komutlarla uğraşmadığımdan bilmiyorum pek.

Örneğin x ve y adında 8 bit değişkenlerimiz olsun. Ve z adında 16 bitlik bir değişken olsun . x ve y değişkenlerini 16 bit yapıp z değişkenine atalım. x düşük değerlikli y büyük değerlikli 8 bit olsun.

unsigned char x,y;
unsigned long int z;

void islem(void)
{
   z=y<<8; // y değişkenini 8 bit sola öteleyerek z değişkenine yaz.
   z=z|x;    // x değişkenini z değişkeni ile veyalar.
}

yada şu şekildede yapabilirsin.

void islem(void)
{
   z=(y*256)+x;
}

Hatam varsa özür dilerim. CCS C de program yazmıyorum artık ufak tefek unutulmuşlar olabilir.

Diğer sorunu tam anlayamadım.



   

Mucit23

Birleştirme işi tamam. Anladım onu.

Diğer sorum ise şöyle söyleyebilirim. Bir adet float tipi değişken var. İçerisinde sıcaklık bilgisi var.  27.4,30.5 gibi Ben bu değeri iki adet byte tipi değişkende saklamak istiyorum. Benim aklıma şöyle bir yöntem geldi.

Sıcaklık değeri 27.1 olduğunu varsayarsak ben bu değeri 10 ile çarparsam 271 sayısını elde ederim.
Sonra bu sayıyı 10 a bölerim 27 sayısını birinci değişkene atarım.
virgülden sonraki haneyi ise Mod alarak bulurum. Örneğin 10'a bölümden kalanı alıp diğer değişkene yerleştiririm. Başka bir önerisi olan varmı?

muhittin_kaplan

virgülden kurtarır High ve Low byte olarak 2 bayt da saklarım
örnek
35.5*10=355
355=0000000001100011

Birletirme yi yukarda gördük zaten