CCS C alıştırma Turlarım

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

Mucit23

Arkadaşlar Merhaba

CCS de uygun şekilde kesmeyle matris display nasıl taranır. Ben kesmeyle taramaya çalışıyorum ama bir türlü verimli tarama yapamadım. Timer0 bölücü oranını 1/1 yapmama rağmen dikkatli bakılınca ekranda titremeyi hissediyorum
Buna rağmen İşlemcim 18F4550, HS osc Seçili Ve CPUDIV 2, usb için PLL DIV ise 5 Seçili. Yani kristal frekansı 2 ye bölünüyor ve işlemci 10mips hızda çalışıyor. (Çalışması lazım)
Anlamıyorum Timer0 bölücü oranı 1/1 olmasına rağmen hala titreme oluyor.
PicMulticalc diye bir program var. Onda hesaplamaları yapıyorum. Ama hiçbirşey hesaplarıma uymuyor. Nerede hata yapıyorum
Yazılımı bu şekilde.

#include <18F4550.h>

#device ADC=8  //8 Bit okuma yapılıyor

#fuses HS,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV2,VREGEN,NOBROWNOUT // 8MHZ
#use delay(clock=40000000)

//#include <lcd_driver.c>
//#include <One_Wire.c>
//#include <DS1820.c>

//unsigned int16 Tam_Deger;
//float Sicaklik;
unsigned int8 Data,i,z,x,SDATA[2];
//unsigned int8 S1DATA[2],S2DATA[2],S3DATA[2],S4DATA[2],S5DATA[2],S6DATA[2],S7DATA[2],S8DATA[2];
unsigned int1 y;
unsigned int8 sayac=0;

Void Data_Gonder();
Void Tpic_Gonder();

//74HC595 Pin Tanımlamaları
#define HC_Data PIN_D3
#define HC_Clck PIN_D7
#define HC_Ltch PIN_D5
//Tpic6B595 Oin Tanımlamaları
#define Tpic_Data PIN_D2
#define Tpic_Clck PIN_D6
#define Tpic_Ltch PIN_D4
#define Tpic_Enbl PIN_D0

unsigned int karakter[]={}; 


#int_timer0
Void timer0_Kesme()
{
sayac++;
if(sayac>8)
{
sayac=1;
}
switch (sayac)
{
case 1:
{
Output_high(Tpic_Enbl);  //tpic6B595 Çıkışlar Pasif
Data=0b01111111;
Data_Gonder();
SDATA[0]=255;
SDATA[1]=0;
SDATA[2]=0;
Tpic_Gonder();
Output_low(Tpic_Enbl);  //tpic6B595 Çıkışlar Aktif
}
case 2:
{
Output_high(Tpic_Enbl);  //tpic6B595 Çıkışlar Pasif
Data=0b10111111;
Data_Gonder();
SDATA[0]=255;
SDATA[1]=0;
SDATA[2]=0;
Tpic_Gonder();
Output_low(Tpic_Enbl);  //tpic6B595 Çıkışlar Aktif
}
case 3:
{
Output_high(Tpic_Enbl);  //tpic6B595 Çıkışlar Pasif
Data=0b11011111;
Data_Gonder();
SDATA[0]=255;
SDATA[1]=0;
SDATA[2]=0;
Tpic_Gonder();
Output_low(Tpic_Enbl);  //tpic6B595 Çıkışlar Aktif
}
case 4:
{
Output_high(Tpic_Enbl);  //tpic6B595 Çıkışlar Pasif
Data=0b11101111;
Data_Gonder();
SDATA[0]=255;
SDATA[1]=0;
SDATA[2]=0;
Tpic_Gonder();
Output_low(Tpic_Enbl);  //tpic6B595 Çıkışlar Aktif
}
case 5:
{
Output_high(Tpic_Enbl);  //tpic6B595 Çıkışlar Pasif
Data=0b11110111;
Data_Gonder();
SDATA[0]=255;
SDATA[1]=0;
SDATA[2]=0;
Tpic_Gonder();
Output_low(Tpic_Enbl);  //tpic6B595 Çıkışlar Aktif
}
case 6:
{
Output_high(Tpic_Enbl);  //tpic6B595 Çıkışlar Pasif
Data=0b11111011;
Data_Gonder();
SDATA[0]=255;
SDATA[1]=0;
SDATA[2]=0;
Tpic_Gonder();
Output_low(Tpic_Enbl);  //tpic6B595 Çıkışlar Aktif
}
case 7:
{
Output_high(Tpic_Enbl);  //tpic6B595 Çıkışlar Pasif
Data=0b11111101;
Data_Gonder();
SDATA[0]=255;
SDATA[1]=0;
SDATA[2]=0;
Tpic_Gonder();
Output_low(Tpic_Enbl);  //tpic6B595 Çıkışlar Aktif
}
case 8:
{
Output_high(Tpic_Enbl);  //tpic6B595 Çıkışlar Pasif
Data=0b11111110;
Data_Gonder();
SDATA[0]=255;
SDATA[1]=0;
SDATA[2]=0;
Tpic_Gonder();
Output_low(Tpic_Enbl);  //tpic6B595 Çıkışlar Aktif
}
}
set_timer0(99);
}

Void Data_Gonder()
{
         z=7;
         for (i=0;i<8;i++)
         {
         y=bit_test(data,z);
         output_bit(HC_Data,y);
         output_high(HC_Clck);
         delay_us(1);
         output_low(HC_Clck);
         z--;
         }
         output_high(HC_Ltch);
         delay_us(1);
         output_low(HC_Ltch);
}

Void Tpic_Gonder()
{
         for (x=0;x<3;x++)// Kaç adet Tipic bağlı
         {
         z=7;
         for (i=0;i<8;i++)
         {
         y=bit_test(SDATA[x],z);
         output_bit(Tpic_Data,y);
         output_high(Tpic_Clck);
         delay_us(1);
         output_low(Tpic_Clck);
         z--;
         }
         }
         output_High(Tpic_Ltch);
         delay_us(1);
         output_Low(Tpic_Ltch);
}

void main(void)
{
   setup_timer_3(T3_DISABLED | T3_DIV_BY_1);
   setup_adc(ADC_OFF);
   SETUP_ADC_PORTS(NO_ANALOGS);
   setup_spi(false);
   setup_timer_0(T0_INTERNAL|T0_DIV_1|T0_8_BIT);
   set_timer0(99); 
   enable_interrupts(INT_TIMER0); 
   enable_interrupts(GLOBAL); 
     
   #use fast_io(a)
   #use fast_io(b)
   #use fast_io(c)
   #use fast_io(d)
  
  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);
  output_high(Tpic_enbl);
  
  port_b_pullups(False);
  
   delay_ms(100);
     
     for(;;)   //Sonsuz Döngü;
     {

     }     
}
 


Program deneme programıdır. 3 Adet matrixdisplay var ve satırları 74595 ile tarıyorum. Sütünlarda ise Tpic6B595 ler var.Çalışıyor onlar bir problem yok. Ama tarama işini düzgün yapamadım. Bu konuda yardımınıza ihityacım var. Tarama işlemini nasıl yapayım??

halilgalic

#61
#int_TIMER0
void  TIMER0_isr(void) 
{
disable_interrupts(INT_TIMER0);
set_timer0(250);
for (i=0;i<8;i++){

sayi=binler;
data_al();
data[0]=deger;

sayi=yuzler;
data_al();
data[1]=deger;

sayi=onlar;
data_al();
data[2]=deger;

sayi=birler;
data_al();
data[3]=deger;

sayi=snyonlar;
data_al();
data[4]=deger;

sayi=snybirler;
data_al();
data[5]=deger;

write_expanded_outputs(data);


output_c(tara[i]);
delay_us(600);
output_c(0xff);}

enable_interrupts(INT_TIMER0);}


ben taramayı bu sekilde yapıyorum ve osc yi 20mhz kullanıyorum hiç bir sıkıntı olmuyor (setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32))

kantirici

kaç mhzlik kristal kullanıyorsun?.Programda konfg. 8mhz için yapılmış sanırım.

Mucit23

#63
o sadece eskiden kalan bir açıklama. 20 mhz kristal takılı.

Mucit23



Alıntı yapılan: halilgalic - 18 Ağustos 2012, 23:12:41
#int_TIMER0
void  TIMER0_isr(void) 
{
disable_interrupts(INT_TIMER0);
set_timer0(250);
for (i=0;i<8;i++){

sayi=binler;
data_al();
data[0]=deger;

sayi=yuzler;
data_al();
data[1]=deger;

sayi=onlar;
data_al();
data[2]=deger;

sayi=birler;
data_al();
data[3]=deger;

sayi=snyonlar;
data_al();
data[4]=deger;

sayi=snybirler;
data_al();
data[5]=deger;

write_expanded_outputs(data);


output_c(tara[i]);
delay_us(600);
output_c(0xff);}

enable_interrupts(INT_TIMER0);}


ben taramayı bu sekilde yapıyorum ve osc yi 20mhz kullanıyorum hiç bir sıkıntı olmuyor (setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32))

Merhaba
Ben taramayı tek bir kesmede değilde kaç adet satır var ise okadar kesmede yapmayı düşünmüştüm.
Bu işlerde benim mantığım şu şekilde yürür.

Diyelim görüntünün kesintisiz düzgün çıkması için her ledin 2ms aktif olarak beklemesi gerekir.
O halde Timer kesmesini 2ms ye ayarlarım. Yani her 2 ms de bir kesme oluşur.
Her kesmeye gittiğimde eski  satırı veya sütünü kapatır, Yeni karakter bilgisini verir ve aktif olması gereken satır ve sütünu aktif ederim.
Bir sonraki kesmeye kadar aktif kalır.
Bir sonraki kesmede önceki satır veya sütünü kapatıp yeni karakter bilgisini verdikten sonra aktif olması gereken satırı açar kesmeden çıkarım. Bunu genelde kesme içerisinde bir sayac tutarak yaparım.
Genelde çok verimli çalışır ama nedense CCS de bu verimi bir türlü yakalayamadım. Baktımda sizin yazılımda kesme içerisinde delaylar koymuşsunuz. Bu yanlış değilmidir. Üstelik her veri ekranda 600us kalıyor. Bu süre az değilmi.

halilgalic

aslında bande sana yakın bi mantık kullanıyorum.Ben bazen iç mekan için dotmatrix(hazır piyasada bulunanlar) kullanıyorum bazende kendi tasarımım dotmatrıxler var 10-20-30cm boylarında onu kullanıyorum bu dotların taramada tepki süreleri birbirini tutmuto yani hazır olanlarla benim ledli dotlar aynı olmuyo bende bunu artık bir kaç deneme yanılma ile yapıyorum ve titremeyi bu şekilde gideriyorum.600us bu şekil bulunmuş bir değer olabilir.Bu mantığa(timerli) göre yazdığım  bi programım ver belki işinize yarayabilir .
http://www.upload.gen.tr/d.php/www/01klheme/DOT.rar.html

Mucit23

#66
Merhaba
Verdiğiniz program için teşekkür ederim. Bi inceleyeyim

Yanlız şu 4550 ve CCS de anlamsız bir durum var izninizle açıklayayım

OSC Configuration ile ilgili...

Aşağıdaki tabloyu inceleyin. 18F4550 nin OSC blok şeması

upload pictures
İşlemciye 20Mhz kristal bağlı olduğunu düşünelim.
Ben bu halde iken PLLDIV bölücüsünü 5 olarak seçiyorum. Dolayısıyla 20Mhz kristal 4Mhz ye düşüyor ve USB çarpanı 4 mhz yi 96 mhz ye çıkartıyor.4 numaralı kutudan çıkan 96mhz sinyali USB bölücüsüde 2 ye bölüm 48 mhzde usb donanımını çalıştırıyor. Buraya kadar sıkıntım yok.

Aklıma takılan kısım ise şurası. İşlemci Kristal Tipi HS,XT,EC veECIO seçildiğinde 2 numaralı bölücü, HSPLL, XTPLL, ECPLL ve ECPIO seçildiğinde ise 3 numaralalı kutu içerisindeki bölücü çalışması gerekir. Buraya kadarda problem olmaması gerekir.
Fakat şöyle bir sıkıntı varki Ben CCS de 4550 nin sigortalarında OSC tipini HSPLL olarak seçsemde CPUDIV bölücüsüne max. 4 değerini verebiliyorum. 6 değerini yüklersem CCS hata veriyor.

18F4550.h klasöründe ise sigortalar verilmiş

//////// Fuses: PLL1,PLL2,PLL3,PLL4,PLL5,PLL6,PLL10,PLL12,[color=red][b]CPUDIV1,CPUDIV2[/b][/color]
//////// Fuses: [color=red][b]CPUDIV3,CPUDIV4[/b][/color],NOUSBDIV,USBDIV,XT,XTPLL,EC_IO,EC,ECPLL_IO
//////// Fuses: ECPLL,INTRC_IO,INTRC,INTXT,INTHS,HS,HSPLL,NOFCMEN,FCMEN
//////// Fuses: NOIESO,IESO,PUT,NOPUT,NOBROWNOUT,BROWNOUT_SW,BROWNOUT_NOSL
//////// Fuses: BROWNOUT,BORV45,BORV43,BORV27,BORV21,NOVREGEN,VREGEN,NOWDT
//////// Fuses: WDT,WDT1,WDT2,WDT4,WDT8,WDT16,WDT32,WDT64,WDT128,WDT256
//////// Fuses: WDT512,WDT1024,WDT2048,WDT4096,WDT8192,WDT16384,WDT32768
//////// Fuses: CCP2B3,CCP2C1,NOPBADEN,PBADEN,NOLPT1OSC,LPT1OSC,NOMCLR,MCLR
//////// Fuses: NOSTVREN,STVREN,NOLVP,LVP,ICSP1,ICSP2,NOXINST,XINST,DEBUG
//////// Fuses: NODEBUG,PROTECT,NOPROTECT,CPB,NOCPB,CPD,NOCPD,WRT,NOWRT,WRTC
//////// Fuses: NOWRTC,WRTB,NOWRTB,WRTD,NOWRTD,EBTR,NOEBTR,EBTRB,NOEBTRB


Sigortalardanda anlayacağınız üzere CPUDIV6 şeklinde bir sigorta tanımlı değil. Elbette bundan dolayı hata veriyor.  3 numaralı kutu içerisindeki bölücüyü nasıl kullanabilirim? Osilatör tipini HSPLL seçmek yetmiyormu yoksa başka ayarlardamı yapmak gerekiyor. 1. Sorum buydu.

Diğer bir sorum ise hızla ilgili. Farzedelim yine 20 mhz kristal bağlı. PLLDIV 5 olarak seçili ve 20 mhz 5 bölünüp 4 olarak USB çarpanından 96MHZ olarak çıkıyor. Biz bu 96 MHZ ile işlemciyinin clock kaynağını beslemek istiyoruz.
OSC tipi  HSPLL seçili olduğu için yukarıdaki resimdeki 3 numaralı bölücü aktif. Şimdi Ben bu bölücüde bölücü orannı 2 verirsem 96MHz 2 ye bölünüp 48 MHZ olarak çıkar. Bu bölücüden sonra başka bir bölücü görünmüyor yani ben bu şekilde ayarlasam işlemci çekirdeğine 48 Mhz gidecek. Peki işlemci Bu hazda çalışabilecekmi. 48mhz az bir frekans değil 18F serisi için.

Mucit23

Merak ettiklerim var bu yüzden konuyu güncel tutmak istiyorum. 1. Sorum neysede 2. Sorumu çok merak ediyorum. Gerçektende bu hızda çalışabilirmi işlemci.

muhittin_kaplan

mucit 48mhz e çalışır.
şimdi baktım Datasına normalde 6 yada bölünebiliyor. ((CPUDIV1:CPUDIV0) 1,1 olduğunda Datasheet Table 2.3 )
Eğer 4mhz lik bir kristal kullanıp 2 ye bölersek ((CPUDIV1:CPUDIV0) ile) PLL aktifse 48mhz de çalışır.

Mucit23

Bu işler çok kafamı karıştırdı hocam. Şu clock işlerinde bir türlü dizginleri elime alamadım.
Şu CPUDIV1:CPUDIV0,FOSC3:FOSC0,PLLDIV2:PLLDIV0 registerlerini işlemci sigortalarıyla hiç uğraşmadan kendim elle set edemezmiyim arkadaş. İşlemcim çalışıyor  Ama kaç mhz çalışıyor bü türlü anlayamıyorum. Elimin altında osiloskop var. İşlemci çalışma frekansını, Timer kesmesi frekansını nasıl öğrenebilirim

Timer kesmesi alt programım bu şekilde

#int_timer0
Void timer0_Kesme()
{
sayac++;
if(sayac>8)
{
sayac=1;
}
switch (sayac)
{
case 1:
{
Output_high(Tpic_Enbl);  //tpic6B595 Çıkışlar Pasif
Data=0b01111111;
Data_Gonder();
SDATA[0]=255;
Tpic_Gonder();
Output_low(Tpic_Enbl);  //tpic6B595 Çıkışlar Aktif
}
case 2:
{
Output_high(Tpic_Enbl);  //tpic6B595 Çıkışlar Pasif
Data=0b10111111;
Data_Gonder();
SDATA[0]=255;
Tpic_Gonder();
Output_low(Tpic_Enbl);  //tpic6B595 Çıkışlar Aktif
}
case 3:
{
Output_high(Tpic_Enbl);  //tpic6B595 Çıkışlar Pasif
Data=0b11011111;
Data_Gonder();
SDATA[0]=255;
Tpic_Gonder();
Output_low(Tpic_Enbl);  //tpic6B595 Çıkışlar Aktif
}
case 4:
{
Output_high(Tpic_Enbl);  //tpic6B595 Çıkışlar Pasif
Data=0b11101111;
Data_Gonder();
SDATA[0]=255;
Tpic_Gonder();
Output_low(Tpic_Enbl);  //tpic6B595 Çıkışlar Aktif
}
case 5:
{
Output_high(Tpic_Enbl);  //tpic6B595 Çıkışlar Pasif
Data=0b11110111;
Data_Gonder();
SDATA[0]=255;
Tpic_Gonder();
Output_low(Tpic_Enbl);  //tpic6B595 Çıkışlar Aktif
}
case 6:
{
Output_high(Tpic_Enbl);  //tpic6B595 Çıkışlar Pasif
Data=0b11111011;
Data_Gonder();
SDATA[0]=255;
Tpic_Gonder();
Output_low(Tpic_Enbl);  //tpic6B595 Çıkışlar Aktif
}
case 7:
{
Output_high(Tpic_Enbl);  //tpic6B595 Çıkışlar Pasif
Data=0b11111101;
Data_Gonder();
SDATA[0]=255;
Tpic_Gonder();
Output_low(Tpic_Enbl);  //tpic6B595 Çıkışlar Aktif
}
case 8:
{
Output_high(Tpic_Enbl);  //tpic6B595 Çıkışlar Pasif
Data=0b11111110;
Data_Gonder();
SDATA[0]=255;
Tpic_Gonder();
Output_low(Tpic_Enbl);  //tpic6B595 Çıkışlar Aktif
}
}
set_timer0(99);
}


İlginç bir durum daha var.
Taramaya hangi satırdan başlarsam o satırın parlaklığı diğerlerine göre az oluyor... Bunun sebebi nedir hala çözmekle uğraşıyorum.

CCS benim sabrımı sınıyor sankide..

a_a_sezen

Çok anlamasamda aklıma geleni yazayım.
Kesme fonksiyonunuzun çalışma süresi kadar bir boşluk ledlerinizde bahsettiğiniz sönüklük ve pır pır ı oluşturuyor olabilir mi?
 
case x:
{
Output_high(Tpic_Enbl);  //tpic6B595 Çıkışlar Pasif                     ............... ledler 0
Data=0b11111101;
Data_Gonder();                                                          //...............................led 0 da geçen süreler, fonksiyon dallanmaları dahil...
SDATA[0]=255;                 
Tpic_Gonder();
Output_low(Tpic_Enbl);  //tpic6B595 Çıkışlar Aktif                       ................ledler 1
}

Güce ve Geleceğe Güvenle...

Mucit23

Merhaba

Öncede satırlarıda Shift Register ile tarıyordum ama onu iptal ettim. İşlemcinin bir portunu satırları taramak için ayırdım. Sütünlarda ise Tpic6B595 ler var. Şuanda kesmede tek yaptığım işlem sütün bilgilerini yollayıp satırları taramak. Kesme alt programında her kesmeye gittiğinde işlemcinin 1 pinini toggle yapıyorum. Sonra bu pini osiloskopla ölçüyorum. Gelen palsların pozitif uzunluğunu 1,5 - 2 ms ye ayarladığımda hiç titreme kalmıyor. İlginç bir şekilde kesmede tarama bölümleri pasif edip, Sadece bir pini toggle yaptığımda kesme frekansı en az 5 katına çıkıyor. Demekki kesmedeyken seri olarak bilgi gönderme işlemleri çok uzun sürüyorki kesmeyi yavaşlatıyor. Bu sorun olabilir.

Kodlar budur. Sizce bir problem varmı?
#include <18F4550.h>

#device ADC=8  //8 Bit okuma yapılıyor

#fuses HS,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOBROWNOUT // 48MHZ
#use delay(clock=20000000)

//#include <lcd_driver.c>
//#include <One_Wire.c>
//#include <DS1820.c>

//unsigned int16 Tam_Deger;
//float Sicaklik;
unsigned int8 Data,i,z,x,SDATA[2];
//unsigned int8 S1DATA[2],S2DATA[2],S3DATA[2],S4DATA[2],S5DATA[2],S6DATA[2],S7DATA[2],S8DATA[2];
unsigned int1 y;
unsigned int8 sayac=0;

Void Data_Gonder();

//Tpic6B595 Oin Tanımlamaları
#define Tpic_Data PIN_D2
#define Tpic_Clck PIN_D6
#define Tpic_Ltch PIN_D4
#define Tpic_Enbl PIN_D0

#int_timer0
Void timer0_Kesme()
{

output_toggle(pin_a0);

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


Void Data_Gonder()
{
         for (x=0;x<3;x++)// Kaç adet Tipic bağlı
         {
         z=7;
         for (i=0;i<8;i++)
         {
         y=bit_test(SDATA[x],z);
         output_bit(Tpic_Data,y);
         output_high(Tpic_Clck);
         delay_us(1);
         output_low(Tpic_Clck);
         z--;
         }
         }
         output_High(Tpic_Ltch);
         delay_us(1);
         output_Low(Tpic_Ltch);
}

void main(void)
{
   setup_timer_3(T3_DISABLED | T3_DIV_BY_1);
   setup_adc(ADC_OFF);
   SETUP_ADC_PORTS(NO_ANALOGS);
   setup_spi(false);
   setup_timer_0(T0_INTERNAL|T0_DIV_2|T0_8_BIT);
   set_timer0(99); 
   enable_interrupts(INT_TIMER0); 
   enable_interrupts(GLOBAL); 
     
   #use fast_io(a)
   #use fast_io(b)
   #use fast_io(c)
   #use fast_io(d)
  
  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);
  output_high(Tpic_enbl);
  
  port_b_pullups(False);
  
   delay_ms(100);
     
     for(;;)   //Sonsuz Döngü;
     {
SDATA[0]=255;
SDATA[1]=0;
SDATA[2]=0;
     }     
}


Mesela demiştim ya Ekranı taramaya hangi satırdan başlarsam o satırın parlaklığı düşük oluyordu.
Aşağıda bir resim çektim. Açıkça belli oluyor problem..


photo upload

Yine CCS ile ilgili aklıma takılan bir soruyu sormak istiyorum
#use delay(clock=20000000) şeklinde bir tanımlama ile işlemci çalışma frekansını belirtiyoruz. Peki buraya yazmamız gereken frekans işlemci ana çekirdeğinin çalışma frekansımı yoksa bağlanan kristalin çalışma frekansımı olacak. Örneğin 20 Mhz osc Bağlı fakat bu PLL ile 48 mhz çıkartılıp işlemci çekirdeğine veriliyor.... Ben buraya 48Mhz mi yazmam gerekiyor?


a_a_sezen

ccs c de örnek program bile derlemedim ancak..
#use delay ..kullandığınız kristalin değerini zaman geciktirmelerinde kullanılmak üzere derleyiciye bildiriyor... Bu durumda kristalinizin değerini yazmanız gerekiyor.

timer0_Kesme() fonksiyonunuz içindeki switch kullanımını main içindeki for( ; ; ) içine alsanız, hatta for içinde bir fonksiyon olarak kullansanız, kesme zamanınızı daha sağlıklı kontrol etme şansı yakalamaz mısınız? Yanlış bilmiyorsam akış, kesme oluştuğunda alt fonksiyondan çıkmadan kesme fonksiyonunuza dallanmayacaktır.
Sonuçta (kesmenizin süresi) + (kesme fonksiyonunuzun içindeki kodlarınızın işlenme süresi) kontrolsüzlüğünden çıkmış olursunuz.
Güce ve Geleceğe Güvenle...

halilgalic

pice donanımsal olarak taktığmız osilatör değerini girmeliyiz.120 tane 595 sürmem gerekti kendi 595 programımı yazım sonra yavaş çalıştığını gördüm ve ccs c nin kendi kütüphanesindekinde bulunan #include <74595.c>  kullandım ve kat kat daha hızlı çalıştı gördüm.aynı kütüphaneyi tpic595 içinde kullanabililirsin bence bi dene 

Mucit23

Evet onuda bir deniyeyim.

Kesme sorunu vs onları bir şekilde hallederim. Aslında bu sorunlar bir yandanda bana tecrübe kazandırıyor. Daha C dilinde dünkü çoçuğum...  :o

Alıntı yapılan: a_a_sezen - 23 Ağustos 2012, 16:16:55
ccs c de örnek program bile derlemedim ancak..
#use delay ..kullandığınız kristalin değerini zaman geciktirmelerinde kullanılmak üzere derleyiciye bildiriyor... Bu durumda kristalinizin değerini yazmanız gerekiyor.

timer0_Kesme() fonksiyonunuz içindeki switch kullanımını main içindeki for( ; ; ) içine alsanız, hatta for içinde bir fonksiyon olarak kullansanız, kesme zamanınızı daha sağlıklı kontrol etme şansı yakalamaz mısınız? Yanlış bilmiyorsam akış, kesme oluştuğunda alt fonksiyondan çıkmadan kesme fonksiyonunuza dallanmayacaktır.
Sonuçta (kesmenizin süresi) + (kesme fonksiyonunuzun içindeki kodlarınızın işlenme süresi) kontrolsüzlüğünden çıkmış olursunuz.


Tarama işlemini kesme içerisinde yapmak zorundayım çünkü ana programdan bağımsız bir şekilde kesintisiz olması gerekmekte. Ana programda yapmam gereken çok daha önemli işlerim var.