CCS C alıştırma Turlarım

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

NBR07

arkadaşlar pekı pwm ile pek bilgim yok
bir ledi veya mosfetlrr sürüecem ledleri mesela yakıp söndürmek istiyorum
yani ledler tam sönmeden bidaha yanmaya başlıyacak
0-100 desek tam yanma ve sönme zamanına ben ledleri
2ile 98 arasında yanıp sönmesini sağlamak istesem?

rooest

Doğru anladım mı bilmiyorum fakat  bir ledin şiddetini  zamanla  arttırıp  azaltmaksa  istediğin,  bunu  PWM'in 
doluluk oranını  değiştirerek  yapabilirsin. Tabii öncesinde  PWM  ile ilgili  biraz  alıştırma  yapman  gerekebilir.

Mucit23

Arkadaşlar Merhaba..

Göstericilerle başım dertte.

Text Basan bir fonksiyon yazmaya çalışıyorum. Yarım yamalak fonksiyonu yazdım ve yazdığım kadarıylada doğru bir şekilde çalışıyor. Sorunum şudur.

Fonksiyonun içerisine char dizisi gönderemiyorum. Kullandığım yapı bu şekilde

void PutText       (unsigned int x, unsigned int y, char *c, int1 fill);


void PutText(unsigned int x, unsigned int y, char *c, int1 fill){
unsigned int a=0,b=0,temp=0;
unsigned int cdata=0;

   while (*c!='\0')
   {
     temp=*c-32;
     for(b=0;b<5;b++)
     {
       cdata=Font1[temp][b];
       for(a=0;a<8;a++)
       {
          PutPixel(x+b,y+a,(cdata>>a) & 0x01);
       }
     }
     *c++;
   }
}


Kullanımıda bu şekilde

PutText(0,0,*"Deneme",1);

İsiste yaptığım debug sonucunda Fonksiyonun içerisinde gönderdiğim dizinin gitmiyor. Sorun hakkında yardımınız ihtiyacım var.

Yukarıdaki PutText(0,0,*"Deneme",1); komutunda gönderdiğim "Deneme" şeklindeki char dizisinin başına *göstericisini kullanmasam ccs kabul etmiyor. Ya bunu yapacam Yada * yerine (char) şeklinde gönderdiğim dizinin cinsini belirteceğim. Bunun dışında hata veriyor.

Benim Sadece "Deneme" şeklindeki bir dizi yazmam oraya char şeklinde gitmiyormu?

Diğer bir sorum ise gösterici adresiyle ilgili.

Text basan bir fonksiyon yazdığımızda fonksiyonun içerisine string yerine stringin başlangıç adresini gösteren göstericiyimi göndermek gerekir. Bu şekilde fonksiyon içerisinde gösterici adresi arttırılarak adresteki char değerler alınabilir. Bu yeni aklıma geldi açıkçası dün akşam bayağı bir uğraştım ama bunu denemedim. İncelediğim örneklerde hep yukarıda verdiğim kodlara benzer bir yapı kullanılmış.

Yukarıda yaptığım örnekte nerede hata yapıyorum?

Mucit23

Arkadaşlar olabilecek bütün kombinasyonları  yaptım fakat çalıştıramadım. ccs de gosterici yapısını anlayamıyorum. Diger c derleyicilerinden farklı çalıştığını düşünmeye başladım.

Anlamıyorum pointer adresini arttıramıyorum. Bana gostericilerin nasıl çalıştığını anlatırsanız gerçekten sevinirim. Özellikle pointer adresi nasıl artırılır.  Char tipindeki gostericiye x inci adresten itibaren nasil nasıl string yüklenir. Bu string sıra ile nasıl alınır. Bunları öğrenmek istiyorum.

İnternette ccs ile ilgili bir dünya kaynak inceledim ama inanin hepsini denedim. 

rree

Aynı şekilde const türünde bir bilgi aktarmak istedim bende yapamadım . Konu açmıştım cevaplar c30 ile yapılmış.  Bilgigonder("Deneme")   şeklinde bir fonksiyon oluşturayım dedim nafile.
Kendisinin  puts() fonksiyonu var açık kaynak kodlarını bulamadım.

Mucit23

Yok Bu iş için özel bir program yaptım. Fonksionun içerisine giden değerleri lcd de yazıyorum. Sonuç yok

#include <main.h>

#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)

#include <lcd_driver.c>

void puts(char *s);

void main()
{

  set_tris_a(0x00);
  set_tris_b(0x00);
  set_tris_c(0x00);
  set_tris_d(0x00);
  output_a(0x00);
  output_b(0x00);
  output_c(0x00);
  output_d(0x00);
  
   setup_timer_3(T3_DISABLED | T3_DIV_BY_1);
   setup_adc(ADC_OFF);
   setup_ccp1(CCP_OFF);
   setup_ccp2(CCP_OFF);
   setup_spi(SPI_DISABLED);
   
   
   lcd_init();
   delay_Ms(200);
   printf(lcd_putc,"\f");
   lcd_gotoxy(1,1);
   printf(lcd_putc,"Pointer_test!");
   while(TRUE)
   {
     puts("ADFRSG");
   }

}

void puts(char *s)
{
   
   while(*s!='\0')
   {
      lcd_gotoxy(1,2);
      printf(lcd_putc,"%c",s);
      delay_ms(500);
      *s++;
   }

}


Şöyle bir kod yazdım.
Çalıştırınca A başlayı alfabetik olarak saymaya başlıyor. Anladığım şudur. *s++ komutu ile göstericinin içeriği değiştiriliyor. A dan başlamasının sebebi Gönderdiğim dizinin ilk karakterinin A olması. İlk Harf B olsa B den saymaya başlıyor. Göstericinin içeriği nasıl arttırılır anlamış oldum. Sorun şu ki gösterici adresini artıramıyorum. Belki arttırıyorum ama içeriğini alamıyorum. Buralar tam bir keşmekeş şuanda benim için.

2006 da picproje ekibinin hazırlamış olduğu ccs kitabını inceliyorum. Oradaki anlatım çok güzel fakat anlatılanların doğru dürüst hiçbir tanesini gerçekte uygulayıp sonuç alamadım. Acaba ccs versiyonu ile ilgili bir sıkıntımı var?

Bu konuda tecrübesi olanlar yardımcı olursa çok iyi olur.

Konu dışında

Burada yapmak istediğimi printf ile yapamazmıyım? Amaç şu, dizideki karakterleri sıra ile bana versin. Vallahi başka hiç birşey istemiyorum..

rree

#141
Burada bir çözüm bulmunmuş ben anlamdım.
https://www.picproje.org/index.php?topic=26465.0

mesaj birleştirme:: 14 Temmuz 2013, 18:41:05

Pointeri ters kullanmışın sanki bende  c yi tam kavramış değilim.

Pointer adresini artırmak için  S++  yazmalısın

Değerini almak için *S kullanmalısın

rree

#142
#include <main.h>
 char veri[30];
 
void Verigonder(char   *Metin)
  {
    char i,*Metin2;
    Metin2=Metin;
    
    For (i=0;i<=29;i++)
     {
       veri[i]=*Metin2;
       Metin2++;
     }
   #asm
   nop
   #endasm
  
  }

void main()
{char Mdata[30];
  strcpy(Mdata,"Deneme");
   Verigonder(MData);
   
   while(TRUE)
   {
      //TODO: User Code
   }

}


strcpy ile birşeyler yapılabiliyor.

Mucit23

Aslında sorunu buldum.

Gostericiye bir string yazdığım zaman sadece 1. Karakter yazılıyor.  Sebebini bilmiyorum.  Ama ccs ye has birşey bu.

Sebebini bilen varmı?

ahmets

  printf(lcd_putc,"%c",s);
      delay_ms(500);
      *s++;


Burası hatalı, doğrusu
  printf(lcd_putc,"%c",*s);
      delay_ms(500);
      s++;


veya
  printf(lcd_putc,"%c",*s++);
      delay_ms(500);

olursa çalışabilir. Denemek için bende CCS C kurulu değil.

%c deyince bir karakter yaz demek. String için %s yazmalısın.
Bunların yerine sadece printf(lcd_putc,"%s",s); yazmayı dene.

Ruzgarbey

#145
merhaba hocam. bu c dilindeki pointer olayına ben takmıs durumdayım. kodu aşağıdaki şekilde denermisiniz lütfen.
#include <main.h>

#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)

#include <lcd_driver.c>

void puts(char *s);

void main()
{

  set_tris_a(0x00);
  set_tris_b(0x00);
  set_tris_c(0x00);
  set_tris_d(0x00);
  output_a(0x00);
  output_b(0x00);
  output_c(0x00);
  output_d(0x00);
  
   setup_timer_3(T3_DISABLED | T3_DIV_BY_1);
   setup_adc(ADC_OFF);
   setup_ccp1(CCP_OFF);
   setup_ccp2(CCP_OFF);
   setup_spi(SPI_DISABLED);
   
   
   lcd_init();
   delay_Ms(200);
   printf(lcd_putc,"\f");
   lcd_gotoxy(1,1);
   printf(lcd_putc,"Pointer_test!");
   while(TRUE)
   {
     puts("ADFRSG");
   }

}

void puts(char s)
{
  unsigned char *m;
  m=&s;
   while(s!='\0')
   {
      lcd_gotoxy(1,2);
      printf(lcd_putc,"%c",s);
      delay_ms(500);
      m++; s=*m;
   }


}

hocam kodunuzda *s++ ile, s pointerinin değerini artırıyorsunuz. yani değer 64 ise 65 artıyor, adresi artmıyor. kodunuz büyük ihtimal bundan dolayı çalışmıyor.deneyip sonucu yazarsnaız sevinirim. benim deneme şansım yok şu anda. kolay gelsin.
Hayatta En Hakiki Mürşid İlimdir. M.K. ATATÜRK

rree

#146
     Senin kodları biraz değiştirdim.

#include <16F628A.h>
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#use delay(crystal=20MHz)

//#use fast_io(a)
//#use fast_io(b)
#include <Lcd_Zafzaf.c>

//void putsx(char *s);

void putsx(char s)
{
  unsigned char *m;
  m=&s;
   while(s!='\0')
   {
      lcd_gotoxy(1,2);
      printf(lcd_putc,"%c",s);
      delay_ms(500);
      m++; s=*m;
   }
}


void main()
{
  
   setup_ccp1(CCP_OFF);
 //  setup_spi(SPI_DISABLED);
 
  
   lcd_init();
   delay_Ms(200);
   lcd_Putc("Usb Araniyor");
   putsx("Deneme");
   
   
   while(TRUE)
   {
     //puts("ADFRSG");
   }

}
  Proteus da denedim.  Ekrana D # e # n # ......... şeklinde lcd  ye yazdı.



mesaj birleştirme:: 14 Temmuz 2013, 23:42:16

   Nasıl oldu çalıştı const nasıl tanıdı anlamadım.
proteusda lcd ekranında  "Deneme" yazısını gördüm
#include <16F628A.h>
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#use delay(crystal=20MHz)

#include <Lcd_Zafzaf.c>



void Verigonder(char s)
{
  unsigned char *m;
  m=&s;

  lcd_Putc(*m);
  #asm
  nop
  #endasm
}

void main()
{
   setup_ccp1(CCP_OFF);
   lcd_init();
   delay_Ms(200);
   Verigonder("Deneme");
   
   while(TRUE) {  }

}

Mucit23


Mucit23

#148
Hocam bu kodlar çalıştı.

void Verigonder(char s)
{
  unsigned char *m;
  m=&s;

  lcd_Putc(*m);
  #asm
  nop
  #endasm
}

void main()
{
   setup_ccp1(CCP_OFF);
   lcd_init();
   delay_Ms(200);
   Verigonder("Deneme");
   
   while(TRUE) {  }

}


Bazı aklıma takılanlar var. Bu şekilde yapınca Diyelim  Fonksiyona DENEME Gönderdiğimizi varsayarsak Verigönder fonksiyonu her işleyişinde altı defa çağrılıyor ve her seferinde gönderdiğimiz string'in bir sonraki karakteri gönderiliyor. Örneğin "DENEME" 6 karakterli olduğu için Verigönder("DENEME") fonksiyonunu çağırdığımızda veri gönder fonksiyonda 6 adet döngü oluşuyor. ilk döngüde D harfi fonksiyona gidiyor, sonrakinde E harfi vs..  karakterler bitene kadar döngü oluşuyor.

Bu C'nin genel bir özelliğimi?

Bu şekilde olması benim işime gelmiyor aslında çünkü Ben diyelim gönderdiğimiz string'in Başlangıç adresini aldıktan sonra adresi arttırıp sonraki adreslerdeki karakterleri alamıyorum. Bu benim işime gelmiyor açıkçası. Amacım aslında budur.

Bu dediğim için iki gündür uğraşıyorum.  Bunu nasıl yapabilirim?

rree

#149
Yukarıdaki örnekle *m pointeri ile adresini zatten aldık. Burada  lcd_Putc fonksiyonu bizim değişkene string bir yapı gibi null değerini görene kadar gönderiyor.  *m pointeri tek tel adresini artırıp bir char değişkenine atama yapılabilir. Seri porta göndereceksek tek byt gönderen bir fonksiyon seçmeliyiz. 
putc (cdata)
putchar (cdata)
fputc(cdata, stream)
   Bu fonksiyonlardan biri bu işi görmesi gerekir.
  void Verigonder(char s)
{
  unsigned char *m;
  m=&s;  // Burada s adresini *m pointere gösterdik.
   
   while(*m!=0)    // sıfırı bulana kadar dön  
    {
        putc (*m);   // seri porta bir byte gönder 
        m++;         //*m pointerin adresini  her döngüde bir artırdım.
     }
    
}


Yada bir dizi yi eşleştirip dizi değerlerini tek tek alabilirsin.
   while döngüsü kullanmadan
  Döngü yerine tek tek  kendinde belirleyebilirsin.
   char x;
   x=*m    //x 'D' karekreini alır
   m=m+1;  // adresini bir artırdım örneğin
   x=*m   // x 'e' karekterini alır