CCS C alıştırma Turlarım

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

Mucit23

Haklısınız sanırım. Kodların çalışma suresi degismeyecegine göre timer de her seferinde aynı olacaktır.
Şuan en mantıklı olanı saat kullanmak. Olmadı timer ile saat yapıp onu gönderirim.

Srand fonksiyonuna bir deger gonderirken özel bir özel bir işlem yapmamız gerekiyormu. Örneğin saat ve tarihi gonderirken
Saat, dakika, saniye, gün, ay, yıl gibi bilgileri üst üste koyup topladıkdan sonra gondersem olurmu?

Mucit23

Bi sorum olacak,

10 bitlik bir verim var ve bu veriyi paralel olarak Pic'in Portlarına aktarmak istiyorum. Düşük 8Bit PortB'ye Gelecek. Sonra kalan 2 bit ise Porta nın 0. ve 1. bitlerine yönlendirilecek.

Bu iş için Basit bir fonksiyon yazıp yönlendirme yapabilirim ama ben makro şeklinde yapılabilirmi onu öğrenmek istiyorum. Bu tür işlemler makro halinde nasıl yapılır?

Mucit23


sadogan

#define veri_gonder(x)  \ output_b(x&0XFF);  \ output_c(x>>8) ;

while(TRUE)
{
      veri_gonder(0xF0AA);

}

Mucit23

Alıntı yapılan: sadogan - 21 Eylül 2013, 14:55:38
#define veri_gonder(x)  \ output_b(x&0XFF);  \ output_c(x>>8) ;

while(TRUE)
{
      veri_gonder(0xF0AA);

}


Teşekkürler.

rree

Kullanılan işaretlerin anlamları nelerdir.
\     amaç nedir?

(x&0xFF)  niçin and işlemi yaptık
(x>>8)   sağa doğru 8 defa kaydırnca  data sonucu  sıfır olmazmı

Bunları anlatan bir kaynak varmı

Mucit23

ccs de nasıl olduysa sol tarafta bulunan Files ve projects tablarını yanlışlıkla kapattım. Şimdi projedeki dosyalara ulaşamıyorum. Tekrar nasıl açabilirim? Bulamadım bir türlü

rree

View  mens den files  onayla

Mucit23

Merhaba arkadaşlar.

Şöyle bir sorunum var. Timer0 Kesmesi ile sürekli display tarıyorum. 800uS aralıklarla kesme oluşuyor. 0 ile 1000000 arası değişen bir değeri eeproma kaydetmem gerekiyor. Bu iş için 32 bitlik bir değeri 3 parça halinde eeproma yazdım.

void write_counter(int32 counter){
  int part0=0,part1=0,part2=0;
 
  part0 = (counter&0x000000FF);
  write_eeprom(1,part0);
  part1 = (counter&0x0000FF00)>>8;
  write_eeprom(2,part1);
  part2 = (counter&0x00FF0000)>>16;
  write_eeprom(3,part2);
}

Fonksiyon çalışıyor. Fakat şöyle bir sorun var ki yazma işlemi sırasında kesme sekteye uğruyor. Bunuda ekranın titremeye başlamasıyla anlıyorum. Yazma işlemi bittiğinde titremede duruyor. Herhalde eeprom yazması sırasında işlemci kesmeye cevap veremiyor.

Sorum basit aslında bunu olmasını engellemem  lazım. Ne kesme sekteye uğrayacak, nede yazma işlemi sekteye uğrayacak. Neler yapabilirim?

vatandas30

yazma esnasında kesmelerin kapatılması gerek diye biliyorum.

Tagli

EEPROM işlemleri ile kesmelerin bir bağlantısı yok. EEPROM'a yazma devam ederken işlemci başka işler yapabilir, kesmelere de cevap verebilir. Hatta yazma işleminin bitip bitmediğini anlamak için EEPROM kesmesi bile var.

Ancak, ASM seviyesinde, EEPROM'a yazımı başlatabilmek için bir register'a bölünme olmaksızın arka arkaya 2 anahtar değerin yazılması gerekiyor (ASM komutları ile). Bu sırada kesmelerin geçici olarak kapatılması gerekir. Derleyici elbette anahtarı yazma işini kendisi hallediyor ama bu sırada kesmeleri otomatik olarak kapatıyor mu onu bilemem.

Program hafızasına yazımda iş değişiyor tabi. Program hafızasına yazılırken işlemci çalışamaz.
Gökçe Tağlıoğlu

sadogan

Alıntı yapılan: rree - 22 Eylül 2013, 12:15:30
Kullanılan işaretlerin anlamları nelerdir.
\     amaç nedir?

(x&0xFF)  niçin and işlemi yaptık
(x>>8)   sağa doğru 8 defa kaydırnca  data sonucu  sıfır olmazmı

Bunları anlatan bir kaynak varmı
\     amaç nedir?

Makronun sonlanmadığını belirtiyor.
(x&0xFF)  niçin and işlemi yaptık --> Ama sonuç x de  deyil x in and lenmiş hali ccs nin belirledigi bir değişkende.
(x>>8)   sağa doğru 8 defa kaydırnca  data sonucu  sıfır olmazmı --> x içeriği and den etkilenmediğinden  sonuç sıfır olmaz.

Mucit23

Alıntı yapılan: Tagli - 29 Ekim 2013, 08:56:05
EEPROM işlemleri ile kesmelerin bir bağlantısı yok. EEPROM'a yazma devam ederken işlemci başka işler yapabilir, kesmelere de cevap verebilir. Hatta yazma işleminin bitip bitmediğini anlamak için EEPROM kesmesi bile var.

Ancak, ASM seviyesinde, EEPROM'a yazımı başlatabilmek için bir register'a bölünme olmaksızın arka arkaya 2 anahtar değerin yazılması gerekiyor (ASM komutları ile). Bu sırada kesmelerin geçici olarak kapatılması gerekir. Derleyici elbette anahtarı yazma işini kendisi hallediyor ama bu sırada kesmeleri otomatik olarak kapatıyor mu onu bilemem.

Program hafızasına yazımda iş değişiyor tabi. Program hafızasına yazılırken işlemci çalışamaz.

Hocam eğer eeprom yazma işleminin kesmeyle ilgisi yoksa neden bu bahsettiğim sorun olabilir?

Tagli

Kodun tamamını görmeden yorum yapmak zor. Zaten CCS C bilmiyorum.

write_counter fonksiyonu nereden çağrılıyor? Bunu kesme içinde çağırıyorsan sorun oradan kaynaklanıyor olabilir. CCS C write_eeprom fonksiyonu içinde kendisi otomatik olarak işlemin bitmesini bekliyor mu?
Gökçe Tağlıoğlu

yldzelektronik

Bahsi geçen uyarı mesajını nette arayınca ccs forumda ilginç açıklamalara ulaşılabiliyor.Bana biraz karışık geldi.

Geçmiş gün açıklamanın birinde "Aynı fonksiyonu birden fazla yer içinde çağırdığında gerçekleşiyor." yada "fonksiyonu ana programda ve alt programda çağırdığında gerçekleşiyor" (kesmelerin kapatılması olayından bahsediyorum)

Kendi programımda da aynı durum var şuan.Ancak çözemedim neyden kaynaklandığını.Asm çıktısına bakıyorum sadece gie bitini 0 1 yaparak değiştiriyor.Bazı kısımlarda btfsc bile var.Bazen printf satırında bazen write_eeprom satırında oluyor.

Ama tam olarak hangi durumda oluyor belirsiz gibi.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.