Picproje Elektronik Sitesi

DERLEYİCİLER => CCS C => Konuyu başlatan: SüleymanKara - 08 Ağustos 2004, 18:23:12

Başlık: CCS PicC'de 32bit sayı nasıl BCD'ye çevirilir?
Gönderen: SüleymanKara - 08 Ağustos 2004, 18:23:12
CCS PicC'de 32bit sayıyı BCD formatına çevirmek için herhangi bir fonksiyon var mı ?
Yoksa 32 bit sayıyı nasıl BCD formatına çevirebilirim?
Başlık: CCS PicC'de 32bit sayı nasıl BCD'ye çevirilir?
Gönderen: arif - 10 Ağustos 2004, 10:17:04
dg0 = MAKE8(ms,3);
     dg1 = MAKE8(ms,2);
     dg2 = MAKE8(ms,1);
     dg3 = MAKE8(ms,0);

dg0...dg3  int8
ms=float yada int32 olabilir
kolay gelsin..
Başlık: CCS PicC'de 32bit sayı nasıl BCD'ye çevirilir?
Gönderen: SüleymanKara - 10 Ağustos 2004, 22:50:31
Yazdığım bir programda elde ettiğim 32bit'lik bir sayıyı 7 segment display'e vermem gerekiyordu.Ondan bu soruyu sormuştum. Aslında soru biraz hatalı BCD'ye çevirmek gerekmiyor, Decimal'e çevirsem yeter.

Arif bahsettiğin "Make8" komutu int32'nin istenen byte'lık kısmını mı alıyor ? Öyleyse 32 bit'lik bir sayıyı bu komutla BCD'ye çeviremeyiz.
Çünkü 32 bitlik işaretsiz bir sayı en fazla 4294967295 değerini alır yani her bir BCD değerini 8bitlik değişkene yüklersek 10 byte a ihtiyaç duyarız.

Şöyle bir programla BCD olmasa da decimal'e çevirebiliriz sanırım. Yanılıyorsam düzeltin.

for (i=0;i<10;i++)
 {
   c=b%10;
   b=b-c;
   b=b/10;
 }

"b" 32 bitlik bir sayı
c[] ise Decimal değerlerin yer aldığı matris.
Başlık: CCS PicC'de 32bit sayı nasıl BCD'ye çevirilir?
Gönderen: Erkan Gench - 11 Ağustos 2004, 01:37:00
şöyle bir tanımlama yapalım

int32 a=4180987876;

a sayısını lcd'ye yazdırmak için aşağıdaki komutu kullanırsınız.

printf(lcd_putc,"%lu",a);   //%lu işaretsiz sayı için %ld işaretli sayı için

fakat istediğiniz sayıyı 7 segmenli göstergeye yazmak olduğuna göre yapacağınız printf komutunun içindeki 'lcd_putc' yerine kendi fonksiyonunuzu yazmak.

printf komutunun yaptığı şey verdiğiniz değerleri formatlayarak bayt bayt çıkış birimine göndermektir (burada çıkış birimi lcd_putc fonsiyonu)

yani yapacağınız şu

void fonksiyonum(char deger)
{
 
  /*deger içindeki değişkeni göstergeye yazan komutlar*/
  konum++;
}

printf(fonksiyonum,"%lu",a);


bu kodlarda printf komutu a sayısının içindeki 4, 1, 8, 0, ... sayılarını sırasıyla fonksiyonum'a gönderecektir. bu arada sayılar ASCII kodu olarak gönderilir rakam olarak değil.

ben bu yöntemle hem grafik lcd için hemde kayan yazı için kendi printf fonksiyonumu yazdım.
Başlık: Doğru...
Gönderen: DumrulBey - 11 Ağustos 2004, 02:32:23
dg0 = MAKE8(ms,3);
dg1 = MAKE8(ms,2);
dg2 = MAKE8(ms,1);
dg3 = MAKE8(ms,0);

Arif'in verdiği kodlar, herhangi bir 32 bit sayı için 4 baytlık değişkenleri ayrı şekilde kullanabilmemize yarıyor. Mesela 1,234,567,890 gibi 32 bit sayı için 8 bitlik mikrodenetleyicide, dört farklı değişkende h'49 96 02 D2' şeklinde tutulur. Arasını boşlukla ayırdığım her onaltılık (hexadecimal) sayı dg0..dg3 değişkenlerine aktarılır. Ancak dikkat edin aynı şekilde aktarıldığı için tek başlarına farklı sayıları gösterirler. Dolayısıyla dg0 ve dg1 sayını MSB (Most Significant Bit) yani yüksek değerlikli bitlerini temsil ederken, dg2 ve d3 LSB (Least Significant Bit) düşük değerlikli bitleri gösterir.

for (i=0;i<10;i++) {
 c[i]=b%10;  //(b MOD 10), c[i] = kalan
 b=b-c[i];   //(b - kalan),
 b=b/10;     //(b DIV 10)
}

Süleyman'nın verdiği kodlar, anladığım kadarıyla satırların yanlarına yazdığım komutları işletiyor. Şöyle bir göz ucuyla bakınca doğru olduğu anlaşılıyor. Ancak önemli bir not; bellekten tassarruf etmek için for (i=0;i<=9;i++) şeklinde döngüye başlamakta ve diziyi 8 bitlik tanımlamakta fayda var. Çünkü dizi değişkenleri sıfır