Haberler:

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

Ana Menü

CCS programlama sorunu

Başlatan mustihi, 06 Şubat 2006, 20:52:00

mustihi

merhaba arkadaþlar,

PIC16F84A kullanarak dot matris üzerine bir kayan yazı uygulamasý yapmaya çalýþýyorum. CCS C derleyicisi kullanýyorum.

Harfleri göstermek için yanmasý gereken ledleri bir array olarak tanýmladým. Yani her harf için 5 elemandan oluþan bir dizi. Birkaç harfi tanýmlayýp programladýðýmda çok güzel çalýþýyor. Yalnýz tüm harfleri tanýmladýðýmda RAM'e sýðmadýðý hatasýný alýyorum.

Buna karþýlýk ROM'da saklamak için dizi tanýmlarýnýn baþýna "const" eklediðimde de fonksiyonumda pointer kullanamayacaðým hatasýný veriyor.

koda ve donanıma ilişkin her türlü çözüm önerileriniz için teþekkürler...
void harf_yaz (int * veri){
   int i,j;
 
   for(i=0;i<200;i++){
      for(j=0;j<5;j++){
         bit_clear(porta,j);
         portb = veri[j];
         delay_ms(1);
         bit_set(porta,j);
      }
   }
}
 
main(void){
   int A[5] = {31,40,72,40,31};
   // const int A[5] = {31,40,72,40,31};
 
   set_tris_a (0x00);
   set_tris_b (0x00);
 
   porta = 0xFF;
   portb = 0x00;
 
   for(;;){
      harf_yaz(A);
   }
}

Petek

Rom alanında pointer yok malesef. 8 bitlik bir işlemcide 12 bitlik pointer tutulamıyor. Ram için sorun yok zira ilk iki bankta  toplam 256 bayt var ve 8 bit ile ilk iki veya irp bitini set ederek diğer iki bankta rahatlıkla pointer kullanabilirisiniz.

Alt programda pointer değil doğrudan int olarak tanımlayın ve kullanın.

Ya da global olarak (const tabiki) a[29][5] olarak tanımlayın ve değerlerini atayın. Alt programlarda da doğrudan kullanın. Değişken romda sabit olduğu için global tanımlamanızda sakınca yok.
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

mustihi

alt programda pointer olmadan çalıştıramamıştım.  Zahmet olmazsa kabaca kod yazabilir misiniz?

teşekkürler...


Alıntı yapılan: "Petek"Ya da global olarak (const tabiki) a[29][5] olarak tanımlayın ve değerlerini atayın. Alt programlarda da doğrudan kullanın. Değişken romda sabit olduğu için global tanımlamanızda sakınca yok.

Ziya

#include <16f84a.h> // 8O 
#device ADC=10      // 8O 
#fuses HS,NOPROTECT, NOWDT
#use delay(clock=4000000)
#byte porta = 0x05
#byte portb = 0x06
#use fast_io (B)
const int A[29][5] = {31,40,72,40,31,
                      31,40,72,40,31,
                      31,40,72,40,31,
                      31,40,72,40,31,
                      31,40,72,40,31,
                      31,40,72,40,31,
                      31,40,72,40,31,
                      31,40,72,40,31,
                      31,40,72,40,31}; 

//void harf_yaz (int * veri){ 
void harf_yaz (void){ 
int i,j; 

for(i=0;i<200;i++){ 
for(j=0;j<5;j++){ 

bit_clear(porta,j); 

//portb = veri[j]; 
portb = A[i][j]; 

delay_ms(1); 
bit_set(porta,j); 
} 
} 
} 

main(void){ 
//int A[5] = {31,40,72,40,31}; 
//const int A[5] = {31,40,72,40,31}; 

set_tris_a (0x00); 
set_tris_b (0x00); 

porta = 0xFF; 
portb = 0x00; 

for(;;){ 
//harf_yaz(A); 
harf_yaz(); 
} 
}


Günün birinde 16F84A ya 10 bit ADC eklenirse şimdiden hazırlıklı olalım demişler  :!:

Kod biraz büyüdü, dikkat edin.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

Ziya

Alıntı yapılan: "Petek"...Alt programda pointer değil doğrudan int olarak tanımlayın ve kullanın...
Bu olamıyor malesef. Altyordam çağırımında iletilen işlek dizi olduğundan altyordamlarda bir işaretçi ile temsil edilmesi gerekiyor.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

mustihi

cevabınız için teşekkürler,

Ama diğer harfleri basmak için ne yapacağız? her bir harf için ayrı bir fonksiyon tanımı mı gerekecek?

benim aklımdaki: her harf için bir array tanımlamak daha sonra tek fonksiyonla farklı harfleri çağırabilmekti.

A[5] = {31,40,72,40,31};
B[5] = {31,40,72,40,31};
C[5] = {31,40,72,40,31};

harf_yaz(A);
harf_yaz(B);
harf_yaz(C);

şeklinde...

Petek

Şöyle yazmış arkadaş:

const int A[29][5] = {31,40,72,40,31, // bu satırda "A" harfi tanımlanacak
                     31,40,72,40,31,  // bu satırda "B" harfi tanımlanacak,
                       ...

yani 29 harf için herbiri 5 bayt la karakterleri tanımlamış.

Aslında şöyle yazması lazımdı:

const int harfler[29][5] = {31,40,72,40,31,
                     31,40,72,40,31,

"A" yazdırmak için harfler[0]
"B" yazdırmak için harfler[1]
"C" yazdırmak için harfler[2]
"D" yazdırmak için harfler[3]
"E" yazdırmak için harfler[4]
....


Rakamı kolay bulursunuz. Yazdırmak istediğiniz harften "A" çıkartacaksınız.

Yani "C" yazdırmak için harfler["C"-"A"] gibi
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

mustihi

merhaba,

sanırım fonksiyonda da bir değişiklik yapmak gerekecek. çünkü Ziya bey fonksiyonu argümansız olarak tanımlamış. Bu durumda harf_yaz() fonksiyonuna hangi harfi yazdıracağını nasıl bildireceğiz?

teşekkürler


//void harf_yaz (int * veri){
void harf_yaz (void){
int i,j;

for(i=0;i<200;i++){
for(j=0;j<5;j++){

bit_clear(porta,j);

//portb = veri[j];
portb = A[j];

delay_ms(1);
bit_set(porta,j);
}
}
}

Petek

Alıntı yapılan: "mustihi"merhaba,

sanırım fonksiyonda da bir değişiklik yapmak gerekecek. çünkü Ziya bey fonksiyonu argümansız olarak tanımlamış. Bu durumda harf_yaz() fonksiyonuna hangi harfi yazdıracağını nasıl bildireceğiz?

teşekkürler
...

200 lük döngü ne işe yarıyor bilmiyorum orada bir düzenleme yapman gerekebilir. Yani 200 ms ekrana aynı harfi göstereceksen o başka. Harf sayısı artınca orada değişiklik yapman gerekir.

void harf_yaz (char hrf){
int i,j;

 for(i=0;i<200;i++){
  for(j=0;j<5;j++){

    bit_clear(porta,j);

    portb = A[hrf-'A'][j];

    delay_ms(1);
    bit_set(porta,j);
  }
 }
}


fonksiyonu da harf_yaz ('C'); şeklinde çağırabilirsin. tırnak işaretlerinden birisini CCS kabul etmiyordu on da dikkat et.    '  veya " ikisinden birini kabul etmiyor.
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

mcan

selamlar şimdi şöyle bişey olurmu?
tablo[40]={a[],b[],c[],.............} yoksa mutlaka böle mi yazmalıyım :?: 
tablo[40][5]={xx,xx,xx,xx,xx,yy,yy,yy,yy,yy,zz,zz,zz,...........


şöyle denedim olmadı
int st1[5];
int st2[5];
int st3[5];
int st4[5];
int st5[5];
int st6[5];
int st7[5];
int st8[5];

int sn5[]={st1[4],st2[4],st3[4],st4[4],st5[4],st6[4],st7[4],st8[4]}


yani sn[8] e bi değer atadımmı kısa yoldan st1-8 lerin 5. elemanlarıını değiştirektim ama olmadı,olmazmı? başka bi yapımı gerekir

yani a[5]={20,60,20,20,70} dizisi tüm olarak toblo dizisinin atıyorum1. elemanı olabilirmi  ,bu bana ne kolaylık ağlayacak eğer ben a yı, b yi, 1 i ,2 yi ascii sırasında dizersem

tablo[c] yazdığımda bana c[5]={xx,xx,xx,xx,xx} i çağıracak (çağırmasını umuyorum) ;)

birde ld[] diye bir değişkenim olsun ld nin tüm elemanlarını tablo[c]nin elemanlarıyla tek satırda nasıl eşlerim?
ld[0]=tablo[c][0];
ld[1]=tablo[c][1];
.
.
.
bunu tek atırda yapmak istiyorum
biraz sipariş gibi oldu ama belkide vardır böyle bi yapı,

kalman

@Mcan

Sen bu kayan yazıyı  Satır taramılımı yoksa sütun taramalımı yapıyorsun
önemli olan bu ??
Ayrıca dizi tanımlamalarda eger elemanı cok olan dizilerde Ram yetmeyebilir bu durumda 18f452 ye geçmeni tavsiye ederim
Hatta her Led ye bir byte bile feda edebilirsin yinede yeterli bos yer kalir
Bence bu durumda program kolay anlaşılır hale gelir forumda bu konuda
yeterli yazılar mevcut ben bunlardan  oldukça yararlandım önemli olan senin bu konuyu anlaman ve yapman hazır kod sana bir şey kazandırmaz
Bence C dili bu konuda en uygun olanı

Herkese Başarılar

mcan

Alıntı yapılan: "kalman"@Mcan

Sen bu kayan yazıyı  Satır taramılımı yoksa sütun taramalımı yapıyorsun
önemli olan bu ??
Ayrıca dizi tanımlamalarda eger elemanı cok olan dizilerde Ram yetmeyebilir bu durumda 18f452 ye geçmeni tavsiye ederim
Hatta her Led ye bir byte bile feda edebilirsin yinede yeterli bos yer kalir
Bence bu durumda program kolay anlaşılır hale gelir forumda bu konuda
yeterli yazılar mevcut ben bunlardan  oldukça yararlandım önemli olan senin bu konuyu anlaman ve yapman hazır kod sana bir şey kazandırmaz
Bence C dili bu konuda en uygun olanı

Herkese Başarılar

hazır kod kullanmayı sevmem,kodu kendim yazarım genelde bunuda kendim yazıyorum,kendim bişey planlamadan forumda yazılanlarıda pek anlamaıyorum zaten bişeylerle uğraştıkca orada yazılı olanları anlayabiliyorum,zaten anlayana kadar kendim yazmaya başladım onlarıda okuyorum takip ediyorum ama kendi mantığım her zaman daha önemli ben satırları tarıyorum yani 8 atırım var bunları sırayla yakıyorum şimdi ise tablo oluşturup en basit olarak tablo değerlerini ekrana nasıl yerleştiririm onu düşünüyorum,tabloyu 256 bayttan fazla olamaması nedeniyle 2 parça altında topladım.....en on ekranda 1 yazısını tutmayı başardım şimdi bunu bitbit nasıl kaydıracağımın hesabını yapıyorum, 18serisi iyi olurdu ama elimde yok şu an için elimdeki programcıyla onu programlayabilirmiyim hiç düşünmedim de 628 le yapsam şimdilik yeterli olur zaten amacım sadece denemek bi proje üstünde değilim,ilginiz için teşekkürler