CCS'de bir sürü sorun!!!!

Başlatan HEXF2, 08 Ekim 2005, 09:27:06

HEXF2

Beyler CCS ile programlamaya yeni başladım ve birçok sorun yaşıyorum.Yarım yamalak ingilizcem ile HELP dosyasından birşeyler öğrenmeye çalışıyorum ama bir çok sorun var.Ben daha evvel C dilini kullandım ve CCS'de bir çok fonksiyon aynı.Mesela C dilinde kullanıcı ile giriş çıkışta printf() getch() gibi komutlar var CCS'de de bu aynı ama rs232 için kullanılmış.Çözemediğim bir çok konunun yanında INTERRUPT
geliyor.Program kodlarını yazıyorum PROTEUS da deniyorum PIC'in register'larına bakıyorum INTCON ve OPTION gayet doğru kurulmuş fakat kesme oluşturamıyorum

   
#include  <16F84.h>
              
              #INT_EXT
             
                void ext_isr()
              {
                      output_high(PIN_A0);
              }
                
                void main()
               {
                      set_edge_ext(extenal,H_TO_L);
                      enable_interrupts(EXT_INT);
                      enable_interrupts(GLOBAL);

                      input_b(0x00);

               }


Birde ben CCS'de donanım yazmaçlarına nasıl müdahele edicem STATUS,CMCON,ADCON gibi

Bu kesme işlemini TIMER'lar içinde yapıyorum ama sonuç aynı yazmaçlar doğru kuruluyor ama kesme olmuyor yukarda yazdığım kodlar RB0/INT için arkadaşlar

HEXF2

orda kodlarla external yazacağıma yalnış yazmışım ama kodlarda doğru birde ext_int_edge yazacağıma yalnış yazmışım bunları dikkate almayın hata hala sürüyor

CaFFeiNe

bende ccs ile yeni yeni ilgilenmeye başladım C ilede bugüne kadar pek yakınlığım olmadı (birbirimizi pek sevmeyiz :))
neyse printf için filan RS232 kullanılmasının sebebi işlemcinin içinde ekran yok pcler gibi ama dış dünya ile RS232 üzerinden haberleşebilir diye olabilir.

#byte  PORTB = 0x06
#byte  STATUS = 0x03
#byte  INTCON =0x0b

#bit INTF = INTCON.1

gibi tanımlamalar yaparak özel yazmaçları kullanabilirsin

HEXF2

Evet dediklerinin hepsini dün tesadüf eseri kendi başıma çözdüm kesme olayını da hallettim fakat şimdi yeni sorunlar çıkıyor mesela

getch() komutunu bir türlü kullanamadım şöyle birşey yazdım ama olmadı kullanıcıdan bir seçenek girilmesi isteniyor klavyeden girilen yuş doğru ise onay veriliyor

   
#use rs232 (baud = 9600, xmit = PIN_C6,rcv = PIN_RC7)
               unsigned char x;

               void main ()
              {
                    printf("Lütfen herhangi bit tuşa basın\n\r");
                    x = getch();

                    if(x = 'Y')
                   {
                     printf("Doğru giriş yaptınız!!\n\r")
                    }
                     while(True);
               }


Yukardakaki basit bir örnek fakat klavyeden hengi tuşa basarsam basayım bir işlem gerçekleşmiyor.CCS sevdim ama birde türkçe dküman bulabilsem hoca sende yeni başlamışsın umarım yardımlaşırız :)

Ersin

printf("Doğru giriş yaptınız!!\n\r")
delay_ms(1000);
bu sekilde gorbilmen lazim
Tusa bastiktan sonra dogru giris yatiniz kismini hizli gecip tekrar lutfen bir tusa basiniz kismini LCD gosteriyo.
1s lik bir gecikme ile "Doğru giriş yaptınız" yazisini gorebilmen lazim

Erol YILMAZ

Alıntı yapılan: "swordman"printf("Doğru giriş yaptınız!!\n\r")
delay_ms(1000);
bu sekilde gorbilmen lazim
Tusa bastiktan sonra dogru giris yatiniz kismini hizli gecip tekrar lutfen bir tusa basiniz kismini LCD gosteriyo.
1s lik bir gecikme ile "Doğru giriş yaptınız" yazisini gorebilmen lazim

Dogru giris yapsa zaten while(True);  fonksiyonuna takilacak,
Bir daha hicbir yere kimildayamayacak.

Bu arada dogru giris yapamiyor olmayasin?   :)

Erkan Gench

c de en çok yapılan hatalardan birine düşmüşsünüz

if (x='Y') değil if (x=='Y')

olacak. başka hatalarda olabilir incelemedim programı henüz.


evet tekrar bakınca başka bir hata buldum. programı bu şekilde çalıştırırsanız program getch satırına varınca bir tuşa basılmasını bekler fakat tuşa basıldıktan sonra eğer yanlış tuş ise hiç bir şey yapmadan kilitlenir. (while(true) satırında)

void main () 
              { 
                    while(1)
                    {
                       printf("Lütfen herhangi bit tuşa basın\n\r"); 
                       x = getch(); 

                       if(x == 'Y') 
                      { 
                           printf("Doğru giriş yaptınız!!\n\r") 
                       } 
                    } 
               }

şeklinde çalışması lazım

ayrıca rcv = PIN_RC7 değil rcv = PIN_C7 olacak
Zorluklar, zamanında yapmamız gerekip de yapmadığımız kolay şeylerin birikmesiyle oluşur. Henry Ford ----------- Ya Rabbi Filistin'deki ve dünyanın her tarafındaki Müslüman kardeşlerime yardım et.

HEXF2

Dostum dediklerini uygulayıp haber vericem fakat CCS'de sorun bitmiyor
programıma LCD.c dosyasını eklediğimde yani CCS kütüphanesinde bulunan dosyayı eklediğimde derleme esnasında sürekli hata mesajı alıyorum hemde kendi kütüphane dosyasında hata veriyor

Lcd_init();
Lcd_gotoxy(1,1);

Lcd_putc("\fselam"); gibi birşey yazdım benim programda hata vermiyor ama eklediğim kütüphane dosyasında bir satırda (o satır delay_cycle(1))hata veriyor ya gıcık oldum her yerde bir sorun çıkıyor adam gibi birşey yazamadım ya

Bu arada @Erkan Gench çok sağol hoca yalnız ben oraya yalnış yazmışım yani programda RC7 değil PIN_C7 ama dediklerini bugün hemen deneyim yazıcam buraya

Erol YILMAZ

@HEXF2,
Her programlama dilinin, her derleyicinin kendine göre bir huyu-suyu var. CCS bahsettiğin kadar aşikar hatalar içeren bir derleyici değil.
Hataları var muhakkak ama o kadar değil. Tahminimce C'ye yeni geçiş yapıyorsun. Yani C dili ile ilgili daha ok kaynak okuman gerekiyor. CCS dersen onun da örnekleri var. Help'i gayet iyi.
Başarılar...

HEXF2

Her programın kendine göre huyu suyu olduğunu bende biliyorum ve bayağı uzun bir zamandır visual basıc kullanıyorum C dilinide kullandım ama çok detaylı değil PIC programlama olayım ise o da bayağı eski ama onuda hep PBP ve ASM ile programladım C 'ye geçiş nedenim ise hızlı oluşu,herşeyi komutla yapacağına donanım modüllerini kullanması ve daha birçok avantajı var.Ama benmi yalnışlık yapıyorum nedir bayağı biryerde hata ile karşılaşıyorum.Hem topic başlığı ile düşüncemi karıştırma @Erol ben CCS'de bir sürü sorun var demedim CCS'de bir sürü sorunla karşılaşıyorum dedim ikisi aynı şey değil.

Bu arada @Erkan Gench getch() olayını hallettim tek yaptığım yalnış PORTC'yi yapılandırmayı unutmammış.Fakat bu LCD olayını hala çözemedim;

            #include  <16F877.h>
             #include  <Lcd.c>
             #use delay(clock = 4000000)
             #fuses NOWDT,XT,NOPROTECT


               void main()
             {
                    Lcd_init();                    //LCD'yi yapılandır
                    Lcd_gotoxy(1,1);          //Kursörü konumlandır
                    Lcd_putc("\fHEXF2");    //Mesajı yaz

                    while(true);                 //Sonsuz döngü
              }
                    


İşte yazdığım program bu ama derleme sırasında Lcd.c dosyasında delay_us(1) yazan satırda hata veriyor yani problem Lcd.c dosyasında

CaFFeiNe

#include  <16F877.h> 
#use delay(clock = 4000000) 
#include  <Lcd.c> 
#fuses NOWDT,XT,NOPROTECT 

void main() 
{ 
   Lcd_init();               //LCD'yi yapılandır 
   Lcd_gotoxy(1,1);          //Kursörü konumlandır 
   Lcd_putc("\fHEXF2");      //Mesajı yaz 
   while(true);              //Sonsuz döngü 
}


HEXF2 arkadaşım C dili böyle işte bayağı dikkat gerektiriyor dikat edersen #use delay satırını #include lcd satırının önüne getirdim problem çözüldü çünkü lcd.c dosyasındaki delay komutu 1us bekleme için nasıl asm komutları kullanması gerektiğini bilmiyor çünkü saat frekansını daha derleyiciye bildirmemişsin :)
ama zevkli bişiy gibi geldi bu C bana korkmama rağmen

mcan

kesmeyi nasıl halletin düzeltilmiş halini yazarsan sevinirim

HEXF2

Evet abi ya ne sinek küçük ama mide bulandırıyor ama bu topic'i açtığım çok iyi oldu sanırım bende diğer arkadaşlarda CCS dilini öğrenmeye başladık şimdi kızmazsanız birkaç sorum daha olacak biri timer'lar ile ilgili diğeri ise I2C ile ilgili aslında I2C ile örnek bir yazma okuma programı işimi görür ama timer0'da olay şöyle program kodlarında bir yalnışlık yok bu sefer ama ben timer0'ı 0'dan daha büyük bir sayıdan başlatıyorum prescale değerini ise DIV_8 yapıyorum yani 1:8 yapıyorum bu işleme göre 256-[Gecikme süresi x Fosc] / Prescale x 4 formülünden hesapladığım gibi tam 1000us yani 1ms kesmeler üretmem gerekiyor daha sonra kesme alt programına gittiğimde bir sayaç ile bu 1ms sayıyor ve bu sayaç 1000 olduğunda 1sn geçtiğini anlıyorum ve ekrana bir saniye oldu diye mesaj yazdırıyorum fakat neden hesaplamalr doğru da olsa o bir saniye hiç oluşmuyor yani 5 saniyede yada ne biliyim daha uzun bir süre sonra ekranda mesajı alıyorum yani elinde böyle CCS'in tüm özellikleri ile alakalı örenek kod olan varsa sanırım inceleyerek daha kolay öğrenirim mesala I2C ile seri eeproma veri yazıp okuyan,işte compare/capture/PWM ile ilgili örnek kod ve diğerleri tabi çok iyi olur.

Bu arada RB0 ile ilgili kodlarI özeline yollarım dostum

CaFFeiNe

kendi içerisinde bissürü örnek program var examples klasöründe

HEXF2

Biliyorum zaten ordan bayağı yardım alıyorum ama sonuç aynı hem ben orda I2C olarak bir sample bulamadım.Ext_read_eeprom diye sample var yani I2C_START,I2C_STOP... ve diğer komutlar ile ilgili bişey yok