Haberler:

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

Ana Menü

CCS C alıştırma Turlarım

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

Mucit23

#75
Ekranın yarısının parlaklığının az olmasını çözdüm.

Ancak logic analyser vasıtasıyla sorunu anlayabildim. İlginç bir şekilde kesme içerisinde sanki birdaha kesme oluşması gibi bana bir algı bıraktı.

Kesme alt programı bu şekilde
#int_timer0
Void timer0_Kesme()
{
output_toggle(pin_a0);

switch (sayac)
{
case 0:
{
Output_high(Tpic_Enbl);  //tpic6B595 Çıkışlar Pasif
output_b(254);
Data_Gonder();
Output_low(Tpic_Enbl);  //tpic6B595 Çıkışlar Aktif
 sayac=1;
}
case 1:
{
Output_high(Tpic_Enbl);  //tpic6B595 Çıkışlar Pasif
output_b(253);
Data_Gonder();
Output_low(Tpic_Enbl);  //tpic6B595 Çıkışlar Aktif
sayac=2;
}
case 2:
{
Output_high(Tpic_Enbl);  //tpic6B595 Çıkışlar Pasif
output_b(251);
Data_Gonder();
Output_low(Tpic_Enbl);  //tpic6B595 Çıkışlar Aktif
sayac=3;
}
case 3:
{
Output_high(Tpic_Enbl);  //tpic6B595 Çıkışlar Pasif
output_b(247);
Data_Gonder();
Output_low(Tpic_Enbl);  //tpic6B595 Çıkışlar Aktif
sayac=4;
}
case 4:
{
Output_high(Tpic_Enbl);  //tpic6B595 Çıkışlar Pasif
output_b(239);
Data_Gonder();
Output_low(Tpic_Enbl);  //tpic6B595 Çıkışlar Aktif
sayac=5;
}
case 5:
{ 
Output_high(Tpic_Enbl);  //tpic6B595 Çıkışlar Pasif
output_b(223);
Data_Gonder();
Output_low(Tpic_Enbl);  //tpic6B595 Çıkışlar Aktif
sayac=6;
}
case 6:
{
Output_high(Tpic_Enbl);  //tpic6B595 Çıkışlar Pasif
output_b(191);
Data_Gonder();
Output_low(Tpic_Enbl);  //tpic6B595 Çıkışlar Aktif
sayac=7;
}
case 7:
{
Output_high(Tpic_Enbl);  //tpic6B595 Çıkışlar Pasif
output_b(127);
Data_Gonder();
Output_low(Tpic_Enbl);  //tpic6B595 Çıkışlar Aktif
sayac=0;
}
}
set_timer0(99);
}


Basicde kesme içerisinde tekrar kesme oluşmamasıiçin kesme etiketinden önce kesmeleri kapatıyorduk. Acaba CCS de demi bu durum geçerli yoksa kendisi yapıyormu? Belkide bu sebebten dolayı kesme tutarsız çalışıyor

----------------------------------------

Ayrıca ufak bir sorumdaha olacak. Dikkate alırsanız sevinirim.

Bir değişkenin herhangi bir bitine başka bir 1 bit boyutundaki değişkeni yazmak istiyorum.

Örnek vereyim.

unsigned int8 data;
unsigned int1 y;

bu şekilde iki adet değişkenimiz olsun
Data değişkenin herhangi bir bitine y değişkenini yazmak istiyorum. Y bir ise data değişkenin ilgili biti 1 değilse 0 olacak.

Bu konuda bana bi ipucu verebilirmisiniz



sadogan

    Mucit23 
    bu kodu incele işini görmesi gerekir.
     unsigned int8 data=1,i,temp;
      int1 y=1;
      //  datanin kacinci bitine yazmak istiyorsak i ona esitleyelim
      // data degiskenin 5 ci bitine y yi yazalim
      temp=0x01;
     
      for(i=5;i>0;i--)temp<<=1;
      if(y) data|=temp;r
      else  data&=~temp;

Mucit23

#77
Sadogan Teşekkür ederim...

Ufak bir problemin daha var

CCS de mod almaya çalışıyorum
Onda=Sicaklik%10;
Bu şekilde bir kullanıma izin vermiyor. Doğrusu nasıl olmalı
Edit;
Çözdüm arkadaşlar. Değişken tipine hata veriyormuş..

Mucit23

Merhaba Arkadaşlar

Basicde menü yapmak kolay. Menü içerisinde döngüler oluşturuyorum. Program neredeyse orada dönüyor. C de durum nasıl. Bugün birkaç menü yapmaya çalışacağım.

Mesela Bir butona basınca alt bir fonksiyona yönelip orada işlemciyi döngüye sokup döngü içerisinde menü işlemlerini yapabiliyorum. Sanırım  bunun bir zararı olmuyor fakat menüden çıkmak istediğimde o sonsuz döngüden nasıl sıyrılacağımı bilmiyorum. Yine if ile başka bir fonksiyonamı atlanır.

Bana Basicdeki mantığın C deki karşılığını anlatacak olan varmı? c'de program yazarken basic mantığından arınmak istiyorum..

justice_for_all

'break' deyimi butun dongulerden cikmaya yarar.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

kantirici

Merhaba,
C de döngüden herhangi bir anda çıkmak, döngüyü kırmak için break komutunu kullanabilirsin. Etiket belirleyip goto komutuyla da atlama yapılabilir. Menü içinse alt bir fonksiyon oluşturup şart sağlanırsa o fonksiyonu çağırırsın.Bu durumda fonksiyon işlenir ve bitince program kaldıgı yerden devam eder.

void alt(){

.......
}

main(){
.........
if(sart) alt();
........
}

Mucit23

#81
Anladım.

Ozaman  break komutu döngünün dışına çıkarıyor. Şart ne olursa olsun.  Bir iki deneme yapalım bakalım. Mantığını anlamaya başladım.

mesaj birleştirme:: 22 Aralık 2012, 20:34:50

Bir sorum daha olacak

LCD de özel karakter tanımlaması yapmaya çalışıyorum. Benim gibi daha önce çok fazla kişi sormuş Herkezde iyi kötü cevap bulmuş.

Benim kullandığım kütüphane aşağıdaki gibi
//Buradaki ayar bendeki Deneme Kartina göredir, istenilirse baska Pinlere cevrilebilinir.
#define LCD_DB4   PIN_B4 
#define LCD_DB5   PIN_B5
#define LCD_DB6   PIN_B6 
#define LCD_DB7   PIN_B7 

#define LCD_E     PIN_B3
#define LCD_RS    PIN_B2 

//#define LCD_RW    PIN_B6 //Bendeki Deneme Kartinda LC_RW PIC'in GND Pinine bagli.Bu nedenle bu satiri iptal ediyoruz...
//#define USE_LCD_RW   1   // Ayni sebepden bu satirida iptal ediyoruz !!    

//======================================== 

#define lcd_type 2        // 0=5x7, 1=5x10, 2=2 lines 
#define lcd_line_two 0x40 // LCD RAM address for the 2nd line 


int8 const LCD_INIT_STRING[4] = 
{ 
 0x20 | (lcd_type << 2), // Func set: 4-bit, 2 lines, 5x8 dots 
 0xc,                    // Display on 
 1,                      // Clear display 
 6                       // Increment cursor 
 }; 
                              

//------------------------------------- 
void lcd_send_nibble(int8 nibble) 
{ 
// Note:  !! converts an integer expression 
// to a boolean (1 or 0). 
 output_bit(LCD_DB4, !!(nibble & 1)); 
 output_bit(LCD_DB5, !!(nibble & 2));  
 output_bit(LCD_DB6, !!(nibble & 4));    
 output_bit(LCD_DB7, !!(nibble & 8));    

 delay_cycles(1); 
 output_high(LCD_E); 
 delay_us(2); 
 output_low(LCD_E); 
} 

//----------------------------------- 
// This sub-routine is only called by lcd_read_byte(). 
// It's not a stand-alone routine.  For example, the 
// R/W signal is set high by lcd_read_byte() before 
// this routine is called.      

#ifdef USE_LCD_RW 
int8 lcd_read_nibble(void) 
{ 
int8 retval; 
// Create bit variables so that we can easily set 
// individual bits in the retval variable. 
#bit retval_0 = retval.0 
#bit retval_1 = retval.1 
#bit retval_2 = retval.2 
#bit retval_3 = retval.3 

retval = 0; 
    
output_high(LCD_E); 
delay_cycles(1); 

retval_0 = input(LCD_DB4); 
retval_1 = input(LCD_DB5); 
retval_2 = input(LCD_DB6); 
retval_3 = input(LCD_DB7); 
  
output_low(LCD_E); 
    
return(retval);    
}    
#endif 

//--------------------------------------- 
// Read a byte from the LCD and return it. 

#ifdef USE_LCD_RW 
int8 lcd_read_byte(void) 
{ 
int8 low; 
int8 high; 

output_high(LCD_RW); 
delay_cycles(1); 

high = lcd_read_nibble(); 

low = lcd_read_nibble(); 

return( (high<<4) | low); 
} 
#endif 

//---------------------------------------- 
// Send a byte to the LCD. 
void lcd_send_byte(int8 address, int8 n) 
{ 
output_low(LCD_RS); 

#ifdef USE_LCD_RW 
while(bit_test(lcd_read_byte(),7)) ; 
#else 
delay_us(60);  
#endif 

if(address) 
   output_high(LCD_RS); 
else 
   output_low(LCD_RS); 
      
 delay_cycles(1); 

#ifdef USE_LCD_RW 
output_low(LCD_RW); 
delay_cycles(1); 
#endif 

output_low(LCD_E); 

lcd_send_nibble(n >> 4); 
lcd_send_nibble(n & 0xf); 
} 

//---------------------------- 
void lcd_init(void) 
{ 
int8 i; 

output_low(LCD_RS); 

#ifdef USE_LCD_RW 
output_low(LCD_RW); 
#endif 

output_low(LCD_E); 

delay_ms(15); 

for(i=0 ;i < 3; i++) 
   { 
    lcd_send_nibble(0x03); 
    delay_ms(5); 
   } 

lcd_send_nibble(0x02); 

for(i=0; i < sizeof(LCD_INIT_STRING); i++) 
   { 
    lcd_send_byte(0, LCD_INIT_STRING[i]); 
    
    // If the R/W signal is not used, then 
    // the busy bit can't be polled.  One of 
    // the init commands takes longer than 
    // the hard-coded delay of 60 us, so in 
    // that case, lets just do a 5 ms delay 
    // after all four of them. 
    #ifndef USE_LCD_RW 
    delay_ms(5); 
    #endif 
   } 

} 

//---------------------------- 

void lcd_gotoxy(int8 x, int8 y) 
{ 
int8 address; 

if(y != 1) 
   address = lcd_line_two; 
else 
   address=0; 

address += x-1; 
lcd_send_byte(0, 0x80 | address); 
} 

//----------------------------- 
void lcd_putc(char c) 
{ 
 switch(c) 
   { 
    case '\f': 
      lcd_send_byte(0,1); 
      delay_ms(2); 
      break; 
    
    case '\n': 
       lcd_gotoxy(1,2); 
       break; 
    
    case '\b': 
       lcd_send_byte(0,0x10); 
       break; 
    
    default: 
       lcd_send_byte(1,c); 
       break; 
   } 
} 

//------------------------------ 
#ifdef USE_LCD_RW 
char lcd_getc(int8 x, int8 y) 
{ 
char value; 

lcd_gotoxy(x,y); 

// Wait until busy flag is low. 
while(bit_test(lcd_read_byte(),7));  

output_high(LCD_RS); 
value = lcd_read_byte(); 
output_low(lcd_RS); 

return(value); 
} 
#endif


Kütüphaneyi değiştirmeden lcd hafızasına nasıl karakterler yerleştirip kullanırım.

Mucit23

Bir sorum daha olacak. Bunu öğrenmem gerekiyor.

bir fonksiyona string göndermeye çalışıyorum
Şöyle bir fonksiyon tanımladım.

lcd_yaz(char c)
{
  printf(lcd_putc,c);
}

Ben bu fonksiyona lcd_yaz("ali  ayşe memet"); şeklinde gönderme yaptımmı aynı stringin içerideki fonksiyona ulaşmasını sağlamam lazım. Amacım fazla printf fonksiyonu kullanmamak.

Derlemeye çalıştığımda şöyle bir hata alıyorum..

picture sharing

Bunu nasıl yaparım. Nerde Hata yapıyorum.

justice_for_all

#83
eger lcd_yaz fonksiyonu herhangi bir deger dondermiyorsa (ki oyle olmasi gerek)

void lcd_yaz(char c)
{
  printf(lcd_putc,c);
}


olmasi gerek.


Not:en onemli detay ise fonksiyonu cagirmadan once tanimlamalisin veya fonksiyonu tanimlamadan once cagirmak zorundaysan once prototip olarak tanimlamak zorundasin.Yani

programin ust kismina

void lcd_yaz(char c);

tanimlamasini yapman gerek.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

Mucit23

Aslında hocam fonksiyona hata vermiyor. Fonksiyonu çağırdığım zaman resimdeki hatayı alıyorum.

lcd_yaz("Merhaba"); Şeklinde kullanıyorum. acaba kullanım hatasımı yapıyorum.

Birde değişken türü ile ilgili olabilirmi ?

justice_for_all

evet kullanim hatasi fonksiyon tanimini char olarak tanimlamissin ama cagirirken string deger vermissin.

lcd_yaz('M');
olarak verebilirsin.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

Mucit23

pek hocam string göndermek için ne yapmak gerekir


justice_for_all

char deneme[]={"MERHABA"};
void lcd_yaz(char* c)
{
  printf(lcd_putc,c);
}

lcd_yaz(&deneme);


dersen olmasi gerek.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

Mucit23

Yok hocam buda işe yaramadı. Dediklerinizi harfiyen uyguladım..